This is an automated email from the ASF dual-hosted git repository.

msciabarra pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/openserverless-cli.git

commit dd6ae4ba5f417eec64c8c7b1db7a418a082c38f3
Author: Michele Sciabarra <[email protected]>
AuthorDate: Mon Jul 22 10:40:52 2024 +0200

    task deps fixed and old utils removed
---
 TODO.txt               |  20 +-
 Taskfile.yml           |  42 ++--
 build.sh               |  22 --
 go.mod                 | 107 +--------
 go.sum                 | 641 +------------------------------------------------
 task.go                |   2 +-
 tools/deploy.go        | 510 ---------------------------------------
 tools/deploy_test.go   | 245 -------------------
 tools/js.go            |  55 -----
 tools/mkdirs.go        |  67 ------
 tools/realpath.go      |  72 ------
 tools/scan.go          | 283 ----------------------
 tools/scan_test.go     | 256 --------------------
 tools/tools.go         |  44 +---
 tools/util.go          |  73 ------
 tools/wsk.go           |   5 +-
 tools/zipf.go          | 250 -------------------
 tools/zipf_test.go     |  61 -----
 validate/Taskfile.yaml | 116 ---------
 validate/validate.sh   |  42 ----
 20 files changed, 51 insertions(+), 2862 deletions(-)

diff --git a/TODO.txt b/TODO.txt
index 0a4850d..069b826 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,18 +1,18 @@
-- recompile
+* recompile
+* upgrade task and sh
+- udpdate wsk and task
 
-- upgrade task and sh
-
-rm -Rvf sh task
-git submodule update --init --recursive
-cd task
-git remote add upstream https://github.com/go-task/task
-git fetch --all
-git rebase v3.38.0
+- remove old stuff
+js (goja&c)
+mkdir
+realpath
+zipf
+deploy
+someutils
 
 
 - apply diff one by one to sh and task
 
-- use coreutils and remove someutils
 - run tests and subtests
 
 - move everything in the ops package and add cmd/ops/main.go
diff --git a/Taskfile.yml b/Taskfile.yml
index 0fb8810..5d41f6a 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -19,61 +19,49 @@ version: "3"
 
 vars:
   BRANCH: main
-  BASEVER: "0.1-dev"
+  BASEVER: "0.1-snapshot"
   VERSION:
     sh: git describe --tags --abbrev=0 2>/dev/null || git rev-parse --short 
HEAD
-  S: ""
   DEBUG: ""
 
 tasks:
-  default:
-    - task -l
-
-
-  cli-ver:
-    - task: update-runtimes
-    - git tag -d $(git tag)
-    - git tag -f {{.BASEVER}}.$(date +%y%m%d%H%M){{.S}}
-    - git tag
 
+  default: task -l
   setup: { silent:true }
 
-  update-runtimes:
+  cli-tag:
+    desc: tag the cli to generate the build
     - >
       curl -sL 
https://raw.githubusercontent.com/apache/openserverless-task/{{.BRANCH}}/runtimes.json
 
       | jq '{"runtimes": .runtimes}' >runtimes.json
-    - |
-      if ! git diff --exit-code runtimes.json 
-      then git add runtimes.json
-           git commit -m "update runtimes"
-      fi
+    - git add runtimes.json
+    - git tag -d $(git tag)
+    - git tag -f {{.BASEVER}}.$(date +%y%m%d%H%M){{.S}}
+    - git tag
+
 
   build:
-    desc: build nuv locally
-    cmds:
-      - task: update-runtimes
-      - go build {{.DEBUG}} -ldflags "-X main.NuvVersion={{.VERSION}} -X 
main.NuvBranch={{.BRANCH}}"  -o bin/nuv
+    desc: build ops locally
+      - go build {{.DEBUG}} -ldflags "-X main.NuvVersion={{.VERSION}} -X 
main.NuvBranch={{.BASEVER}}"  -o bin/nuv
     sources:
       - "*.go"
       - "tools/*.go"
     generates:
-      - bin/nuv
+      - ops
 
   debug:
     cmds:
       - task: build
         vars:
           DEBUG: "-gcflags '-l -N'"
-      - dlv exec ./bin/nuv -- {{.CLI_ARGS}}
+      - dlv exec ./ops -- {{.CLI_ARGS}}
 
   install:
-    desc: install nuv using a local folder for binaries
+    desc: install ops in usr/local/bin
     deps:
       - build
-    dir: bin
     cmds:
-      - ./nuv getall
-      - sudo rm -f /usr/bin/nuv /usr/local/bin/nuv
+      - sudo cp ops /usr/local/bin
       - sudo ln -sf $PWD/{{OS}}/{{ARCH}}/nuv /usr/local/bin/nuv
       - sudo ln -sf $PWD/{{OS}}/{{ARCH}}/nuv /usr/bin/nuv
 
diff --git a/build.sh b/build.sh
deleted file mode 100755
index f0c64b4..0000000
--- a/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-go build -o bin/nuv
-cd bin
-cp nuv nuv.exe
-./nuv build
diff --git a/go.mod b/go.mod
index 8b11bf3..27b5af3 100644
--- a/go.mod
+++ b/go.mod
@@ -5,121 +5,40 @@ go 1.21.0
 toolchain go1.21.11
 
 require (
-       github.com/apache/openwhisk-client-go v0.0.0-20230421081559-13fc65f65684
        github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
        github.com/go-git/go-git/v5 v5.9.0
-       github.com/go-task/task/v3 v3.38.0
        github.com/itchyny/gojq v0.12.13
        github.com/mitchellh/go-homedir v1.1.0
        github.com/nicksnyder/go-i18n v1.10.1
        github.com/nuvolaris/envsubst/cmd/envsubstmain 
v0.0.0-20230603163828-10ca029cdb58
        github.com/nuvolaris/goawk v1.21.1-0.20230314201833-d0931fd55c2c
-       github.com/nuvolaris/goja/gojamain v0.0.0-20231014103102-50b9dd76d9a9
-       github.com/nuvolaris/gron v0.0.0-20231020134423-84e679ea6aad
-       github.com/nuvolaris/someutils v0.0.0-20230406090008-39e94b70e1ae
-       github.com/nuvolaris/task/v3 v3.30.2-nuv.2309151614
        github.com/stretchr/testify v1.9.0
-       mvdan.cc/sh/v3 v3.8.0
 )
 
 require (
        github.com/Ladicle/tabwriter v1.0.0 // indirect
+       github.com/Masterminds/semver/v3 v3.2.1 // indirect
        github.com/alecthomas/chroma/v2 v2.14.0 // indirect
+       github.com/davecgh/go-spew v1.1.1 // indirect
+       github.com/dlclark/regexp2 v1.11.0 // indirect
        github.com/dominikbraun/graph v0.23.0 // indirect
+       github.com/fatih/color v1.17.0 // indirect
        github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
        github.com/go-task/template v0.0.0-20240602015157-960e6f576656 // 
indirect
-)
-
-require (
-       dario.cat/mergo v1.0.0 // indirect
-       github.com/Masterminds/semver/v3 v3.2.1 // indirect
-       github.com/Masterminds/sprig v2.22.0+incompatible // indirect
-       github.com/cyphar/filepath-securejoin v0.2.4 // indirect
-       github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // 
indirect
-       github.com/jessevdk/go-flags v1.5.0 // indirect
-       github.com/klauspost/cpuid/v2 v2.2.5 // indirect
-       github.com/mitchellh/copystructure v1.2.0 // indirect
-       github.com/mitchellh/reflectwalk v1.0.2 // indirect
-       github.com/nuvolaris/goja v0.0.0-20231014102242-ba65db3f805b // indirect
-       github.com/nuvolaris/goja_nodejs v0.0.0-20231014102937-c453e3fed097 // 
indirect
-       github.com/nuvolaris/openwhisk-cli/commands 
v0.0.0-20240322185850-dd1d7107d5b6
-       github.com/nuvolaris/openwhisk-cli/wski18n 
v0.0.0-20240322185850-dd1d7107d5b6
-       github.com/nuvolaris/sh/v3 v3.7.1-nuv.2309151614 // indirect
-       github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5 // 
indirect
-       github.com/pkg/errors v0.9.1 // indirect
-       github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // 
indirect
-       github.com/remeh/sizedwaitgroup v1.0.0 // indirect
-       github.com/tidwall/gjson v1.14.0 // indirect
-       github.com/tidwall/match v1.1.1 // indirect
-       github.com/tidwall/pretty v1.2.0 // indirect
-       github.com/tidwall/sjson v1.2.4 // indirect
-       github.com/zeebo/xxh3 v1.0.2 // indirect
-       golang.org/x/mod v0.14.0 // indirect
-       golang.org/x/tools v0.17.0 // indirect
-)
-
-require (
-       github.com/Masterminds/goutils v1.1.1 // indirect
-       github.com/Masterminds/semver v1.5.0
-       github.com/Microsoft/go-winio v0.6.1 // indirect
-       github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // 
indirect
-       github.com/a8m/envsubst v1.4.2 // indirect
-       github.com/acomagu/bufpipe v1.0.4 // indirect
-       github.com/alessio/shellescape v1.4.2 // indirect
-       github.com/cenkalti/backoff/v4 v4.2.1
-       github.com/cloudflare/circl v1.3.3 // indirect
-       github.com/cloudfoundry/jibber_jabber 
v0.0.0-20151120183258-bcc4c8345a21 // indirect
-       github.com/danieljoos/wincred v1.2.0 // indirect
-       github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // 
indirect
-       github.com/dlclark/regexp2 v1.11.0 // indirect
-       github.com/emirpasic/gods v1.18.1 // indirect
-       github.com/fatih/color v1.17.0 // indirect
-       github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect
-       github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
-       github.com/go-git/go-billy/v5 v5.5.0 // indirect
-       github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
-       github.com/go-task/slim-sprig v2.20.0+incompatible // indirect
-       github.com/godbus/dbus/v5 v5.1.0 // indirect
-       github.com/google/go-querystring v1.1.0 // indirect
-       github.com/google/pprof v0.0.0-20230912144702-c363fe2c2ed8 // indirect
-       github.com/google/uuid v1.3.1
-       github.com/h2non/filetype v1.1.3
-       github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f // 
indirect
-       github.com/huandu/xstrings v1.4.0 // indirect
-       github.com/imdario/mergo v0.3.16 // indirect
-       github.com/inconshreveable/mousetrap v1.1.0 // indirect
-       github.com/itchyny/timefmt-go v0.1.5 // indirect
-       github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // 
indirect
        github.com/joho/godotenv v1.5.1 // indirect
-       github.com/kevinburke/ssh_config v1.2.0 // indirect
-       github.com/laher/uggo v0.0.0-20140418102112-0ad25fe11c5b // indirect
+       github.com/klauspost/cpuid/v2 v2.0.9 // indirect
        github.com/mattn/go-colorable v0.1.13 // indirect
-       github.com/mattn/go-isatty v0.0.20
-       github.com/mattn/go-runewidth v0.0.15 // indirect
+       github.com/mattn/go-isatty v0.0.20 // indirect
        github.com/mattn/go-zglob v0.0.4 // indirect
        github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
-       github.com/nuvolaris/go-replace v0.0.0-20230515190028-12766da1824c
-       github.com/nuvolaris/jj v0.0.0-20231020143327-10b90948a5d2
-       github.com/pelletier/go-toml v1.9.5 // indirect
-       github.com/pjbgf/sha1cd v0.3.0 // indirect
-       github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8
-       github.com/radovskyb/watcher v1.0.7
-       github.com/rivo/uniseg v0.4.4 // indirect
+       github.com/radovskyb/watcher v1.0.7 // indirect
        github.com/sajari/fuzzy v1.0.0 // indirect
-       github.com/sergi/go-diff v1.3.1 // indirect
-       github.com/skeema/knownhosts v1.2.0 // indirect
-       github.com/spf13/cobra v1.7.0 // indirect
-       github.com/spf13/pflag v1.0.5
-       github.com/xanzy/ssh-agent v0.3.3 // indirect
-       github.com/zalando/go-keyring v0.2.3
-       golang.org/x/crypto v0.18.0 // indirect
-       golang.org/x/exp v0.0.0-20230905200255-921286631fa9
-       golang.org/x/net v0.20.0 // indirect
+       github.com/sciabarracom/sh/v3 v3.8.1-0.20240719132627-8b997d445efa // 
indirect
+       github.com/sciabarracom/task/v3 v3.38.1-0.20240719132837-9f75ee2eb9d9 
// indirect
+       github.com/spf13/pflag v1.0.5 // indirect
+       github.com/zeebo/xxh3 v1.0.2 // indirect
        golang.org/x/sync v0.7.0 // indirect
        golang.org/x/sys v0.21.0 // indirect
-       golang.org/x/term v0.21.0
-       golang.org/x/text v0.14.0 // indirect
-       gopkg.in/warnings.v0 v0.1.2 // indirect
-       gopkg.in/yaml.v2 v2.4.0 // indirect
-       gopkg.in/yaml.v3 v3.0.1
+       golang.org/x/term v0.21.0 // indirect
+       gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index 2dc68e5..0be5594 100644
--- a/go.sum
+++ b/go.sum
@@ -1,691 +1,64 @@
-cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod 
h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod 
h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod 
h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod 
h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod 
h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go/bigquery v1.0.1/go.mod 
h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/datastore v1.0.0/go.mod 
h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/firestore v1.1.0/go.mod 
h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
-cloud.google.com/go/pubsub v1.0.1/go.mod 
h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/storage v1.0.0/go.mod 
h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
-dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod 
h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod 
h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/Ladicle/tabwriter v1.0.0 
h1:DZQqPvMumBDwVNElso13afjYLNp0Z7pHqHnu0r4t9Dg=
 github.com/Ladicle/tabwriter v1.0.0/go.mod 
h1:c4MdCjxQyTbGuQO/gvqJ+IA/89UEwrsD6hUCW98dyp4=
-github.com/Masterminds/goutils v1.1.1 
h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
-github.com/Masterminds/goutils v1.1.1/go.mod 
h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
-github.com/Masterminds/semver v1.5.0 
h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
-github.com/Masterminds/semver v1.5.0/go.mod 
h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 github.com/Masterminds/semver/v3 v3.2.1 
h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
 github.com/Masterminds/semver/v3 v3.2.1/go.mod 
h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
-github.com/Masterminds/sprig v2.22.0+incompatible 
h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
-github.com/Masterminds/sprig v2.22.0+incompatible/go.mod 
h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Microsoft/go-winio v0.5.2/go.mod 
h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
-github.com/Microsoft/go-winio v0.6.1 
h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
-github.com/Microsoft/go-winio v0.6.1/go.mod 
h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/OneOfOne/xxhash v1.2.2/go.mod 
h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 
h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg=
-github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod 
h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
-github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg=
-github.com/a8m/envsubst v1.4.2/go.mod 
h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY=
-github.com/acomagu/bufpipe v1.0.4 
h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
-github.com/acomagu/bufpipe v1.0.4/go.mod 
h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
-github.com/alecthomas/assert/v2 v2.7.0 
h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
-github.com/alecthomas/assert/v2 v2.7.0/go.mod 
h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
 github.com/alecthomas/chroma/v2 v2.14.0 
h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E=
 github.com/alecthomas/chroma/v2 v2.14.0/go.mod 
h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
-github.com/alecthomas/repr v0.4.0 
h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
-github.com/alecthomas/repr v0.4.0/go.mod 
h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod 
h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod 
h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/alessio/shellescape v1.4.2 
h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4uEoM0=
-github.com/alessio/shellescape v1.4.2/go.mod 
h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
-github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be 
h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
-github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod 
h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
-github.com/apache/openwhisk-client-go 
v0.0.0-20220811044404-a6921af2f086/go.mod 
h1:SAQU4bHGJ0sg6c1vQ8ojmQKXgGaneVnexWX4+2/KMr8=
-github.com/apache/openwhisk-client-go v0.0.0-20230421081559-13fc65f65684 
h1:HXPx8GrCpQq7BtoCoyDjMcMLrBowaAyMai7+TuIMzFQ=
-github.com/apache/openwhisk-client-go 
v0.0.0-20230421081559-13fc65f65684/go.mod 
h1:SAQU4bHGJ0sg6c1vQ8ojmQKXgGaneVnexWX4+2/KMr8=
-github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod 
h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
-github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod 
h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod 
h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 
h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod 
h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod 
h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod 
h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/bgentry/speakeasy v0.1.0/go.mod 
h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod 
h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/bwesterb/go-ristretto v1.2.3/go.mod 
h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
-github.com/cenkalti/backoff/v4 v4.2.1 
h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
-github.com/cenkalti/backoff/v4 v4.2.1/go.mod 
h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
-github.com/cespare/xxhash v1.1.0/go.mod 
h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
-github.com/chzyer/logex v1.2.0/go.mod 
h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
-github.com/chzyer/readline v1.5.0/go.mod 
h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
-github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod 
h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.3.3 
h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
-github.com/cloudflare/circl v1.3.3/go.mod 
h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
-github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 
h1:tuijfIjZyjZaHq9xDUh0tNitwXshJpbLkqMOJv4H3do=
-github.com/cloudfoundry/jibber_jabber 
v0.0.0-20151120183258-bcc4c8345a21/go.mod 
h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc=
-github.com/coreos/bbolt v1.3.2/go.mod 
h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible/go.mod 
h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-semver v0.3.0/go.mod 
h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod 
h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod 
h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod 
h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod 
h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
-github.com/creack/pty v1.1.9/go.mod 
h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0=
-github.com/creack/pty v1.1.21/go.mod 
h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
-github.com/cyphar/filepath-securejoin v0.2.4 
h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod 
h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
-github.com/danieljoos/wincred v1.2.0 
h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
-github.com/danieljoos/wincred v1.2.0/go.mod 
h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
-github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 
h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc 
h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
-github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod 
h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod 
h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dlclark/regexp2 v1.7.0/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 github.com/dlclark/regexp2 v1.11.0 
h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
 github.com/dlclark/regexp2 v1.11.0/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
-github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 
h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod 
h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
 github.com/dominikbraun/graph v0.23.0 
h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo=
 github.com/dominikbraun/graph v0.23.0/go.mod 
h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a 
h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod 
h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
-github.com/emirpasic/gods v1.18.1 
h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
-github.com/emirpasic/gods v1.18.1/go.mod 
h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
-github.com/fatih/color v1.7.0/go.mod 
h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/fatih/color v1.10.0/go.mod 
h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
 github.com/fatih/color v1.17.0/go.mod 
h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
-github.com/frankban/quicktest v1.14.6 
h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
-github.com/frankban/quicktest v1.14.6/go.mod 
h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
-github.com/fsnotify/fsnotify v1.4.7/go.mod 
h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 
h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-github.com/fsnotify/fsnotify v1.4.9/go.mod 
h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/ghodss/yaml v1.0.0/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 
h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew=
-github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod 
h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
-github.com/gliderlabs/ssh v0.3.5 
h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
-github.com/gliderlabs/ssh v0.3.5/go.mod 
h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
-github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 
h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
-github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod 
h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.5.0 
h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod 
h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
-github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f 
h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
-github.com/go-git/go-git-fixtures/v4 
v4.3.2-0.20230305113008-0c11038e723f/go.mod 
h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
-github.com/go-git/go-git/v5 v5.9.0 
h1:cD9SFA7sHVRdJ7AYck1ZaAa/yeuBvGPxwXDL8cxrObY=
 github.com/go-git/go-git/v5 v5.9.0/go.mod 
h1:RKIqga24sWdMGZF+1Ekv9kylsDz6LzdTSI2s/OsZWE0=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod 
h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-kit/kit v0.8.0/go.mod 
h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod 
h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod 
h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-sourcemap/sourcemap v2.1.3+incompatible 
h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU=
-github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod 
h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
-github.com/go-stack/stack v1.8.0/go.mod 
h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v2.20.0+incompatible 
h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA=
-github.com/go-task/slim-sprig v2.20.0+incompatible/go.mod 
h1:N/mhXZITr/EQAOErEHciKvO1bFei2Lld2Ym6h96pdy0=
 github.com/go-task/slim-sprig/v3 v3.0.0 
h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
 github.com/go-task/slim-sprig/v3 v3.0.0/go.mod 
h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
-github.com/go-task/task/v3 v3.38.0 
h1:O7kgA6BfwktXHPrheByQO46p3teKtRuq1EpGnFxNzbo=
-github.com/go-task/task/v3 v3.38.0/go.mod 
h1:UzLDHoXTKNAtWwFP3WVsfMhlSw3K8i9KNzEO9kCHix8=
 github.com/go-task/template v0.0.0-20240602015157-960e6f576656 
h1:knZZ4zVdTBQnevBz0zSES++4Mr7wr+cHopLvHabIgkA=
 github.com/go-task/template v0.0.0-20240602015157-960e6f576656/go.mod 
h1:RgwRaZK+kni/hJJ7/AaOE2lPQFPbAdji/DyhC6pxo4k=
-github.com/godbus/dbus/v5 v5.1.0 
h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/go.mod 
h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gogo/protobuf v1.1.1/go.mod 
h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod 
h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da 
h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod 
h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.2/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod 
h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod 
h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-querystring v1.0.0/go.mod 
h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/go-querystring v1.1.0 
h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
-github.com/google/go-querystring v1.1.0/go.mod 
h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
-github.com/google/martian v2.1.0+incompatible/go.mod 
h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod 
h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod 
h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod 
h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg=
-github.com/google/pprof v0.0.0-20230912144702-c363fe2c2ed8 
h1:gpptm606MZYGaMHMsB4Srmb6EbW/IVHnt04rcMXnkBQ=
-github.com/google/pprof v0.0.0-20230912144702-c363fe2c2ed8/go.mod 
h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
-github.com/google/renameio v0.1.0/go.mod 
h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
-github.com/google/uuid v1.3.1/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod 
h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod 
h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod 
h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/websocket v1.4.2/go.mod 
h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod 
h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod 
h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod 
h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/h2non/filetype v1.1.3 
h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
-github.com/h2non/filetype v1.1.3/go.mod 
h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
-github.com/hashicorp/consul/api v1.1.0/go.mod 
h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/sdk v0.1.1/go.mod 
h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.0/go.mod 
h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-cleanhttp v0.5.1/go.mod 
h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-immutable-radix v1.0.0/go.mod 
h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
-github.com/hashicorp/go-msgpack v0.5.3/go.mod 
h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
-github.com/hashicorp/go-multierror v1.0.0/go.mod 
h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
-github.com/hashicorp/go-rootcerts v1.0.0/go.mod 
h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-github.com/hashicorp/go-sockaddr v1.0.0/go.mod 
h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
-github.com/hashicorp/go-syslog v1.0.0/go.mod 
h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
-github.com/hashicorp/go-uuid v1.0.0/go.mod 
h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/go.mod 
h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go.net v0.0.1/go.mod 
h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
-github.com/hashicorp/golang-lru v0.5.0/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod 
h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v1.0.0/go.mod 
h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/hashicorp/logutils v1.0.0/go.mod 
h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
-github.com/hashicorp/mdns v1.0.0/go.mod 
h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
-github.com/hashicorp/memberlist v0.1.3/go.mod 
h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2/go.mod 
h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hexops/gotextdiff v1.0.3 
h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
-github.com/hexops/gotextdiff v1.0.3/go.mod 
h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
-github.com/hokaccha/go-prettyjson v0.0.0-20210113012101-fb4e108d2519/go.mod 
h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
-github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f 
h1:7LYC+Yfkj3CTRcShK0KOL/w6iTiKyqqBA9a41Wnggw8=
-github.com/hokaccha/go-prettyjson v0.0.0-20211117102719-0474bc63780f/go.mod 
h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
-github.com/hpcloud/tail v1.0.0/go.mod 
h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/huandu/xstrings v1.4.0 
h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
-github.com/huandu/xstrings v1.4.0/go.mod 
h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod 
h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
-github.com/imdario/mergo v0.3.16 
h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
-github.com/imdario/mergo v0.3.16/go.mod 
h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod 
h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/inconshreveable/mousetrap v1.1.0 
h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
-github.com/inconshreveable/mousetrap v1.1.0/go.mod 
h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/itchyny/gojq v0.12.13 
h1:IxyYlHYIlspQHHTE0f3cJF0NKDMfajxViuhBLnHd/QU=
 github.com/itchyny/gojq v0.12.13/go.mod 
h1:JzwzAqenfhrPUuwbmEz3nu3JQmFLlQTQMUcOdnu/Sf4=
-github.com/itchyny/timefmt-go v0.1.5 
h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE=
-github.com/itchyny/timefmt-go v0.1.5/go.mod 
h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 
h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod 
h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.5.0 
h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
-github.com/jessevdk/go-flags v1.5.0/go.mod 
h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
 github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
 github.com/joho/godotenv v1.5.1/go.mod 
h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
-github.com/jonboulle/clockwork v0.1.0/go.mod 
h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/json-iterator/go v1.1.6/go.mod 
h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod 
h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod 
h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod 
h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kevinburke/ssh_config v1.2.0 
h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
-github.com/kevinburke/ssh_config v1.2.0/go.mod 
h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/kisielk/errcheck v1.1.0/go.mod 
h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
-github.com/kisielk/gotool v1.0.0/go.mod 
h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/cpuid/v2 v2.2.5 
h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
-github.com/klauspost/cpuid/v2 v2.2.5/go.mod 
h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod 
h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod 
h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0/go.mod 
h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
-github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
-github.com/kr/pretty v0.3.1/go.mod 
h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
-github.com/kr/text v0.2.0/go.mod 
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/laher/uggo v0.0.0-20140418102112-0ad25fe11c5b 
h1:hiAgMroreX8L9Gm2SsTdv9ApADQPShh9D3Di9xpp2Kg=
-github.com/laher/uggo v0.0.0-20140418102112-0ad25fe11c5b/go.mod 
h1:WytauZxw3kbZhQVPJN2INZlGCNCKWn3iy4VqJvNo2pI=
-github.com/magiconair/properties v1.8.1/go.mod 
h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/magiconair/properties v1.8.4/go.mod 
h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
-github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
-github.com/matryer/is v1.2.0/go.mod 
h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
-github.com/mattn/go-colorable v0.0.9/go.mod 
h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.1.8/go.mod 
h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/klauspost/cpuid/v2 v2.0.9 
h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod 
h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/mattn/go-colorable v0.1.13 
h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 github.com/mattn/go-colorable v0.1.13/go.mod 
h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.3/go.mod 
h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.4/go.mod 
h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.12/go.mod 
h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.16/go.mod 
h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-isatty v0.0.20 
h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod 
h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-runewidth v0.0.15 
h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
-github.com/mattn/go-runewidth v0.0.15/go.mod 
h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-zglob v0.0.4 
h1:LQi2iOm0/fGgu80AioIJ/1j9w9Oh+9DZ39J4VAGzHQM=
 github.com/mattn/go-zglob v0.0.4/go.mod 
h1:MxxjyoXXnMxfIpxTK2GAkw1w8glPsQILx3N5wrKakiY=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod 
h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/miekg/dns v1.0.14/go.mod 
h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/mitchellh/cli v1.0.0/go.mod 
h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/copystructure v1.2.0 
h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
-github.com/mitchellh/copystructure v1.2.0/go.mod 
h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
-github.com/mitchellh/go-homedir v1.0.0/go.mod 
h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-homedir v1.1.0 
h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod 
h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod 
h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/gox v0.4.0/go.mod 
h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
 github.com/mitchellh/hashstructure/v2 v2.0.2 
h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
 github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod 
h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE=
-github.com/mitchellh/iochan v1.0.0/go.mod 
h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
-github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod 
h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.1.2/go.mod 
h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.4.1/go.mod 
h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/reflectwalk v1.0.2 
h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
-github.com/mitchellh/reflectwalk v1.0.2/go.mod 
h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod 
h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.1/go.mod 
h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod 
h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/nicksnyder/go-i18n v1.10.1 
h1:isfg77E/aCD7+0lD/D00ebR2MV5vgeQ276WYyDaCRQc=
 github.com/nicksnyder/go-i18n v1.10.1/go.mod 
h1:e4Di5xjP9oTVrC6y3C7C0HoSYXjSbhh/dU0eUV32nB4=
-github.com/nuvolaris/envsubst/cmd/envsubstmain 
v0.0.0-20230603163828-10ca029cdb58 
h1:/6bwyZSQx3Q+Gl/02wTw6tonDzQRXOSeQSyzjrM8/VY=
 github.com/nuvolaris/envsubst/cmd/envsubstmain 
v0.0.0-20230603163828-10ca029cdb58/go.mod 
h1:scN6eGT0YjABIs2bLh+CfWdOFZgmkefhv0pA9RBCEaM=
-github.com/nuvolaris/go-replace v0.0.0-20230515190028-12766da1824c 
h1:t8yjSIjJBa2EX6DHOnwzf0fBycFNXYyy4H44zvdAXtc=
-github.com/nuvolaris/go-replace v0.0.0-20230515190028-12766da1824c/go.mod 
h1:kFS/W+mpp+bqCLVdldEq2EMZa0YttGz+QEHE+0HXags=
-github.com/nuvolaris/goawk v1.21.1-0.20230314201833-d0931fd55c2c 
h1:L9HLHEk9rLllwSYyzg8fu7ScPfCX773sWu55TzavywQ=
 github.com/nuvolaris/goawk v1.21.1-0.20230314201833-d0931fd55c2c/go.mod 
h1:/9Rq7gSfPOW2G7aq2Rii4kbNl9o3GJSGvBjikGMs74I=
-github.com/nuvolaris/goja v0.0.0-20230527133949-2939724446aa/go.mod 
h1:g4ZsIVZINTllHjERZs7Ys/5dVuxuJSbio9d9zwHQK6U=
-github.com/nuvolaris/goja v0.0.0-20230825100449-967811910c6d/go.mod 
h1:dA/ZvN0NzL92yvJaKW5XKWNVKJCzgD8Dm+tUWRMUIEQ=
-github.com/nuvolaris/goja v0.0.0-20231014102242-ba65db3f805b 
h1:SIyOXKeBgPPsZIXXZhUkWhNCJsSnnaC2196oVjMufFo=
-github.com/nuvolaris/goja v0.0.0-20231014102242-ba65db3f805b/go.mod 
h1:0X/rEcYXw/QtEGpDouhr05xYz9OXH+BV/31Zuj7jnPk=
-github.com/nuvolaris/goja/gojamain v0.0.0-20231014103102-50b9dd76d9a9 
h1:UsPQF+5D/VZfGftdzRlaOqLvCBRE0mnNe5BnmZs2I5o=
-github.com/nuvolaris/goja/gojamain v0.0.0-20231014103102-50b9dd76d9a9/go.mod 
h1:pi8nHIKxRrxvKDsAIR6yUxAudHZu3gKLkZE2sCG/HCE=
-github.com/nuvolaris/goja_nodejs v0.0.0-20230527135110-3aa37178bb6c/go.mod 
h1:3j67oDWJ3d1Zut6OfpmPuBwDH+L2bzyWCeYqvGMAi20=
-github.com/nuvolaris/goja_nodejs v0.0.0-20230826135643-676d5429636c/go.mod 
h1:bik1pvnsEagEp/uCTjjKUHVWPyuy53ETukJZVuaSG2U=
-github.com/nuvolaris/goja_nodejs v0.0.0-20231014102937-c453e3fed097 
h1:cHspcFB5uEQvORg1yE/+TK7n2OTgIjlSEr5FW41KWxE=
-github.com/nuvolaris/goja_nodejs v0.0.0-20231014102937-c453e3fed097/go.mod 
h1:bik1pvnsEagEp/uCTjjKUHVWPyuy53ETukJZVuaSG2U=
-github.com/nuvolaris/gron v0.0.0-20231020134423-84e679ea6aad 
h1:HM0XUN8Euf/cougdYRNlga/dZUIi0TiI931IbqxzoRk=
-github.com/nuvolaris/gron v0.0.0-20231020134423-84e679ea6aad/go.mod 
h1:5Hm1DZ5jqgtsL9ZjkS7ucgNX1ho6ZBt3uQVZG21OGV8=
-github.com/nuvolaris/jj v0.0.0-20231020143327-10b90948a5d2 
h1:Ak5YABP9NDvXG/jFxnshxUd1AwUe494gEpzRUSFcbYc=
-github.com/nuvolaris/jj v0.0.0-20231020143327-10b90948a5d2/go.mod 
h1:oSVih0wbKnbe39U7qzSrwEiNGrWLlIyqrUY+qz9ZIQY=
-github.com/nuvolaris/openwhisk-cli/commands v0.0.0-20240322185850-dd1d7107d5b6 
h1:O0iVYcww+EQZVrBdjECS4/wlFoD6fOKSWmwuQm4TcGw=
-github.com/nuvolaris/openwhisk-cli/commands 
v0.0.0-20240322185850-dd1d7107d5b6/go.mod 
h1:aXJusnuxBX3WRX7aLrFPInwOrhAS31reOm+bHPYaDIs=
-github.com/nuvolaris/openwhisk-cli/wski18n v0.0.0-20240322185850-dd1d7107d5b6 
h1:GEJ1MNUb/NGQyYwDDe7ovhMXTY5gLmjmYludmnat9FM=
-github.com/nuvolaris/openwhisk-cli/wski18n 
v0.0.0-20240322185850-dd1d7107d5b6/go.mod 
h1:x57w2QArhPOdDEibanGlaQlYA/1PP4RNe5e21b+R9XA=
-github.com/nuvolaris/openwhisk-wskdeploy v0.0.0-20230916104531-c4bc982185e9 
h1:CXCPlchX/Dq2BzaiuGnK9t2wR5z5UWQJF0IHcfIyxac=
-github.com/nuvolaris/openwhisk-wskdeploy 
v0.0.0-20230916104531-c4bc982185e9/go.mod 
h1:Rx9BGhPmwoWToPAVFr/12P3W0JRYlxCH/xzCz6NeOQo=
-github.com/nuvolaris/sh/v3 v3.7.1-nuv.2309151614 
h1:euD81WMIiFpBUfEUw7S8ODZ65zNwaM75dGUiyCK9+20=
-github.com/nuvolaris/sh/v3 v3.7.1-nuv.2309151614/go.mod 
h1:DcwU5rXy89zU8ppNuTaSvGxX2T0lW3RjUqboNuVyT7o=
-github.com/nuvolaris/someutils v0.0.0-20230406090008-39e94b70e1ae 
h1:r/98Ma2fvAFYBEQC2OqKsD4tI7r75N7YzhWv2ievhRA=
-github.com/nuvolaris/someutils v0.0.0-20230406090008-39e94b70e1ae/go.mod 
h1:27LYTtM+ymckYJ+I+C5Tg6/ir+QyBQZVNN6TvlNQ1zA=
-github.com/nuvolaris/task/v3 v3.30.2-nuv.2309151614 
h1:zwuGDvIpuzvGvFJCMPeCmt7cUqgTSSwkZFnQRDM+Bi4=
-github.com/nuvolaris/task/v3 v3.30.2-nuv.2309151614/go.mod 
h1:jq1DGrJssGJpZF7acN3Taem7Hizry9BXMV+BLoSeFi4=
-github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5 
h1:d+C3xJdxZT7wNlxqEwbXn3R355CwAhYBL9raVNfSnK0=
-github.com/nwidger/jsoncolor v0.0.0-20170215171346-75a6de4340e5/go.mod 
h1:GYFm0zZgTNeoK1QxuIofRDasy2ibmaJZhZLzwsMXUF4=
-github.com/nxadm/tail v1.4.4/go.mod 
h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-github.com/nxadm/tail v1.4.8/go.mod 
h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/oklog/ulid v1.3.1/go.mod 
h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/onsi/ginkgo v1.6.0/go.mod 
h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.1/go.mod 
h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.15.0/go.mod 
h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
-github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo v1.16.5/go.mod 
h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/gomega v1.7.1/go.mod 
h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod 
h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.10.5/go.mod 
h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
-github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
-github.com/onsi/gomega v1.27.10/go.mod 
h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod 
h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.2.0/go.mod 
h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.8.1/go.mod 
h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
-github.com/pelletier/go-toml v1.9.5 
h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
-github.com/pelletier/go-toml v1.9.5/go.mod 
h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
-github.com/pjbgf/sha1cd v0.3.0/go.mod 
h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
-github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 
h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
-github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod 
h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
-github.com/pkg/errors v0.8.0/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
-github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.10.1/go.mod 
h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 
h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
-github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1/go.mod 
h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/prometheus/client_golang v0.9.1/go.mod 
h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3/go.mod 
h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod 
h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod 
h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0/go.mod 
h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod 
h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod 
h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/tsdb v0.7.1/go.mod 
h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/radovskyb/watcher v1.0.7 
h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE=
 github.com/radovskyb/watcher v1.0.7/go.mod 
h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
-github.com/remeh/sizedwaitgroup v1.0.0 
h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7Kyl5E=
-github.com/remeh/sizedwaitgroup v1.0.0/go.mod 
h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo=
-github.com/rivo/uniseg v0.2.0/go.mod 
h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
-github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
-github.com/rivo/uniseg v0.4.4/go.mod 
h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod 
h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/rogpeppe/go-internal v1.3.0/go.mod 
h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod 
h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.12.0 
h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
-github.com/rogpeppe/go-internal v1.12.0/go.mod 
h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod 
h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/sajari/fuzzy v1.0.0 h1:+FmwVvJErsd0d0hAPlj4CxqxUtQY/fOoY0DwX4ykpRY=
 github.com/sajari/fuzzy v1.0.0/go.mod 
h1:OjYR6KxoWOe9+dOlXeiCJd4dIbED4Oo8wpS89o0pwOo=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod 
h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
-github.com/sergi/go-diff v1.3.1/go.mod 
h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod 
h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sirupsen/logrus v1.2.0/go.mod 
h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.7.0/go.mod 
h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/skeema/knownhosts v1.2.0 
h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM=
-github.com/skeema/knownhosts v1.2.0/go.mod 
h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod 
h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4/go.mod 
h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4/go.mod 
h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod 
h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod 
h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.5.1/go.mod 
h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0/go.mod 
h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1/go.mod 
h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.1.3/go.mod 
h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
-github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
-github.com/spf13/cobra v1.7.0/go.mod 
h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod 
h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/jwalterweatherman v1.1.0/go.mod 
h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v1.0.3/go.mod 
h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/sciabarracom/sh/v3 v3.8.1-0.20240719132627-8b997d445efa 
h1:RjRrFB6D7FBeEejUWMhW7DzgvK56W7BeCeJbPzbPfgc=
+github.com/sciabarracom/sh/v3 v3.8.1-0.20240719132627-8b997d445efa/go.mod 
h1:CeMVr3PRLhlUrS+VPLTp8dS5/6xNzmmX0h/WVHRR6DA=
+github.com/sciabarracom/task/v3 v3.38.1-0.20240719132837-9f75ee2eb9d9 
h1:K7t33j3GcsrmEt1IY7AauJLk4WqdFwnySnshyKNOOCU=
+github.com/sciabarracom/task/v3 v3.38.1-0.20240719132837-9f75ee2eb9d9/go.mod 
h1:EKgm7X+Z2VMiSBz17FWJq7C653d+hac/5+utpMDO+EE=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.7.0/go.mod 
h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/spf13/viper v1.7.1/go.mod 
h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.3.0/go.mod 
h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
-github.com/stretchr/objx v0.5.2/go.mod 
h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
-github.com/stretchr/testify v1.2.2/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0/go.mod 
h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.9.0 
h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 github.com/stretchr/testify v1.9.0/go.mod 
h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
-github.com/subosito/gotenv v1.2.0/go.mod 
h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tidwall/gjson v1.12.1/go.mod 
h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
-github.com/tidwall/gjson v1.14.0 
h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w=
-github.com/tidwall/gjson v1.14.0/go.mod 
h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
-github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
-github.com/tidwall/match v1.1.1/go.mod 
h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
-github.com/tidwall/pretty v1.2.0 
h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
-github.com/tidwall/pretty v1.2.0/go.mod 
h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
-github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc=
-github.com/tidwall/sjson v1.2.4/go.mod 
h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod 
h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/xanzy/ssh-agent v0.3.3 
h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
-github.com/xanzy/ssh-agent v0.3.3/go.mod 
h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod 
h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/zalando/go-keyring v0.2.3 
h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
-github.com/zalando/go-keyring v0.2.3/go.mod 
h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
-github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
-github.com/zeebo/assert v1.3.0/go.mod 
h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
 github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
 github.com/zeebo/xxh3 v1.0.2/go.mod 
h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.uber.org/atomic v1.4.0/go.mod 
h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0/go.mod 
h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod 
h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod 
h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod 
h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.7.0/go.mod 
h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
-golang.org/x/crypto v0.18.0/go.mod 
h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod 
h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod 
h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod 
h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20230905200255-921286631fa9 
h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
-golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod 
h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod 
h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod 
h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod 
h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod 
h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod 
h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod 
h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
-golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210304203436-1243437a8ec7/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
 golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
 golang.org/x/term v0.21.0/go.mod 
h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod 
h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod 
h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod 
h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod 
h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod 
h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod 
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
-golang.org/x/tools v0.17.0/go.mod 
h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.4.0/go.mod 
h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod 
h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod 
h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod 
h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod 
h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod 
h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod 
h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod 
h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod 
h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1/go.mod 
h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1/go.mod 
h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod 
h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c 
h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
-gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod 
h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod 
h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/resty.v1 v1.12.0/go.mod 
h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 
h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod 
h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
-gopkg.in/warnings.v0 v0.1.2/go.mod 
h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod 
h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod 
h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-mvdan.cc/sh/v3 v3.8.0 h1:ZxuJipLZwr/HLbASonmXtcvvC9HXY9d2lXZHnKGjFc8=
-mvdan.cc/sh/v3 v3.8.0/go.mod h1:w04623xkgBVo7/IUK89E0g8hBykgEpN0vgOj3RJr6MY=
-rsc.io/binaryregexp v0.2.0/go.mod 
h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/task.go b/task.go
index e8aec03..58dd17f 100644
--- a/task.go
+++ b/task.go
@@ -21,7 +21,7 @@ import (
        "os"
        "path"
 
-       "github.com/nuvolaris/task/v3/cmd/taskmain"
+       "github.com/sciabarracom/task/v3/cmd/taskmain"
 )
 
 var taskDryRun = false
diff --git a/tools/deploy.go b/tools/deploy.go
deleted file mode 100644
index 39ed655..0000000
--- a/tools/deploy.go
+++ /dev/null
@@ -1,510 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "bufio"
-       "flag"
-       "fmt"
-       "log"
-       "os"
-       "os/exec"
-       "path/filepath"
-       "strings"
-       "time"
-
-       "github.com/mitchellh/go-homedir"
-       "github.com/radovskyb/watcher"
-)
-
-type deployCtx struct {
-       path               string
-       dryRun             bool
-       packageCmdExecuted map[string]bool
-}
-
-func DeployTool() error {
-       flag := flag.NewFlagSet("deploy", flag.ExitOnError)
-       flag.Usage = func() {
-               fmt.Println(`Command to deploy Nuvolaris projects. Must be 
given the path of a valid project (containing 'packages').
-
-Usage:
-       nuv -deploy [-s <string> | --single <string>] [-d | --dry-run] <path> 
-       nuv -deploy [-w | --watch] [-d | --dry-run] <path> 
-
-Options:
-       -s, --single <string>     Deploy a single action with the given path, 
either a single file or a directory.
-       -w, --watch     Watch for changes and deploy automatically.
-       -d, --dry-run   Do not deploy, just print the deployment plan.
-       -h, --help      Show this help message.`)
-       }
-
-       var watchFlag bool
-       var singleFlag string
-       var helpFlag bool
-       var dryRunFlag bool
-       flag.StringVar(&singleFlag, "s", "", "Deploy a single action with the 
given path, either a single file or a directory.")
-       flag.StringVar(&singleFlag, "single", "", "Deploy a single action with 
the given path, either a single file or a directory.")
-       flag.BoolVar(&helpFlag, "h", false, "Show this help message")
-       flag.BoolVar(&helpFlag, "help", false, "Show this help message")
-       flag.BoolVar(&dryRunFlag, "d", false, "Do not deploy, just print the 
deployment plan.")
-       flag.BoolVar(&dryRunFlag, "dry-run", false, "Do not deploy, just print 
the deployment plan.")
-       flag.BoolVar(&watchFlag, "w", false, "Watch for changes and deploy 
automatically.")
-       flag.BoolVar(&watchFlag, "watch", false, "Watch for changes and deploy 
automatically.")
-
-       // Parse command line flags
-       err := flag.Parse(os.Args[2:])
-       if err != nil {
-               return err
-       }
-
-       if flag.NArg() != 1 || helpFlag {
-               flag.Usage()
-               return nil
-       }
-
-       path, err := homedir.Expand(flag.Arg(0))
-       if err != nil {
-               return err
-       }
-
-       var absPath string
-       if filepath.IsLocal(path) {
-               absPath = filepath.Join(os.Getenv("NUV_PWD"), path)
-       } else {
-               absPath = path
-       }
-
-       os.Setenv("NUV_PWD", absPath)
-
-       ctx := deployCtx{
-               path:               os.Getenv("NUV_PWD"),
-               packageCmdExecuted: make(map[string]bool),
-               dryRun:             dryRunFlag,
-       }
-
-       // if there is not "packages" folder from where deploy was called, abort
-       if !exists(filepath.Join(ctx.path, "packages")) {
-               return fmt.Errorf("no 'packages' folder found in the current 
directory")
-       }
-
-       if singleFlag != "" {
-               action := singleFlag
-               if !strings.HasPrefix(action, "packages") {
-                       action = filepath.Join("packages", action)
-                       if !exists(filepath.Join(ctx.path, action)) {
-                               return fmt.Errorf("action %s not found: must be 
either a file or a directory under packages", action)
-                       }
-               }
-               return deploy(ctx, action)
-       }
-
-       if watchFlag {
-               err = scan(ctx)
-               if err != nil {
-                       return err
-               }
-
-               err = watch(ctx)
-               return err
-       }
-
-       err = scan(ctx)
-       if err != nil {
-               return err
-       }
-
-       return nil
-}
-
-var supportedMains = []string{"__main__.py", "index.js", "main.js", "main.go"}
-
-func deploy(ctx deployCtx, actionPath string) error {
-       fullPath := filepath.Join(ctx.path, actionPath)
-       if !exists(fullPath) {
-               return fmt.Errorf("action %s not found: must be either a file 
or a directory", actionPath)
-       }
-       log.Println("***", filepath.Base(actionPath))
-
-       action, err := checkActionDir(ctx.path, actionPath)
-       if err != nil {
-               return err
-       }
-
-       sp := splitPath(action)
-       if len(sp) > 3 {
-               action, err = buildAction(ctx, sp[1], sp[2])
-               if err != nil {
-                       return err
-               }
-       }
-
-       return deployAction(ctx, action)
-}
-
-func checkActionDir(rootPath string, actionPath string) (string, error) {
-       fullPath := filepath.Join(rootPath, actionPath)
-       isActionDir := false
-       isActionDirSupported := false
-       if fileInfo, err := os.Stat(fullPath); err == nil && 
fileInfo.Mode().IsDir() {
-               isActionDir = true
-               for _, start := range supportedMains {
-                       sub := filepath.Join(actionPath, start)
-                       if exists(filepath.Join(rootPath, sub)) {
-                               actionPath = sub
-                               isActionDirSupported = true
-                               break
-                       }
-               }
-       }
-       if isActionDir && !isActionDirSupported {
-               return "", fmt.Errorf("action %s is a directory but does not 
contain a supported main file", actionPath)
-       }
-       return actionPath, nil
-}
-
-func deployAction(ctx deployCtx, artifact string) error {
-       sp := splitPath(artifact)
-       nameType := strings.Split(sp[len(sp)-1], ".")
-       name := nameType[0]
-       typ := nameType[1]
-       packageName := filepath.Base(filepath.Dir(artifact))
-
-       deployPackage(ctx, packageName)
-
-       var toInspect []string
-       if typ == "zip" {
-               base := filepath.Join(ctx.path, artifact[:len(artifact)-4])
-
-               // TODO: add support for other languages
-               toInspect = []string{filepath.Join(base, "/__main__.py"), 
filepath.Join(base, "/index.js")}
-       } else {
-               toInspect = []string{artifact}
-       }
-
-       args := extractArgs(toInspect)
-
-       action := packageName + "/" + name // the action name, it's not a file 
path
-       if packageName == "packages" {
-               action = name
-       }
-
-       cmd := []string{"nuv", "action", "update", action, artifact}
-       cmd = append(cmd, args...)
-       if !ctx.dryRun {
-
-               execCmd := exec.Command("nuv", cmd[1:]...)
-               execCmd.Stderr = os.Stderr
-               execCmd.Stdout = os.Stdout
-               err := execCmd.Run()
-               if err != nil {
-                       return fmt.Errorf("error deploying action %s: %v", 
action, err)
-               }
-       } else {
-               log.Println("Would run:", strings.Join(cmd, " "))
-       }
-
-       return nil
-}
-
-func deployPackage(ctx deployCtx, pkg string) {
-       // package args
-       ppath := filepath.Join(ctx.path, "packages", pkg+".args")
-       pargs := extractArgs([]string{ppath})
-       cmd := []string{"nuv", "package", "update", pkg}
-
-       cmd = append(cmd, pargs...)
-
-       cmdToSave := strings.Join(cmd, " ")
-       if _, ok := ctx.packageCmdExecuted[cmdToSave]; !ok {
-               if !ctx.dryRun {
-                       execCmd := exec.Command("nuv", cmd[1:]...)
-                       execCmd.Stderr = os.Stderr
-                       execCmd.Stdout = os.Stdout
-                       err := execCmd.Run()
-                       if err != nil {
-                               log.Println("Error deploying package", pkg, err)
-                       }
-               } else {
-                       log.Println("Would run:", strings.Join(cmd, " "))
-               }
-
-               ctx.packageCmdExecuted[cmdToSave] = true
-       }
-}
-
-func extractArgs(files []string) []string {
-       res := []string{}
-       for _, file := range files {
-               if exists(file) {
-                       f, err := os.Open(file)
-                       if err != nil {
-                               log.Println("Error opening file", file, err)
-                               continue
-                       }
-                       defer f.Close()
-
-                       scanner := bufio.NewScanner(f)
-                       for scanner.Scan() {
-                               line := scanner.Text()
-                               if strings.HasPrefix(line, "#-") {
-                                       res = append(res, 
strings.TrimSpace(line[1:]))
-                               }
-                               if strings.HasPrefix(line, "//-") {
-                                       res = append(res, 
strings.TrimSpace(line[2:]))
-                               }
-                       }
-
-                       if err := scanner.Err(); err != nil {
-                               log.Println("Error reading file", file, err)
-                       }
-               }
-       }
-       // for each string, split by space and add to args
-       args := []string{}
-       for _, arg := range res {
-               args = append(args, strings.Split(arg, " ")...)
-       }
-       return args
-}
-
-func buildAction(ctx deployCtx, pkg string, action string) (string, error) {
-       if !ctx.dryRun {
-               cmd := exec.Command("nuv", "ide", "util", "action", 
fmt.Sprintf("A=%s/%s", pkg, action))
-               cmd.Stderr = os.Stderr
-               cmd.Stdout = os.Stdout
-               err := cmd.Run()
-               if err != nil {
-                       return "", fmt.Errorf("error building action %s/%s: 
%v", pkg, action, err)
-               }
-       } else {
-               log.Println("Would run: nuv ide util action A=" + pkg + "/" + 
action)
-       }
-       return fmt.Sprintf("packages/%s/%s.zip", pkg, action), nil
-}
-
-func exists(file string) bool {
-       _, err := os.Stat(file)
-       return !os.IsNotExist(err)
-}
-
-func splitPath(path string) []string {
-       if path == "" {
-               return []string{}
-       }
-       dir, last := filepath.Split(filepath.Clean(path))
-       if dir == "." || dir == "/" || dir == "" {
-               return []string{last}
-       }
-       return append(splitPath(dir), last)
-}
-
-// region: scan
-
-// scan scans the packages and deployments.
-func scan(ctx deployCtx) error {
-       wd, _ := os.Getwd()
-       _ = os.Chdir(ctx.path)
-       defer func() {
-               _ = os.Chdir(wd)
-       }()
-
-       // First look for requirements.txt and build the venv (add in set)
-       deployments := make(map[string]bool)
-       packages := make(map[string]bool)
-
-       log.Println(">>> Scan:")
-       pyGlob := filepath.Join("packages", "*", "*", "requirements.txt")
-       jsGlob := filepath.Join("packages", "*", "*", "package.json")
-       reqs, _ := filepath.Glob(pyGlob)
-       reqs2, _ := filepath.Glob(jsGlob)
-       reqs = append(reqs, reqs2...)
-
-       for _, req := range reqs {
-               log.Println(">", req)
-               sp := splitPath(req)
-               action, err := buildZip(ctx, sp[1], sp[2])
-               if err != nil {
-                       return fmt.Errorf("error building zip for %s/%s: %v", 
sp[1], sp[2], err)
-               }
-               deployments[action] = true
-               packages[sp[1]] = true
-       }
-
-       pyMainGlob := filepath.Join("packages", "*", "*", "__main__.py")
-       jsMainGlob := filepath.Join("packages", "*", "*", "index.js")
-       mains, _ := filepath.Glob(pyMainGlob)
-       pymains, _ := filepath.Glob(jsMainGlob)
-       mains = append(mains, pymains...)
-       for _, main := range mains {
-               log.Println(">", main)
-               sp := splitPath(main)
-               action, err := buildAction(ctx, sp[1], sp[2])
-               if err != nil {
-                       return fmt.Errorf("error building action %s/%s: %v", 
sp[1], sp[2], err)
-               }
-               deployments[action] = true
-               packages[sp[1]] = true
-       }
-
-       pySinglesGlob := filepath.Join("packages", "*", "*.py")
-       jsSinglesGlob := filepath.Join("packages", "*", "*.js")
-       singles, _ := filepath.Glob(pySinglesGlob)
-       jsSingles, _ := filepath.Glob(jsSinglesGlob)
-       singles = append(singles, jsSingles...)
-       for _, single := range singles {
-               log.Println(">", single)
-               sp := splitPath(single)
-               deployments[single] = true
-               packages[sp[1]] = true
-       }
-
-       if len(deployments) == 0 && len(packages) == 0 {
-               log.Println("Nothing to do")
-               return nil
-       }
-
-       log.Println(">>> Deploying:")
-
-       for p := range packages {
-               log.Println("%", p)
-               deployPackage(ctx, p)
-       }
-
-       for a := range deployments {
-               log.Println("^", a)
-               err := deployAction(ctx, a)
-               if err != nil {
-                       return err
-               }
-       }
-
-       return nil
-}
-
-func buildZip(ctx deployCtx, pkg string, action string) (string, error) {
-       if !ctx.dryRun {
-               cmd := exec.Command("nuv", "ide", "util", "zip", 
fmt.Sprintf("A=%s/%s", pkg, action))
-               cmd.Stderr = os.Stderr
-               cmd.Stdout = os.Stdout
-               err := cmd.Run()
-               if err != nil {
-                       return "", fmt.Errorf("error building zip %s/%s: %v", 
pkg, action, err)
-               }
-       } else {
-               log.Println("Would run: nuv ide util zip A=" + pkg + "/" + 
action)
-       }
-
-       return fmt.Sprintf("packages/%s/%s.zip", pkg, action), nil
-}
-
-// endregion
-
-// region: watch
-
-var SKIPDIR = []string{"virtualenv", "node_modules", "__pycache__"}
-
-func watch(ctx deployCtx) error {
-       log.Println(">>> Watching:", filepath.Join(ctx.path, "packages"))
-
-       w := watcher.New()
-
-       err := w.AddRecursive(filepath.Join(ctx.path, "packages"))
-       if err != nil {
-               return err
-       }
-
-       w.IgnoreHiddenFiles(true)
-       // SetMaxEvents to 1 to allow at most 1 event's to be received
-       // on the Event channel per watching cycle.
-       //
-       // If SetMaxEvents is not set, the default is to send all events.
-       // w.SetMaxEvents(1)
-
-       watcherEvent := &watcherEvent{
-               lastModified: make(map[string]time.Time),
-       }
-
-       go func() {
-               for {
-                       select {
-                       case event := <-w.Event:
-                               watcherEvent.changeHandler(ctx, event)
-                       case err := <-w.Error:
-                               log.Println(err)
-                       case <-w.Closed:
-                               return
-                       }
-               }
-       }()
-
-       // Start the watching process - it'll check for changes every 100ms.
-       if err := w.Start(time.Millisecond * 100); err != nil {
-               return err
-       }
-
-       return nil
-}
-
-type watcherEvent struct {
-       lastModified map[string]time.Time
-}
-
-func (w *watcherEvent) changeHandler(ctx deployCtx, event watcher.Event) {
-       if event.Op != watcher.Write {
-               return // only handle write events
-       }
-       if event.IsDir() {
-               return // skip directories
-       }
-
-       src := event.Path
-       if !exists(src) {
-               return // no missing files
-       }
-
-       for _, dir := range splitPath(src)[:len(splitPath(src))-1] {
-               for _, skip := range SKIPDIR { // no generated directories
-                       if dir == skip {
-                               return
-                       }
-               }
-       }
-
-       if strings.HasSuffix(src, ".zip") {
-               return // no generated files
-       }
-
-       // cache last modified to do only once (mod time of file)
-       f, _ := os.Stat(src)
-       cur := f.ModTime()
-       lastMod, ok := w.lastModified[src]
-       if ok && lastMod.Equal(cur) {
-               return
-       }
-       w.lastModified[src] = cur
-
-       log.Println("Changed:", src)
-       // remove the ctx.path prefix
-       err := deploy(ctx, strings.TrimPrefix(src, ctx.path+"/"))
-       if err != nil {
-               log.Println("Error deploying action", src, err)
-       }
-}
-
-// endregion
diff --git a/tools/deploy_test.go b/tools/deploy_test.go
deleted file mode 100644
index 7136969..0000000
--- a/tools/deploy_test.go
+++ /dev/null
@@ -1,245 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "fmt"
-       "log"
-       "os"
-       "path/filepath"
-       "strings"
-       "testing"
-
-       "github.com/stretchr/testify/require"
-)
-
-func TestExtractArgs(t *testing.T) {
-       // Prepare a temporary test file
-       tmpDir := t.TempDir()
-       file, err := os.CreateTemp(tmpDir, "testfile*.txt")
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       content := `#-arg1
-//-arg2
-other content
-#-arg3
-//-arg4`
-
-       _, _ = file.WriteString(content)
-       file.Close()
-
-       // Test cases
-       tests := []struct {
-               name     string
-               files    []string
-               expected []string
-       }{
-               {
-                       name:     "Extract args from existing file",
-                       files:    []string{file.Name()},
-                       expected: []string{"-arg1", "-arg2", "-arg3", "-arg4"},
-               },
-               {
-                       name:     "Extract args from non-existing file",
-                       files:    []string{"non_existing_file.txt"},
-                       expected: []string{},
-               },
-       }
-
-       // Run tests
-       for _, tc := range tests {
-               t.Run(tc.name, func(t *testing.T) {
-                       result := extractArgs(tc.files)
-                       require.Equal(t, tc.expected, result)
-               })
-       }
-}
-
-func TestDeployPackage(t *testing.T) {
-       // create a testpkg.args file
-       tmpDir := t.TempDir()
-       //create packages folder
-       _ = os.MkdirAll(tmpDir+"/packages", 0755)
-       file, err := os.Create(filepath.Join(tmpDir, "packages", 
"testpkg1.args"))
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       content := `#-arg1
-//-arg2
-other content
-#-arg3
-//-arg4`
-
-       _, _ = file.WriteString(content)
-       file.Close()
-
-       // Test cases
-       tests := []struct {
-               name             string
-               ctx              deployCtx
-               pkg              string
-               expectedExecuted map[string]bool
-               expectedLog      string
-       }{
-               {
-                       name: "Deploy package with no args",
-                       ctx:  deployCtx{packageCmdExecuted: 
make(map[string]bool), dryRun: true, path: "."},
-                       pkg:  "testpkg",
-                       expectedExecuted: map[string]bool{
-                               "nuv package update testpkg": true,
-                       },
-                       expectedLog: "Would run: nuv package update testpkg\n",
-               },
-               {
-                       name: "Deploy package with args",
-                       ctx:  deployCtx{packageCmdExecuted: 
make(map[string]bool), dryRun: true, path: tmpDir},
-                       pkg:  "testpkg1",
-                       expectedExecuted: map[string]bool{
-                               fmt.Sprintf("nuv package update %s -arg1 -arg2 
-arg3 -arg4", "testpkg1"): true,
-                       },
-                       expectedLog: fmt.Sprintf("Would run: nuv package update 
%s -arg1 -arg2 -arg3 -arg4\n", "testpkg1"),
-               },
-       }
-
-       // Original log output
-       originalLogOutput := log.Writer()
-       defer func() { log.SetOutput(originalLogOutput) }()
-
-       // Buffer to capture log output
-       var logOutput strings.Builder
-       log.SetOutput(&logOutput)
-
-       // Run tests
-       for _, tc := range tests {
-               t.Run(tc.name, func(t *testing.T) {
-                       deployPackage(tc.ctx, tc.pkg)
-                       // Check if the command was executed
-                       require.Equal(t, tc.expectedExecuted, 
tc.ctx.packageCmdExecuted, "Expected number of executed commands does not 
match")
-                       require.Contains(t, logOutput.String(), tc.expectedLog, 
"Log output does not match")
-                       // Reset log output buffer
-                       logOutput.Reset()
-               })
-       }
-}
-
-func TestDeployAction(t *testing.T) {
-       // create temp index.js with some args
-       tmpDir := t.TempDir()
-       _ = os.Mkdir(filepath.Join(tmpDir, "packages"), 0755)
-       _ = os.Mkdir(filepath.Join(tmpDir, "packages", "packageName"), 0755)
-       _ = os.Mkdir(filepath.Join(tmpDir, "packages", "packageName", 
"action"), 0755)
-       file, err := os.Create(filepath.Join(tmpDir, "packages", "packageName", 
"action", "index.js"))
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       content := `#--kind nodejs:20`
-
-       _, _ = file.WriteString(content)
-
-       // Test cases
-       tests := []struct {
-               name             string
-               ctx              deployCtx
-               artifact         string
-               dryRun           bool
-               expectedExecuted bool
-               expectedLog      string
-       }{
-               {
-                       name:        "Deploy action from zip file",
-                       ctx:         deployCtx{dryRun: true, path: tmpDir, 
packageCmdExecuted: make(map[string]bool)},
-                       artifact:    "packages/packageName/action.zip",
-                       expectedLog: "nuv action update packageName/action 
packages/packageName/action.zip --kind nodejs:20",
-               },
-               {
-                       name:        "Deploy action from non-zip file",
-                       ctx:         deployCtx{dryRun: true, path: ".", 
packageCmdExecuted: make(map[string]bool)},
-                       artifact:    "packages/packageName/index.js",
-                       expectedLog: "nuv action update packageName/index 
packages/packageName/index.js",
-               },
-       }
-
-       for _, tc := range tests {
-               t.Run(tc.name, func(t *testing.T) {
-                       // Original log output
-                       originalLogOutput := log.Writer()
-                       defer func() { log.SetOutput(originalLogOutput) }()
-
-                       // Buffer to capture log output
-                       var logOutput strings.Builder
-                       log.SetOutput(&logOutput)
-
-                       err := deployAction(tc.ctx, tc.artifact)
-
-                       // Assertions
-                       require.NoError(t, err, "Error deploying action")
-                       require.Contains(t, logOutput.String(), tc.expectedLog, 
"Log output does not match")
-                       // Reset log output buffer
-                       logOutput.Reset()
-               })
-       }
-}
-func TestSplitPath(t *testing.T) {
-       tests := []struct {
-               name     string
-               path     string
-               expected []string
-       }{
-               {
-                       name:     "Split empty path",
-                       path:     "",
-                       expected: []string{},
-               },
-               {
-                       name:     "Split path with single directory",
-                       path:     "dir1",
-                       expected: []string{"dir1"},
-               },
-               {
-                       name:     "Split path with multiple directories",
-                       path:     "dir1/dir2/dir3",
-                       expected: []string{"dir1", "dir2", "dir3"},
-               },
-               {
-                       name:     "Split path with leading slash",
-                       path:     "/dir1/dir2/dir3",
-                       expected: []string{"dir1", "dir2", "dir3"},
-               },
-               {
-                       name:     "Split path with trailing slash",
-                       path:     "dir1/dir2/dir3/",
-                       expected: []string{"dir1", "dir2", "dir3"},
-               },
-               {
-                       name:     "Split path with leading and trailing slash",
-                       path:     "/dir1/dir2/dir3/",
-                       expected: []string{"dir1", "dir2", "dir3"},
-               },
-       }
-
-       for _, tc := range tests {
-               t.Run(tc.name, func(t *testing.T) {
-                       result := splitPath(tc.path)
-                       require.Equal(t, tc.expected, result)
-               })
-       }
-}
diff --git a/tools/js.go b/tools/js.go
deleted file mode 100644
index da1ac56..0000000
--- a/tools/js.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "flag"
-       "fmt"
-       "os"
-
-       "github.com/mattn/go-isatty"
-       goja "github.com/nuvolaris/goja/gojamain"
-)
-
-func jsToolMain() error {
-       flag := flag.NewFlagSet("js", flag.ExitOnError)
-       flag.Usage = func() {
-               fmt.Println(`nuv -js
-
-Usage: 
-  nuv -js FILE.js
-
-Interpret and run Javascript code.`)
-       }
-
-       // Parse command line flags
-       err := flag.Parse(os.Args[1:])
-       if err != nil {
-               return err
-       }
-
-       // Check if input is from terminal and not from a pipe
-       isTerminal := isatty.IsTerminal(os.Stdin.Fd()) || 
isatty.IsCygwinTerminal(os.Stdin.Fd())
-       // if no input file and no input from pipe, print help message
-       if isTerminal && flag.NArg() == 0 {
-               flag.Usage()
-               return nil
-       }
-
-       return goja.GojaMain()
-}
diff --git a/tools/mkdirs.go b/tools/mkdirs.go
deleted file mode 100644
index 7e108ad..0000000
--- a/tools/mkdirs.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "flag"
-       "fmt"
-       "os"
-)
-
-func Mkdirs() error {
-       flag.Usage = printMkdirsHelp
-       // Define command line flags
-       helpFlag := flag.Bool("h", false, "Print help message")
-       parentFlag := flag.Bool("p", false, "Create parent directories")
-
-       // Parse command line flags
-       flag.Parse()
-
-       // Print help message if -h flag is provided
-       if *helpFlag {
-               flag.Usage()
-               return nil
-       }
-
-       // Get the list of directories to create from the remaining command 
line arguments
-       dirs := flag.Args()
-       if len(dirs) == 0 {
-               flag.Usage()
-       }
-
-       // Create each directory, with or without parent directories
-       for _, dir := range dirs {
-               if *parentFlag {
-                       err := os.MkdirAll(dir, 0755)
-                       if err != nil {
-                               return err
-                       }
-               } else {
-                       err := os.Mkdir(dir, 0755)
-                       if err != nil {
-                               return err
-                       }
-               }
-       }
-       return nil
-}
-
-func printMkdirsHelp() {
-       fmt.Println("Usage: mkdir [-h] [-p] DIRECTORY...")
-       fmt.Println("Create one or more directories.")
-}
diff --git a/tools/realpath.go b/tools/realpath.go
deleted file mode 100644
index 312509a..0000000
--- a/tools/realpath.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "errors"
-       "flag"
-       "fmt"
-       "os"
-       "path/filepath"
-
-       "github.com/mitchellh/go-homedir"
-)
-
-func realpathTool() error {
-       flags := flag.NewFlagSet("realpath", flag.ExitOnError)
-       flags.Usage = func() {
-               fmt.Println("Usage: nuv -realpath <path>")
-               fmt.Println()
-               fmt.Println("Options:")
-               flags.PrintDefaults()
-       }
-
-       showHelp := flags.Bool("h", false, "Show help")
-
-       // Parse command-line arguments
-       if err := flags.Parse(os.Args[1:]); err != nil {
-               return err
-       }
-
-       if *showHelp {
-               flags.Usage()
-               return nil
-       }
-
-       if flags.NArg() != 1 {
-               flags.Usage()
-               return errors.New("no path provided")
-       }
-
-       path, err := homedir.Expand(flags.Arg(0))
-       if err != nil {
-               return err
-       }
-
-       var absPath string
-       if filepath.IsLocal(path) {
-               absPath = filepath.Join(os.Getenv("NUV_PWD"), path)
-       } else {
-               absPath = path
-       }
-
-       absPath = filepath.Clean(absPath)
-       fmt.Println(absPath)
-
-       return nil
-}
diff --git a/tools/scan.go b/tools/scan.go
deleted file mode 100644
index 98963c8..0000000
--- a/tools/scan.go
+++ /dev/null
@@ -1,283 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "errors"
-       "flag"
-       "fmt"
-       "io/fs"
-       "os"
-       "os/exec"
-       "path/filepath"
-       "strings"
-       "sync"
-)
-
-const actionsFolder = "actions"
-
-// The scan tool visits a folder and creates an action plan to execute the 
given cmd (called cmdPlan).
-// The cmd is the given nuv command to run, and the args is an array of arrays.
-// Each entry is one execution instance, which holds the folder path (first 
arg) and files names (the rest).
-// The plan is then executed by running the cmd once for each entry of args 
(so args.length times)
-// in the form of `cmd args[i][0] args[i][1] ... args[i][n]` for each i in 
args.
-type cmdPlan struct {
-       par    bool
-       dryRun bool
-       cmd    []string
-       args   [][]string
-}
-
-func (p *cmdPlan) apply() error {
-       var ars []string
-       if len(p.cmd) > 1 {
-               ars = append(ars, p.cmd[1:]...)
-       }
-
-       if p.par {
-               var wg sync.WaitGroup
-               for _, args := range p.args {
-                       wg.Add(1)
-                       go func(args []string) {
-                               if p.dryRun {
-                                       fmt.Println(strings.Join(append(p.cmd, 
args...), " "))
-                               } else {
-                                       cmd := exec.Command(p.cmd[0], 
append(ars, args...)...)
-                                       cmd.Stdout = os.Stdout
-                                       cmd.Stderr = os.Stderr
-                                       if err := cmd.Run(); err != nil {
-                                               fmt.Println(err)
-                                       }
-                               }
-                               wg.Done()
-                       }(args)
-               }
-               wg.Wait()
-               return nil
-       }
-
-       // run sequentially
-       for _, args := range p.args {
-               if p.dryRun {
-                       fmt.Println(strings.Join(append(p.cmd, args...), " "))
-                       continue
-               }
-               cmd := exec.Command(p.cmd[0], append(ars, args...)...)
-               cmd.Stdout = os.Stdout
-               cmd.Stderr = os.Stderr
-               if err := cmd.Run(); err != nil {
-                       return err
-               }
-       }
-       return nil
-}
-
-func (p *cmdPlan) setCmd(cmd []string) {
-       p.cmd = cmd
-}
-func (p *cmdPlan) appendArg(args []string) {
-       p.args = append(p.args, args)
-}
-
-func scanTool() error {
-       flag := flag.NewFlagSet("scan", flag.ExitOnError)
-       flag.Usage = func() {
-               fmt.Println(`Scan tool
-
-The scan tool runs a command on an 'actions' folder and on all its 
sub-folders, recursively.
-If the 'actions' folder does not exist in the path used, the tool stops.
-
-In the 'actions' folder, the tool invokes the given nuv command with the 
following arguments:
-  - the absolute path of the folder it is processing
-  - all the files in the folder that matches the glob (none by default, use 
'*' to select all)
-
-You can pass a glob pattern with the -g flag to filter the files used as input.
-
-Usage: 
-  nuv -scan [options] <nuv cmd> [args...]
-
-Example:
-  nuv -scan -g "*" nuv -js script.js
-
-This results in running the script.js file on the ./actions folder and all 
subdirectories. 
-For example, if $NUV_PWD/actions contains a subfolder called 'i-am-sub' with a 
file called 'bar.js',
-the following commands are executed:
-
-       - nuv -js script.js ./actions
-       - nuv -js script.js ./actions/i-am-sub bar.js
-
-Options:`)
-               flag.PrintDefaults()
-               fmt.Println()
-       }
-
-       var (
-               helpFlag     bool
-               dirFlag      string
-               globFlag     string
-               parallelFlag bool
-               dryRunFlag   bool
-       )
-
-       // flag.BoolVar(&helpFlag, "h", false, "show help")
-       flag.BoolVar(&helpFlag, "help", false, "show help")
-       // flag.StringVar(&dirFlag, "d", getCurrentDir(), "directory to scan 
(default: $NUV_PWD)")
-       flag.StringVar(&dirFlag, "dir", os.Getenv("NUV_PWD"), "directory to 
scan (default: $NUV_PWD)")
-       // flag.StringVar(&globFlag, "g", "", "glob pattern to filter files 
(default: no files are passed to the nuv command)")
-       flag.StringVar(&globFlag, "glob", "", "glob pattern between quotes to 
filter files (default: none -> no files are passed to the nuv command)")
-       flag.BoolVar(&dryRunFlag, "dry-run", false, "print the plan without 
executing it")
-       // flag.BoolVar(&parallelFlag, "p", false, "run in parallel (default: 
false)")
-       flag.BoolVar(&parallelFlag, "par", false, "run in parallel (default: 
false)")
-
-       if err := flag.Parse(os.Args[1:]); err != nil {
-               return err
-       }
-
-       if helpFlag {
-               flag.Usage()
-               return nil
-       }
-
-       args := flag.Args()
-       if len(args) < 1 {
-               flag.Usage()
-               return errors.New("missing required nuv command")
-       }
-
-       p, err := filepath.Abs(dirFlag)
-       if err != nil {
-               return err
-       }
-
-       plan, err := buildCmdPlan(p, args, globFlag)
-       if err != nil {
-               return err
-       }
-
-       plan.par = parallelFlag
-       plan.dryRun = dryRunFlag
-
-       return plan.apply()
-}
-
-func buildCmdPlan(scanPath string, cmd []string, glob string) (*cmdPlan, 
error) {
-       // check if actions folder exists
-       if err := checkActionsFolderExists(scanPath); err != nil {
-               return nil, err
-       }
-
-       dirs, err := getAllDirs(filepath.Join(scanPath, actionsFolder))
-       if err != nil {
-               return nil, err
-       }
-
-       plan := &cmdPlan{}
-       plan.setCmd(cmd)
-
-       for _, dir := range dirs {
-               files := make([]string, 0)
-
-               if len(glob) > 0 {
-                       fls, err := getAllFiles(dir)
-                       if err != nil {
-                               return nil, err
-                       }
-
-                       if len(fls) > 0 {
-                               files, err = filterFiles(fls, glob)
-                               if err != nil {
-                                       return nil, err
-                               }
-                       }
-               }
-
-               plan.appendArg(append([]string{dir}, files...))
-       }
-
-       return plan, nil
-}
-
-func filterFiles(files []string, glob string) ([]string, error) {
-       filtered := make([]string, 0)
-
-       if len(glob) == 0 {
-               return filtered, nil
-       }
-
-       for _, file := range files {
-               matched, err := filepath.Match(glob, file)
-               if err != nil {
-                       return filtered, err
-               }
-
-               if matched {
-                       filtered = append(filtered, file)
-               }
-       }
-
-       return filtered, nil
-}
-
-func getAllDirs(rootDir string) ([]string, error) {
-       var dirs []string
-
-       err := filepath.WalkDir(rootDir, func(path string, d fs.DirEntry, err 
error) error {
-               if err != nil {
-                       return err
-               }
-
-               if d.IsDir() {
-                       dirs = append(dirs, path)
-               }
-
-               return nil
-       })
-
-       return dirs, err
-}
-
-func getAllFiles(dir string) ([]string, error) {
-       var files []string
-
-       children, err := os.ReadDir(dir)
-       if err != nil {
-               return files, err
-       }
-
-       for _, child := range children {
-               if !child.IsDir() {
-                       files = append(files, child.Name())
-               }
-       }
-
-       return files, err
-}
-
-func checkActionsFolderExists(path string) error {
-       info, err := os.Stat(filepath.Join(path, actionsFolder))
-       if os.IsNotExist(err) {
-               return fmt.Errorf("%s folder not found in %s", actionsFolder, 
path)
-       }
-       if err != nil {
-               return err
-       }
-       if !info.IsDir() {
-               return fmt.Errorf("%s in %s is not a folder", actionsFolder, 
path)
-       }
-       return nil
-}
diff --git a/tools/scan_test.go b/tools/scan_test.go
deleted file mode 100644
index 2d46712..0000000
--- a/tools/scan_test.go
+++ /dev/null
@@ -1,256 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "os"
-       "path/filepath"
-       "testing"
-
-       "github.com/stretchr/testify/require"
-)
-
-func Test_buildActionPlan(t *testing.T) {
-       cmd := []string{"nuv", "-js", "script.js"}
-
-       t.Run("returns error if no actions folder", func(t *testing.T) {
-               tempDir := t.TempDir()
-               _, err := buildCmdPlan(tempDir, cmd, "")
-               if err == nil {
-                       t.Error("expected error, got nil")
-               }
-       })
-
-       t.Run("returns one arg cmd plan if empty folder", func(t *testing.T) {
-               tempDir := t.TempDir()
-               _ = os.Mkdir(filepath.Join(tempDir, actionsFolder), 0755)
-
-               expectedPath := filepath.Join(tempDir, actionsFolder)
-
-               plan, err := buildCmdPlan(tempDir, cmd, "")
-               require.NoError(t, err)
-               require.Len(t, plan.args, 1)
-               require.Len(t, plan.args[0], 1)
-               require.Equal(t, expectedPath, plan.args[0][0])
-       })
-
-       t.Run("returns one arg cmd plan if folder with one file", func(t 
*testing.T) {
-               tempDir := t.TempDir()
-               actionsDir := filepath.Join(tempDir, actionsFolder)
-               _ = os.Mkdir(actionsDir, 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "file.js"), 
[]byte("test"), 0644)
-
-               expectedPath := filepath.Join(tempDir, actionsFolder)
-
-               plan, err := buildCmdPlan(tempDir, cmd, "*")
-               require.NoError(t, err)
-               require.Len(t, plan.args, 1)
-               require.Len(t, plan.args[0], 2)
-               require.Equal(t, expectedPath, plan.args[0][0])
-               require.Equal(t, "file.js", plan.args[0][1])
-       })
-
-       t.Run("returns plan if folder with multiple subfolders and files", 
func(t *testing.T) {
-               tempDir := t.TempDir()
-               actionsDir := filepath.Join(tempDir, actionsFolder)
-               _ = os.Mkdir(actionsDir, 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "file.js"), 
[]byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir1"), 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "subdir1", 
"file1.js"), []byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir2"), 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "subdir2", 
"file2.js"), []byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir3"), 0755)
-
-               // Expected args:
-               // /actions file.js
-               // /actions/subdir1 file1.js
-               // /actions/subdir2 file2.js
-               // /actions/subdir3
-
-               plan, err := buildCmdPlan(tempDir, cmd, "*")
-
-               require.NoError(t, err)
-               require.Len(t, plan.args, 4)
-               require.Len(t, plan.args[0], 2)
-               require.Len(t, plan.args[1], 2)
-               require.Len(t, plan.args[2], 2)
-               require.Len(t, plan.args[3], 1)
-               require.Equal(t, filepath.Join(tempDir, actionsFolder), 
plan.args[0][0])
-               require.Equal(t, "file.js", plan.args[0][1])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir1"), plan.args[1][0])
-               require.Equal(t, "file1.js", plan.args[1][1])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir2"), plan.args[2][0])
-               require.Equal(t, "file2.js", plan.args[2][1])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir3"), plan.args[3][0])
-       })
-
-       t.Run("returns plan if folder with multiple subfolders and files and 
pattern", func(t *testing.T) {
-               tempDir := t.TempDir()
-               actionsDir := filepath.Join(tempDir, actionsFolder)
-               _ = os.Mkdir(actionsDir, 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "file.js"), 
[]byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir1"), 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "subdir1", 
"file1.js"), []byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir2"), 0755)
-               _ = os.WriteFile(filepath.Join(actionsDir, "subdir2", 
"file2.py"), []byte("test"), 0644)
-               _ = os.Mkdir(filepath.Join(actionsDir, "subdir3"), 0755)
-
-               // Expected args:
-               // /actions file.js
-               // /actions/subdir1 file1.js
-               // /actions/subdir2
-               // /actions/subdir3
-
-               plan, err := buildCmdPlan(tempDir, cmd, "*.js")
-
-               require.NoError(t, err)
-               require.Len(t, plan.args, 4)
-               require.Len(t, plan.args[0], 2)
-               require.Len(t, plan.args[1], 2)
-               require.Len(t, plan.args[2], 1)
-               require.Len(t, plan.args[3], 1)
-               require.Equal(t, filepath.Join(tempDir, actionsFolder), 
plan.args[0][0])
-               require.Equal(t, "file.js", plan.args[0][1])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir1"), plan.args[1][0])
-               require.Equal(t, "file1.js", plan.args[1][1])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir2"), plan.args[2][0])
-               require.Equal(t, filepath.Join(tempDir, actionsFolder, 
"subdir3"), plan.args[3][0])
-       })
-}
-
-func Test_filterFiles(t *testing.T) {
-
-       testCases := []struct {
-               name     string
-               pattern  string
-               expected []string
-       }{
-               {
-                       name:    "returns all files if pattern is *",
-                       pattern: "*",
-                       expected: []string{
-                               "file1.js",
-                               "file2.py",
-                               "file3.go",
-                       },
-               },
-               {
-                       name:     "returns no files if pattern is empty",
-                       pattern:  "",
-                       expected: []string{},
-               },
-               {
-                       name:    "returns all .js files if pattern is *.js",
-                       pattern: "*.js",
-                       expected: []string{
-                               "file1.js",
-                       },
-               },
-       }
-
-       for _, tc := range testCases {
-               t.Run(tc.name, func(t *testing.T) {
-                       files := []string{
-                               "file1.js",
-                               "file2.py",
-                               "file3.go",
-                       }
-
-                       filtered, err := filterFiles(files, tc.pattern)
-                       require.NoError(t, err)
-                       require.Equal(t, tc.expected, filtered)
-               })
-       }
-}
-
-func Test_checkActionsFolder(t *testing.T) {
-       t.Run("returns error if actions folder does not exist", func(t 
*testing.T) {
-               tmpDir := t.TempDir()
-               err := checkActionsFolderExists(tmpDir)
-               require.Error(t, err)
-       })
-
-       t.Run("returns error if actions folder is not a folder", func(t 
*testing.T) {
-               tmpDir := t.TempDir()
-               actionsFile := filepath.Join(tmpDir, actionsFolder)
-               _, err := os.Create(actionsFile)
-               require.NoError(t, err)
-               err = checkActionsFolderExists(tmpDir)
-               require.Error(t, err)
-       })
-
-       t.Run("returns nil if actions folder exists", func(t *testing.T) {
-               tmpDir := t.TempDir()
-               actionsFile := filepath.Join(tmpDir, actionsFolder)
-               err := os.Mkdir(actionsFile, 0755)
-               require.NoError(t, err)
-               err = checkActionsFolderExists(tmpDir)
-               require.NoError(t, err)
-       })
-}
-
-func Test_getAllDirs(t *testing.T) {
-       // Create a temporary directory for testing
-       tempDir := t.TempDir()
-
-       expectedDirs := []string{tempDir}
-
-       // Create some subdirectories inside the temporary directory
-       subDirs := []string{"dir1", "dir2", "dir3"}
-       subSubDirs := []string{"subdir1", "subdir2", "subdir3"}
-       for i, dir := range subDirs {
-               tDir := filepath.Join(tempDir, dir)
-               tSubDir := filepath.Join(tDir, subSubDirs[i])
-               expectedDirs = append(expectedDirs, tDir)
-               expectedDirs = append(expectedDirs, tSubDir)
-               err := os.Mkdir(filepath.Join(tempDir, dir), 0755)
-
-               require.NoError(t, err)
-               err = os.Mkdir(tSubDir, 0755)
-
-               require.NoError(t, err)
-       }
-
-       dirs, err := getAllDirs(tempDir)
-       require.NoError(t, err)
-
-       // Verify that the expected directories are present
-       require.Equal(t, len(expectedDirs), len(dirs))
-
-       require.ElementsMatch(t, expectedDirs, dirs)
-}
-
-func Test_getAllFiles(t *testing.T) {
-       tempDir := t.TempDir()
-
-       expectedFiles := []string{"file1", "file2", "file3"}
-
-       // Create some files inside the temporary directory
-       for _, file := range expectedFiles {
-               f, err := os.Create(filepath.Join(tempDir, file))
-               f.Close()
-               require.NoError(t, err)
-       }
-
-       files, err := getAllFiles(tempDir)
-       require.NoError(t, err)
-
-       // Verify that the expected files are present
-       require.Equal(t, len(expectedFiles), len(files))
-       require.ElementsMatch(t, expectedFiles, files)
-}
diff --git a/tools/tools.go b/tools/tools.go
index edfdb4d..11975fa 100644
--- a/tools/tools.go
+++ b/tools/tools.go
@@ -33,14 +33,13 @@ import (
 // available in taskfiles
 // note some of them are implemented in main.go (config, retry)
 var tools = []string{
-       "awk", "die", "jq", "js",
-       "envsubst", "wsk", "mkdir",
+       "awk", "die", "jq",
+       "envsubst", "wsk",
        "filetype", "random", "datefmt",
        "config", "retry", "urlenc",
        "replace", "base64", "validate",
        "echoif", "echoifempty", "echoifexists",
-       "realpath", "zipf", "needupdate",
-       "gron", "jj", "deploy",
+       "needupdate", "gron", "jj", "deploy",
 }
 
 // not available in taskfiles
@@ -49,9 +48,6 @@ var extraTools = []string{
 }
 
 func IsTool(name string) bool {
-       if IsUtil(name) {
-               return true
-       }
        for _, s := range tools {
                if s == name {
                        return true
@@ -74,9 +70,6 @@ func GetNuvCmd() string {
 }
 
 func RunTool(name string, args []string) (int, error) {
-       if IsUtil(name) {
-               return RunUtil(name, args)
-       }
        switch name {
        case "wsk":
                //fmt.Println("=== wsk ===")
@@ -93,21 +86,11 @@ func RunTool(name string, args []string) (int, error) {
        case "jq":
                os.Args = append([]string{"gojq"}, args...)
                return gojq.Run(), nil
-       case "js":
-               os.Args = append([]string{"goja"}, args...)
-               if err := jsToolMain(); err != nil {
-                       return 1, err
-               }
        case "envsubst":
                os.Args = append([]string{"envsubst"}, args...)
                if err := envsubst.EnvsubstMain(); err != nil {
                        return 1, err
                }
-       case "mkdir":
-               os.Args = append([]string{"mkdir"}, args...)
-               if err := Mkdirs(); err != nil {
-                       return 1, err
-               }
        case "filetype":
                os.Args = append([]string{"mkdir"}, args...)
                if err := Filetype(); err != nil {
@@ -145,11 +128,6 @@ func RunTool(name string, args []string) (int, error) {
                if err := validateTool(); err != nil {
                        return 1, err
                }
-       case "scan":
-               os.Args = append([]string{"scan"}, args...)
-               if err := scanTool(); err != nil {
-                       return 1, err
-               }
        case "echoif":
                os.Args = append([]string{"echoif"}, args...)
                if err := echoIfTool(); err != nil {
@@ -165,16 +143,6 @@ func RunTool(name string, args []string) (int, error) {
                if err := echoIfExistsTool(); err != nil {
                        return 1, err
                }
-       case "realpath":
-               os.Args = append([]string{"realpath"}, args...)
-               if err := realpathTool(); err != nil {
-                       return 1, err
-               }
-
-       case "zipf":
-               if err := zipfTool(args); err != nil {
-                       return 1, err
-               }
 
        case "needupdate":
                if err := needUpdateTool(args); err != nil {
@@ -189,12 +157,6 @@ func RunTool(name string, args []string) (int, error) {
                os.Args = append([]string{"jj"}, args...)
                return jj.JJMain()
 
-       case "deploy":
-               if err := DeployTool(); err != nil {
-                       return 1, err
-               }
-       }
-
        return 0, nil
 }
 
diff --git a/tools/util.go b/tools/util.go
deleted file mode 100644
index 5c37e32..0000000
--- a/tools/util.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package tools
-
-import (
-       "fmt"
-       "os"
-       "os/exec"
-
-       "github.com/nuvolaris/someutils"
-       "github.com/nuvolaris/someutils/some"
-)
-
-var Utils = []string{
-       "basename", "cat", "cp", "dirname",
-       "gunzip", "gzip", "head",
-       "ls", "mv", "pwd", "rm", "sleep",
-       "tail", "tar", "tee", "touch", "tr",
-       "unzip", "wc", "which", "zip",
-}
-
-func IsUtil(name string) bool {
-       some.Init()
-       for _, s := range Utils {
-               if s == name {
-                       return true
-               }
-       }
-       return false
-}
-
-func RunUtil(name string, args []string) (int, error) {
-       if IsUtil(name) {
-               full := append([]string{name}, args...)
-               var err error
-               var code int
-               if useCoreutils() {
-                       code, err = runCoreUtils(full)
-               } else {
-                       err, code = someutils.Call(name, full)
-               }
-               return code, err
-       }
-       return 1, fmt.Errorf("command %s not found", name)
-}
-
-func useCoreutils() bool {
-       return os.Getenv("NUV_USE_COREUTILS") != ""
-}
-
-func runCoreUtils(full []string) (int, error) {
-       cmd := exec.Command("coreutils", full...)
-       cmd.Stdin = os.Stdin
-       cmd.Stdout = os.Stdout
-       cmd.Stderr = os.Stderr
-       err := cmd.Run()
-       code := cmd.ProcessState.ExitCode()
-       return code, err
-}
diff --git a/tools/wsk.go b/tools/wsk.go
index d8cb40a..b6ba551 100644
--- a/tools/wsk.go
+++ b/tools/wsk.go
@@ -24,8 +24,8 @@ import (
 
        "github.com/apache/openwhisk-client-go/whisk"
        goi18n "github.com/nicksnyder/go-i18n/i18n"
-       "github.com/nuvolaris/openwhisk-cli/commands"
-       "github.com/nuvolaris/openwhisk-cli/wski18n"
+       "github.com/sciabarracom/openwhisk-cli/commands"
+       "github.com/sciabarracom/openwhisk-cli/wski18n"
 )
 
 // prepare wsk execution
@@ -49,7 +49,6 @@ func Wsk(command []string, args ...string) error {
 
        // set wsk variable
        //setWskEnvVariable(false)
-
        //debug("WSK_CONFIG_FILE=" + os.Getenv("WSK_CONFIG_FILE"))
 
        // compose the command
diff --git a/tools/zipf.go b/tools/zipf.go
deleted file mode 100644
index 7652558..0000000
--- a/tools/zipf.go
+++ /dev/null
@@ -1,250 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "archive/zip"
-       "bytes"
-       "flag"
-       "fmt"
-       "io"
-       "log"
-       "os"
-       "os/exec"
-       "path/filepath"
-       "regexp"
-       "strings"
-)
-
-func zipfTool(args []string) error {
-       flag := flag.NewFlagSet("zipf", flag.ExitOnError)
-       flag.Usage = func() {
-               fmt.Println(`nuv -zipf
-
-Zip an action folder. 
-If the folder contains a main file, the output file is <folder>.<ext>.zip 
where the extension is the extension of the main file.
-
-You can specify the output file with the -o option to override the default 
name.
-
-You can pass a command with the -x option. 
-The command is a shell command that is executed on the zipped folder and its 
output is saved as the output file.
-
-N.B.: The zip file is saved in the same parent folder of the input folder.
-
-Usage:
-  nuv -zipf <folder> [-o <zipfile>] [-x <command>]
-
-Options:`)
-               flag.PrintDefaults()
-       }
-
-       out := flag.String("o", "", "override output file name (default is 
<folder>[.<ext>].zip)")
-       cmd := flag.String("x", "", "command to execute on the zipped folder")
-       help := flag.Bool("h", false, "print this help")
-
-       err := flag.Parse(args)
-       if err != nil {
-               return err
-       }
-
-       if *help {
-               flag.Usage()
-               return nil
-       }
-
-       if flag.NArg() != 1 {
-               flag.Usage()
-               return fmt.Errorf("invalid number of arguments")
-       }
-
-       dir := flag.Arg(0)
-       if *out == "" {
-               *out, err = generateOutputFileName(dir)
-               if err != nil {
-                       return err
-               }
-       }
-
-       *out = filepath.Join(filepath.Dir(dir), *out)
-
-       buf, err := Zip(dir)
-       if err != nil {
-               return err
-       }
-
-       if *cmd == "" {
-               err = os.WriteFile(*out, buf, 0644)
-               if err != nil {
-                       return err
-               }
-               log.Println(*out)
-               return nil
-       }
-
-       stdout, err := runCommandWithStdin(*cmd, buf)
-       if err != nil {
-               return err
-       }
-
-       err = os.WriteFile(*out, stdout, 0644)
-       if err != nil {
-               return err
-       }
-       log.Println(*out)
-       return nil
-}
-
-func runCommandWithStdin(cmd string, stdin []byte) ([]byte, error) {
-       c := exec.Command(cmd)
-       c.Stdin = bytes.NewReader(stdin)
-       c.Stdout = os.Stdout
-       c.Stderr = os.Stderr
-       err := c.Run()
-       if err != nil {
-               return nil, err
-       }
-       // return stdout
-       return c.Output()
-}
-
-// GenerateOutputFileName generates the name of the zipped folder
-// If the output file  is not specified, the output file is `<folder>.<ext>` 
where the extension can be:
-//
-// - `.js.zip` if there is a `main.js` in the `<folder>`
-// -  `.py.zip` if there is a `__main__.py` in the `<folder>
-// - `.go.zip` if there is a `main.go` in the `<folder>`
-// - `php.zip` if there is a `main.pho` in the `<folder>`
-// - `.java.zip` if there is a `Main.java` in the folder
-//
-// in general, look for a file with this regexp: `^.*[mM]ain.**\.(.*)$` and 
use the extension of the main file
-// if no main found use just `.zip`
-func generateOutputFileName(folder string) (string, error) {
-       // List of possible main file extensions and their corresponding output 
extensions
-       mainFileExtensions := map[string]string{
-               ".js":   ".js.zip",
-               ".py":   ".py.zip",
-               ".go":   ".go.zip",
-               ".php":  ".php.zip",
-               ".java": ".java.zip",
-       }
-
-       // Compile the regular expression pattern
-       mainFilePattern := regexp.MustCompile(`^.*[mM]ain.*\.(.*)$`)
-
-       // Check if any file in the folder matches the regexp for main files
-       dirEntries, err := os.ReadDir(folder)
-       if err != nil {
-               return "", err
-       }
-
-       for _, dirEntry := range dirEntries {
-               fullPath := filepath.Join(folder, dirEntry.Name())
-
-               if !dirEntry.IsDir() && isRegularFile(fullPath) && 
mainFilePattern.MatchString(dirEntry.Name()) {
-                       ext := filepath.Ext(dirEntry.Name())
-                       outputExt, ok := mainFileExtensions[ext]
-                       if ok {
-                               // remove the extension from the main file name
-                               return filepath.Base(folder) + outputExt, nil
-                       }
-               }
-       }
-
-       // If no main file was found, use ".zip" as the default extension
-       return filepath.Base(folder) + ".zip", nil
-}
-
-func isRegularFile(path string) bool {
-       info, err := os.Lstat(path)
-       if err != nil {
-               return false
-       }
-       return info.Mode().IsRegular()
-}
-
-// Zip a directory
-func Zip(dir string) ([]byte, error) {
-       buf := new(bytes.Buffer)
-       zwr := zip.NewWriter(buf)
-       dir = filepath.Clean(dir)
-       err := filepath.Walk(dir, func(filePath string, info os.FileInfo, err 
error) error {
-
-               // trim the relevant part of the path
-               relPath := strings.TrimPrefix(filePath, dir)
-               if relPath == "" {
-                       return nil
-               }
-               relPath = relPath[1:]
-               if err != nil {
-                       return err
-               }
-
-               // create a proper entry
-               isLink := (info.Mode() & os.ModeSymlink) == os.ModeSymlink
-               header := &zip.FileHeader{
-                       Name:   relPath,
-                       Method: zip.Deflate,
-               }
-               if isLink {
-                       header.SetMode(0755 | os.ModeSymlink)
-                       w, err := zwr.CreateHeader(header)
-                       if err != nil {
-                               return err
-                       }
-                       ln, err := os.Readlink(filePath)
-                       if err != nil {
-                               return err
-                       }
-                       _, err = w.Write([]byte(ln))
-                       if err != nil {
-                               return err
-                       }
-               } else if info.IsDir() {
-                       header.Name = relPath + "/"
-                       header.SetMode(0755)
-                       _, err := zwr.CreateHeader(header)
-                       if err != nil {
-                               return err
-                       }
-               } else if info.Mode().IsRegular() {
-                       header.SetMode(0755)
-                       w, err := zwr.CreateHeader(header)
-                       if err != nil {
-                               return err
-                       }
-                       fsFile, err := os.Open(filePath)
-                       if err != nil {
-                               return err
-                       }
-                       defer fsFile.Close()
-                       _, err = io.Copy(w, fsFile)
-                       if err != nil {
-                               return err
-                       }
-               }
-               return nil
-       })
-       if err != nil {
-               return nil, err
-       }
-       err = zwr.Close()
-       if err != nil {
-               return nil, err
-       }
-       return buf.Bytes(), nil
-}
diff --git a/tools/zipf_test.go b/tools/zipf_test.go
deleted file mode 100644
index 6b07592..0000000
--- a/tools/zipf_test.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package tools
-
-import (
-       "testing"
-)
-
-func TestGenerateOutputFileName(t *testing.T) {
-       t.Run("NoMainFiles", func(t *testing.T) {
-               // Test case where there are no main files in the folder
-               result, err := generateOutputFileName("testdata/no_main_files/")
-               if err != nil {
-                       t.Errorf("Unexpected error: %v", err)
-               }
-               expected := "no_main_files.zip"
-               if result != expected {
-                       t.Errorf("Expected: %s, but got: %s", expected, result)
-               }
-       })
-
-       t.Run("JavaScriptMainFile", func(t *testing.T) {
-               // Test case where there is a JavaScript main file
-               result, err := generateOutputFileName("testdata/js_main/")
-               if err != nil {
-                       t.Errorf("Unexpected error: %v", err)
-               }
-               expected := "js_main.js.zip"
-               if result != expected {
-                       t.Errorf("Expected: %s, but got: %s", expected, result)
-               }
-       })
-
-       // t.Run("PythonMainFile", func(t *testing.T) {
-       //      // Test case where there is a Python main file
-       //      result, err := generateOutputFileName("testdata/py_main/")
-       //      if err != nil {
-       //              t.Errorf("Unexpected error: %v", err)
-       //      }
-       //      expected := "py_main.py.zip"
-       //      if result != expected {
-       //              t.Errorf("Expected: %s, but got: %s", expected, result)
-       //      }
-       // })
-
-}
diff --git a/validate/Taskfile.yaml b/validate/Taskfile.yaml
deleted file mode 100644
index 87cf9ff..0000000
--- a/validate/Taskfile.yaml
+++ /dev/null
@@ -1,116 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-version: '3'
-
-vars:
-    VER:
-        sh: git describe --tags --abbrev=0 2>/dev/null || git rev-parse 
--short HEAD
-
-tasks:
-    default: task --list-all
-
-    pre:
-      - docker login
- 
-    validate:
-      silent: true
-      cmds:
-      - echo === "{{.IMG}}"
-      - >
-        cat validate.sh 
-        | docker run -i "{{.IMG}}" 
-        env VER="{{.VER}}" EXT="{{.EXT}}" ARCH={{ARCH}} bash -
-
-    ro9:
-      - task: validate
-        vars:
-            EXT: ".rpm"
-            IMG: "rockylinux:9"
-    
-    ubi9:
-      - task: validate
-        vars:
-            EXT: ".rpm"
-            IMG: "registry.access.redhat.com/ubi9/ubi:latest"
-     
-    ostumble:
-      - task: validate
-        vars:
-            EXT: ".rpm"
-            IMG: "opensuse/tumbleweed:latest"
-
-    ub22:
-      - task: validate
-        vars:
-            EXT: ".deb"
-            IMG: "ubuntu:22.04"
-
-    de12:
-      - task: validate
-        vars:
-            EXT: ".deb"
-            IMG: "debian:12"
-
-    ro8:
-      - task: validate
-        vars:
-            EXT: "_redhat8.rpm"
-            IMG: "rockylinux:8"
-
-    ubi8:
-      - task: validate
-        vars:
-            EXT: "_redhat8.rpm"
-            IMG: "registry.access.redhat.com/ubi8/ubi:latest"
-   
-    os15:
-      - task: validate
-        vars:
-            EXT: "_redhat8.rpm"
-            IMG: "opensuse/leap:latest"
-    ub20:
-      - task: validate
-        vars:
-            EXT: "_ubuntu20.deb"
-            IMG: "ubuntu:20.04"
-
-    de11:
-      - task: validate
-        vars:
-            EXT: "_ubuntu20.deb"
-            IMG: "debian:11"
-
-    osleap:
-      - task: validate
-        vars:
-            EXT: "_redhat8.rpm"
-            IMG: "opensuse/leap:latest"
-
-
-    all:
-     - task: pre
-     - task: ub22
-     - task: ub20
-     - task: ubi9
-     - task: ubi8
-     - task: de12
-     - task: de11
-     - task: ro9
-     - task: ro8
-     - task: osleap
-     - task: ostumble
diff --git a/validate/validate.sh b/validate/validate.sh
deleted file mode 100644
index afa65b1..0000000
--- a/validate/validate.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#VER=3.0.1-beta.2310151130
-#EXT=.rpm
-
-URL=https://github.com/nuvolaris/nuv/releases/download/$VER/nuv_${VER}_${ARCH}${EXT}
 >nuv${EXT}
-echo $(basename $URL)
-
-case "$EXT" in 
-  *.deb)
-    apt-get update >/dev/null 2>/dev/null && apt-get install -y curl 
>/dev/null 2>/dev/null
-    export INST="dpkg -i"
-  ;;
-  *.rpm) 
-    export INST="rpm -i"
-  ;;
-esac
-
-curl -sL "$URL" >nuv${EXT}
-$INST "nuv${EXT}" >/dev/null 2>/dev/null
-nuv -v >/dev/null 2>/dev/null
-
-if nuv -info | grep "NUV_VERSION: $VER"
-then exit 0
-else exit 1
-fi
-


Reply via email to