From c0f81af8caedef1bd514804f505c57f4bf58638e Mon Sep 17 00:00:00 2001
From: Administrator <1051256694@qq.com>
Date: 星期六, 04 四月 2026 00:24:08 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/lggslasrs' into lggslasrs
---
src/main/java/com/zy/iot/entity/IotPublishRecord.java | 89 +
src/main/java/com/zy/iot/service/impl/IotPublishRecordServiceImpl.java | 66
src/main/java/com/zy/asrs/entity/param/MesToCombParam.java | 2
.gitignore | 2320 ++++++++++++++++++++++++++++++++
src/main/java/com/zy/iot/constant/IotConstants.java | 36
src/main/java/com/zy/asrs/service/impl/ExternalTaskFacadeServiceImpl.java | 108 +
src/main/java/com/zy/integration/iot/util/IotMqttSslUtils.java | 87 +
src/main/java/com/zy/integration/iot/handler/impl/IotInboundMessageHandlerImpl.java | 57
src/main/java/com/zy/iot/entity/IotInstructionMessage.java | 21
src/main/java/com/zy/integration/iot/publish/impl/IotPublishServiceImpl.java | 61
src/test/java/com/zy/integration/iot/IotSupportTest.java | 31
src/main/java/com/zy/common/web/WcsController.java | 289 ++-
pom.xml | 15
.local/mqtt-smoke/AwsIotConnectRunner.java | 81 +
src/main/java/com/zy/asrs/utils/Utils.java | 10
src/main/java/com/zy/integration/iot/client/impl/PahoIotMqttClient.java | 205 ++
src/main/java/com/zy/iot/service/IotPublishRecordService.java | 15
.local/mqtt-smoke/bin/AwsIotConnectRunner$1.class | 0
src/main/java/com/zy/iot/util/IotInstructionIdGenerator.java | 30
src/main/java/com/zy/iot/entity/IotTopicConfig.java | 19
.local/mqtt-smoke/bin/AwsIotConnectRunner.class | 0
src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java | 439 ++++++
src/main/java/com/zy/integration/iot/client/IotMqttClient.java | 10
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java | 5
src/main/java/com/zy/iot/mapper/IotPublishRecordMapper.java | 11
src/main/java/com/zy/asrs/controller/OpenController.java | 1
src/main/java/com/zy/integration/iot/publish/IotPublishService.java | 6
src/main/java/com/zy/integration/iot/handler/IotInboundMessageHandler.java | 6
src/main/java/com/zy/iot/entity/IotFeedbackMessage.java | 17
src/main/java/com/zy/iot/config/IotProperties.java | 69
src/main/java/com/zy/integration/iot/task/IotPendingPublishScheduler.java | 49
src/main/java/com/zy/asrs/service/ExternalTaskFacadeService.java | 12
src/main/java/com/zy/integration/iot/biz/IotInstructionService.java | 16
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | 15
src/main/resources/sql/20260324_asr_iot_publish_record.sql | 47
src/main/resources/application.yml | 33
36 files changed, 4,153 insertions(+), 125 deletions(-)
diff --git a/.gitignore b/.gitignore
index 9224005..94ddff7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,2323 @@
### LOG ###
stock
LOG_PATH_IS_UNDEFINED
+/.local/mqtt-smoke/bin/LocalMqttSmokeRunner$1.class
+/.local/mqtt-smoke/bin/LocalMqttSmokeRunner.class
+/.local/mqtt-smoke/certs/ca.crt
+/.local/mqtt-smoke/certs/ca.key
+/.local/mqtt-smoke/certs/ca.srl
+/.local/mqtt-smoke/certs/client.crt
+/.local/mqtt-smoke/certs/client.csr
+/.local/mqtt-smoke/certs/client.key
+/.local/mqtt-smoke/certs/client_ext.cnf
+/.local/mqtt-smoke/certs/server.crt
+/.local/mqtt-smoke/certs/server.csr
+/.local/mqtt-smoke/certs/server.key
+/.local/mqtt-smoke/certs/server_ext.cnf
+/.local/mqtt-smoke/messages/egress-stow.json
+/.local/mqtt-smoke/mosquitto/mosquitto.conf
+/.local/mqtt-smoke/classpath.txt
+/.local/mqtt-smoke/LocalMqttSmokeRunner.java
+/.local/node/node_modules/corepack/dist/lib/corepack.cjs
+/.local/node/node_modules/corepack/dist/corepack.js
+/.local/node/node_modules/corepack/dist/npm.js
+/.local/node/node_modules/corepack/dist/npx.js
+/.local/node/node_modules/corepack/dist/pnpm.js
+/.local/node/node_modules/corepack/dist/pnpx.js
+/.local/node/node_modules/corepack/dist/yarn.js
+/.local/node/node_modules/corepack/dist/yarnpkg.js
+/.local/node/node_modules/corepack/shims/nodewin/corepack
+/.local/node/node_modules/corepack/shims/nodewin/corepack.cmd
+/.local/node/node_modules/corepack/shims/nodewin/corepack.ps1
+/.local/node/node_modules/corepack/shims/nodewin/npm
+/.local/node/node_modules/corepack/shims/nodewin/npm.cmd
+/.local/node/node_modules/corepack/shims/nodewin/npm.ps1
+/.local/node/node_modules/corepack/shims/nodewin/npx
+/.local/node/node_modules/corepack/shims/nodewin/npx.cmd
+/.local/node/node_modules/corepack/shims/nodewin/npx.ps1
+/.local/node/node_modules/corepack/shims/nodewin/pnpm
+/.local/node/node_modules/corepack/shims/nodewin/pnpm.cmd
+/.local/node/node_modules/corepack/shims/nodewin/pnpm.ps1
+/.local/node/node_modules/corepack/shims/nodewin/pnpx
+/.local/node/node_modules/corepack/shims/nodewin/pnpx.cmd
+/.local/node/node_modules/corepack/shims/nodewin/pnpx.ps1
+/.local/node/node_modules/corepack/shims/nodewin/yarn
+/.local/node/node_modules/corepack/shims/nodewin/yarn.cmd
+/.local/node/node_modules/corepack/shims/nodewin/yarn.ps1
+/.local/node/node_modules/corepack/shims/nodewin/yarnpkg
+/.local/node/node_modules/corepack/shims/nodewin/yarnpkg.cmd
+/.local/node/node_modules/corepack/shims/nodewin/yarnpkg.ps1
+/.local/node/node_modules/corepack/shims/corepack
+/.local/node/node_modules/corepack/shims/corepack.cmd
+/.local/node/node_modules/corepack/shims/corepack.ps1
+/.local/node/node_modules/corepack/shims/npm
+/.local/node/node_modules/corepack/shims/npm.cmd
+/.local/node/node_modules/corepack/shims/npm.ps1
+/.local/node/node_modules/corepack/shims/npx
+/.local/node/node_modules/corepack/shims/npx.cmd
+/.local/node/node_modules/corepack/shims/npx.ps1
+/.local/node/node_modules/corepack/shims/pnpm
+/.local/node/node_modules/corepack/shims/pnpm.cmd
+/.local/node/node_modules/corepack/shims/pnpm.ps1
+/.local/node/node_modules/corepack/shims/pnpx
+/.local/node/node_modules/corepack/shims/pnpx.cmd
+/.local/node/node_modules/corepack/shims/pnpx.ps1
+/.local/node/node_modules/corepack/shims/yarn
+/.local/node/node_modules/corepack/shims/yarn.cmd
+/.local/node/node_modules/corepack/shims/yarn.ps1
+/.local/node/node_modules/corepack/shims/yarnpkg
+/.local/node/node_modules/corepack/shims/yarnpkg.cmd
+/.local/node/node_modules/corepack/shims/yarnpkg.ps1
+/.local/node/node_modules/corepack/CHANGELOG.md
+/.local/node/node_modules/corepack/LICENSE.md
+/.local/node/node_modules/corepack/package.json
+/.local/node/node_modules/corepack/README.md
+/.local/node/node_modules/npm/bin/node-gyp-bin/node-gyp
+/.local/node/node_modules/npm/bin/node-gyp-bin/node-gyp.cmd
+/.local/node/node_modules/npm/bin/npm
+/.local/node/node_modules/npm/bin/npm.cmd
+/.local/node/node_modules/npm/bin/npm.ps1
+/.local/node/node_modules/npm/bin/npm-cli.js
+/.local/node/node_modules/npm/bin/npm-prefix.js
+/.local/node/node_modules/npm/bin/npx
+/.local/node/node_modules/npm/bin/npx.cmd
+/.local/node/node_modules/npm/bin/npx.ps1
+/.local/node/node_modules/npm/bin/npx-cli.js
+/.local/node/node_modules/npm/docs/content/commands/npm.md
+/.local/node/node_modules/npm/docs/content/commands/npm-access.md
+/.local/node/node_modules/npm/docs/content/commands/npm-adduser.md
+/.local/node/node_modules/npm/docs/content/commands/npm-audit.md
+/.local/node/node_modules/npm/docs/content/commands/npm-bugs.md
+/.local/node/node_modules/npm/docs/content/commands/npm-cache.md
+/.local/node/node_modules/npm/docs/content/commands/npm-ci.md
+/.local/node/node_modules/npm/docs/content/commands/npm-completion.md
+/.local/node/node_modules/npm/docs/content/commands/npm-config.md
+/.local/node/node_modules/npm/docs/content/commands/npm-dedupe.md
+/.local/node/node_modules/npm/docs/content/commands/npm-deprecate.md
+/.local/node/node_modules/npm/docs/content/commands/npm-diff.md
+/.local/node/node_modules/npm/docs/content/commands/npm-dist-tag.md
+/.local/node/node_modules/npm/docs/content/commands/npm-docs.md
+/.local/node/node_modules/npm/docs/content/commands/npm-doctor.md
+/.local/node/node_modules/npm/docs/content/commands/npm-edit.md
+/.local/node/node_modules/npm/docs/content/commands/npm-exec.md
+/.local/node/node_modules/npm/docs/content/commands/npm-explain.md
+/.local/node/node_modules/npm/docs/content/commands/npm-explore.md
+/.local/node/node_modules/npm/docs/content/commands/npm-find-dupes.md
+/.local/node/node_modules/npm/docs/content/commands/npm-fund.md
+/.local/node/node_modules/npm/docs/content/commands/npm-help.md
+/.local/node/node_modules/npm/docs/content/commands/npm-help-search.md
+/.local/node/node_modules/npm/docs/content/commands/npm-hook.md
+/.local/node/node_modules/npm/docs/content/commands/npm-init.md
+/.local/node/node_modules/npm/docs/content/commands/npm-install.md
+/.local/node/node_modules/npm/docs/content/commands/npm-install-ci-test.md
+/.local/node/node_modules/npm/docs/content/commands/npm-install-test.md
+/.local/node/node_modules/npm/docs/content/commands/npm-link.md
+/.local/node/node_modules/npm/docs/content/commands/npm-login.md
+/.local/node/node_modules/npm/docs/content/commands/npm-logout.md
+/.local/node/node_modules/npm/docs/content/commands/npm-ls.md
+/.local/node/node_modules/npm/docs/content/commands/npm-org.md
+/.local/node/node_modules/npm/docs/content/commands/npm-outdated.md
+/.local/node/node_modules/npm/docs/content/commands/npm-owner.md
+/.local/node/node_modules/npm/docs/content/commands/npm-pack.md
+/.local/node/node_modules/npm/docs/content/commands/npm-ping.md
+/.local/node/node_modules/npm/docs/content/commands/npm-pkg.md
+/.local/node/node_modules/npm/docs/content/commands/npm-prefix.md
+/.local/node/node_modules/npm/docs/content/commands/npm-profile.md
+/.local/node/node_modules/npm/docs/content/commands/npm-prune.md
+/.local/node/node_modules/npm/docs/content/commands/npm-publish.md
+/.local/node/node_modules/npm/docs/content/commands/npm-query.md
+/.local/node/node_modules/npm/docs/content/commands/npm-rebuild.md
+/.local/node/node_modules/npm/docs/content/commands/npm-repo.md
+/.local/node/node_modules/npm/docs/content/commands/npm-restart.md
+/.local/node/node_modules/npm/docs/content/commands/npm-root.md
+/.local/node/node_modules/npm/docs/content/commands/npm-run-script.md
+/.local/node/node_modules/npm/docs/content/commands/npm-sbom.md
+/.local/node/node_modules/npm/docs/content/commands/npm-search.md
+/.local/node/node_modules/npm/docs/content/commands/npm-shrinkwrap.md
+/.local/node/node_modules/npm/docs/content/commands/npm-star.md
+/.local/node/node_modules/npm/docs/content/commands/npm-stars.md
+/.local/node/node_modules/npm/docs/content/commands/npm-start.md
+/.local/node/node_modules/npm/docs/content/commands/npm-stop.md
+/.local/node/node_modules/npm/docs/content/commands/npm-team.md
+/.local/node/node_modules/npm/docs/content/commands/npm-test.md
+/.local/node/node_modules/npm/docs/content/commands/npm-token.md
+/.local/node/node_modules/npm/docs/content/commands/npm-uninstall.md
+/.local/node/node_modules/npm/docs/content/commands/npm-unpublish.md
+/.local/node/node_modules/npm/docs/content/commands/npm-unstar.md
+/.local/node/node_modules/npm/docs/content/commands/npm-update.md
+/.local/node/node_modules/npm/docs/content/commands/npm-version.md
+/.local/node/node_modules/npm/docs/content/commands/npm-view.md
+/.local/node/node_modules/npm/docs/content/commands/npm-whoami.md
+/.local/node/node_modules/npm/docs/content/commands/npx.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/folders.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/install.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/npm-shrinkwrap-json.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/npmrc.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/package-json.md
+/.local/node/node_modules/npm/docs/content/configuring-npm/package-lock-json.md
+/.local/node/node_modules/npm/docs/content/using-npm/config.md
+/.local/node/node_modules/npm/docs/content/using-npm/dependency-selectors.md
+/.local/node/node_modules/npm/docs/content/using-npm/developers.md
+/.local/node/node_modules/npm/docs/content/using-npm/logging.md
+/.local/node/node_modules/npm/docs/content/using-npm/orgs.md
+/.local/node/node_modules/npm/docs/content/using-npm/package-spec.md
+/.local/node/node_modules/npm/docs/content/using-npm/registry.md
+/.local/node/node_modules/npm/docs/content/using-npm/removal.md
+/.local/node/node_modules/npm/docs/content/using-npm/scope.md
+/.local/node/node_modules/npm/docs/content/using-npm/scripts.md
+/.local/node/node_modules/npm/docs/content/using-npm/workspaces.md
+/.local/node/node_modules/npm/docs/lib/index.js
+/.local/node/node_modules/npm/docs/output/commands/npm.html
+/.local/node/node_modules/npm/docs/output/commands/npm-access.html
+/.local/node/node_modules/npm/docs/output/commands/npm-adduser.html
+/.local/node/node_modules/npm/docs/output/commands/npm-audit.html
+/.local/node/node_modules/npm/docs/output/commands/npm-bugs.html
+/.local/node/node_modules/npm/docs/output/commands/npm-cache.html
+/.local/node/node_modules/npm/docs/output/commands/npm-ci.html
+/.local/node/node_modules/npm/docs/output/commands/npm-completion.html
+/.local/node/node_modules/npm/docs/output/commands/npm-config.html
+/.local/node/node_modules/npm/docs/output/commands/npm-dedupe.html
+/.local/node/node_modules/npm/docs/output/commands/npm-deprecate.html
+/.local/node/node_modules/npm/docs/output/commands/npm-diff.html
+/.local/node/node_modules/npm/docs/output/commands/npm-dist-tag.html
+/.local/node/node_modules/npm/docs/output/commands/npm-docs.html
+/.local/node/node_modules/npm/docs/output/commands/npm-doctor.html
+/.local/node/node_modules/npm/docs/output/commands/npm-edit.html
+/.local/node/node_modules/npm/docs/output/commands/npm-exec.html
+/.local/node/node_modules/npm/docs/output/commands/npm-explain.html
+/.local/node/node_modules/npm/docs/output/commands/npm-explore.html
+/.local/node/node_modules/npm/docs/output/commands/npm-find-dupes.html
+/.local/node/node_modules/npm/docs/output/commands/npm-fund.html
+/.local/node/node_modules/npm/docs/output/commands/npm-help.html
+/.local/node/node_modules/npm/docs/output/commands/npm-help-search.html
+/.local/node/node_modules/npm/docs/output/commands/npm-hook.html
+/.local/node/node_modules/npm/docs/output/commands/npm-init.html
+/.local/node/node_modules/npm/docs/output/commands/npm-install.html
+/.local/node/node_modules/npm/docs/output/commands/npm-install-ci-test.html
+/.local/node/node_modules/npm/docs/output/commands/npm-install-test.html
+/.local/node/node_modules/npm/docs/output/commands/npm-link.html
+/.local/node/node_modules/npm/docs/output/commands/npm-login.html
+/.local/node/node_modules/npm/docs/output/commands/npm-logout.html
+/.local/node/node_modules/npm/docs/output/commands/npm-ls.html
+/.local/node/node_modules/npm/docs/output/commands/npm-org.html
+/.local/node/node_modules/npm/docs/output/commands/npm-outdated.html
+/.local/node/node_modules/npm/docs/output/commands/npm-owner.html
+/.local/node/node_modules/npm/docs/output/commands/npm-pack.html
+/.local/node/node_modules/npm/docs/output/commands/npm-ping.html
+/.local/node/node_modules/npm/docs/output/commands/npm-pkg.html
+/.local/node/node_modules/npm/docs/output/commands/npm-prefix.html
+/.local/node/node_modules/npm/docs/output/commands/npm-profile.html
+/.local/node/node_modules/npm/docs/output/commands/npm-prune.html
+/.local/node/node_modules/npm/docs/output/commands/npm-publish.html
+/.local/node/node_modules/npm/docs/output/commands/npm-query.html
+/.local/node/node_modules/npm/docs/output/commands/npm-rebuild.html
+/.local/node/node_modules/npm/docs/output/commands/npm-repo.html
+/.local/node/node_modules/npm/docs/output/commands/npm-restart.html
+/.local/node/node_modules/npm/docs/output/commands/npm-root.html
+/.local/node/node_modules/npm/docs/output/commands/npm-run-script.html
+/.local/node/node_modules/npm/docs/output/commands/npm-sbom.html
+/.local/node/node_modules/npm/docs/output/commands/npm-search.html
+/.local/node/node_modules/npm/docs/output/commands/npm-shrinkwrap.html
+/.local/node/node_modules/npm/docs/output/commands/npm-star.html
+/.local/node/node_modules/npm/docs/output/commands/npm-stars.html
+/.local/node/node_modules/npm/docs/output/commands/npm-start.html
+/.local/node/node_modules/npm/docs/output/commands/npm-stop.html
+/.local/node/node_modules/npm/docs/output/commands/npm-team.html
+/.local/node/node_modules/npm/docs/output/commands/npm-test.html
+/.local/node/node_modules/npm/docs/output/commands/npm-token.html
+/.local/node/node_modules/npm/docs/output/commands/npm-uninstall.html
+/.local/node/node_modules/npm/docs/output/commands/npm-unpublish.html
+/.local/node/node_modules/npm/docs/output/commands/npm-unstar.html
+/.local/node/node_modules/npm/docs/output/commands/npm-update.html
+/.local/node/node_modules/npm/docs/output/commands/npm-version.html
+/.local/node/node_modules/npm/docs/output/commands/npm-view.html
+/.local/node/node_modules/npm/docs/output/commands/npm-whoami.html
+/.local/node/node_modules/npm/docs/output/commands/npx.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/folders.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/install.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/npm-global.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/npm-json.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/npmrc.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/package-json.html
+/.local/node/node_modules/npm/docs/output/configuring-npm/package-lock-json.html
+/.local/node/node_modules/npm/docs/output/using-npm/config.html
+/.local/node/node_modules/npm/docs/output/using-npm/dependency-selectors.html
+/.local/node/node_modules/npm/docs/output/using-npm/developers.html
+/.local/node/node_modules/npm/docs/output/using-npm/logging.html
+/.local/node/node_modules/npm/docs/output/using-npm/orgs.html
+/.local/node/node_modules/npm/docs/output/using-npm/package-spec.html
+/.local/node/node_modules/npm/docs/output/using-npm/registry.html
+/.local/node/node_modules/npm/docs/output/using-npm/removal.html
+/.local/node/node_modules/npm/docs/output/using-npm/scope.html
+/.local/node/node_modules/npm/docs/output/using-npm/scripts.html
+/.local/node/node_modules/npm/docs/output/using-npm/workspaces.html
+/.local/node/node_modules/npm/lib/cli/entry.js
+/.local/node/node_modules/npm/lib/cli/exit-handler.js
+/.local/node/node_modules/npm/lib/cli/update-notifier.js
+/.local/node/node_modules/npm/lib/cli/validate-engines.js
+/.local/node/node_modules/npm/lib/commands/access.js
+/.local/node/node_modules/npm/lib/commands/adduser.js
+/.local/node/node_modules/npm/lib/commands/audit.js
+/.local/node/node_modules/npm/lib/commands/bugs.js
+/.local/node/node_modules/npm/lib/commands/cache.js
+/.local/node/node_modules/npm/lib/commands/ci.js
+/.local/node/node_modules/npm/lib/commands/completion.js
+/.local/node/node_modules/npm/lib/commands/config.js
+/.local/node/node_modules/npm/lib/commands/dedupe.js
+/.local/node/node_modules/npm/lib/commands/deprecate.js
+/.local/node/node_modules/npm/lib/commands/diff.js
+/.local/node/node_modules/npm/lib/commands/dist-tag.js
+/.local/node/node_modules/npm/lib/commands/docs.js
+/.local/node/node_modules/npm/lib/commands/doctor.js
+/.local/node/node_modules/npm/lib/commands/edit.js
+/.local/node/node_modules/npm/lib/commands/exec.js
+/.local/node/node_modules/npm/lib/commands/explain.js
+/.local/node/node_modules/npm/lib/commands/explore.js
+/.local/node/node_modules/npm/lib/commands/find-dupes.js
+/.local/node/node_modules/npm/lib/commands/fund.js
+/.local/node/node_modules/npm/lib/commands/get.js
+/.local/node/node_modules/npm/lib/commands/help.js
+/.local/node/node_modules/npm/lib/commands/help-search.js
+/.local/node/node_modules/npm/lib/commands/hook.js
+/.local/node/node_modules/npm/lib/commands/init.js
+/.local/node/node_modules/npm/lib/commands/install.js
+/.local/node/node_modules/npm/lib/commands/install-ci-test.js
+/.local/node/node_modules/npm/lib/commands/install-test.js
+/.local/node/node_modules/npm/lib/commands/link.js
+/.local/node/node_modules/npm/lib/commands/ll.js
+/.local/node/node_modules/npm/lib/commands/login.js
+/.local/node/node_modules/npm/lib/commands/logout.js
+/.local/node/node_modules/npm/lib/commands/ls.js
+/.local/node/node_modules/npm/lib/commands/org.js
+/.local/node/node_modules/npm/lib/commands/outdated.js
+/.local/node/node_modules/npm/lib/commands/owner.js
+/.local/node/node_modules/npm/lib/commands/pack.js
+/.local/node/node_modules/npm/lib/commands/ping.js
+/.local/node/node_modules/npm/lib/commands/pkg.js
+/.local/node/node_modules/npm/lib/commands/prefix.js
+/.local/node/node_modules/npm/lib/commands/profile.js
+/.local/node/node_modules/npm/lib/commands/prune.js
+/.local/node/node_modules/npm/lib/commands/publish.js
+/.local/node/node_modules/npm/lib/commands/query.js
+/.local/node/node_modules/npm/lib/commands/rebuild.js
+/.local/node/node_modules/npm/lib/commands/repo.js
+/.local/node/node_modules/npm/lib/commands/restart.js
+/.local/node/node_modules/npm/lib/commands/root.js
+/.local/node/node_modules/npm/lib/commands/run-script.js
+/.local/node/node_modules/npm/lib/commands/sbom.js
+/.local/node/node_modules/npm/lib/commands/search.js
+/.local/node/node_modules/npm/lib/commands/set.js
+/.local/node/node_modules/npm/lib/commands/shrinkwrap.js
+/.local/node/node_modules/npm/lib/commands/star.js
+/.local/node/node_modules/npm/lib/commands/stars.js
+/.local/node/node_modules/npm/lib/commands/start.js
+/.local/node/node_modules/npm/lib/commands/stop.js
+/.local/node/node_modules/npm/lib/commands/team.js
+/.local/node/node_modules/npm/lib/commands/test.js
+/.local/node/node_modules/npm/lib/commands/token.js
+/.local/node/node_modules/npm/lib/commands/uninstall.js
+/.local/node/node_modules/npm/lib/commands/unpublish.js
+/.local/node/node_modules/npm/lib/commands/unstar.js
+/.local/node/node_modules/npm/lib/commands/update.js
+/.local/node/node_modules/npm/lib/commands/version.js
+/.local/node/node_modules/npm/lib/commands/view.js
+/.local/node/node_modules/npm/lib/commands/whoami.js
+/.local/node/node_modules/npm/lib/utils/audit-error.js
+/.local/node/node_modules/npm/lib/utils/auth.js
+/.local/node/node_modules/npm/lib/utils/cmd-list.js
+/.local/node/node_modules/npm/lib/utils/completion.fish
+/.local/node/node_modules/npm/lib/utils/completion.sh
+/.local/node/node_modules/npm/lib/utils/did-you-mean.js
+/.local/node/node_modules/npm/lib/utils/display.js
+/.local/node/node_modules/npm/lib/utils/error-message.js
+/.local/node/node_modules/npm/lib/utils/explain-dep.js
+/.local/node/node_modules/npm/lib/utils/explain-eresolve.js
+/.local/node/node_modules/npm/lib/utils/format.js
+/.local/node/node_modules/npm/lib/utils/format-bytes.js
+/.local/node/node_modules/npm/lib/utils/format-search-stream.js
+/.local/node/node_modules/npm/lib/utils/get-identity.js
+/.local/node/node_modules/npm/lib/utils/get-workspaces.js
+/.local/node/node_modules/npm/lib/utils/installed-deep.js
+/.local/node/node_modules/npm/lib/utils/installed-shallow.js
+/.local/node/node_modules/npm/lib/utils/is-windows.js
+/.local/node/node_modules/npm/lib/utils/log-file.js
+/.local/node/node_modules/npm/lib/utils/npm-usage.js
+/.local/node/node_modules/npm/lib/utils/open-url.js
+/.local/node/node_modules/npm/lib/utils/output-error.js
+/.local/node/node_modules/npm/lib/utils/ping.js
+/.local/node/node_modules/npm/lib/utils/queryable.js
+/.local/node/node_modules/npm/lib/utils/read-user-info.js
+/.local/node/node_modules/npm/lib/utils/reify-finish.js
+/.local/node/node_modules/npm/lib/utils/reify-output.js
+/.local/node/node_modules/npm/lib/utils/sbom-cyclonedx.js
+/.local/node/node_modules/npm/lib/utils/sbom-spdx.js
+/.local/node/node_modules/npm/lib/utils/tar.js
+/.local/node/node_modules/npm/lib/utils/timers.js
+/.local/node/node_modules/npm/lib/utils/update-workspaces.js
+/.local/node/node_modules/npm/lib/utils/validate-lockfile.js
+/.local/node/node_modules/npm/lib/utils/verify-signatures.js
+/.local/node/node_modules/npm/lib/arborist-cmd.js
+/.local/node/node_modules/npm/lib/base-cmd.js
+/.local/node/node_modules/npm/lib/cli.js
+/.local/node/node_modules/npm/lib/lifecycle-cmd.js
+/.local/node/node_modules/npm/lib/npm.js
+/.local/node/node_modules/npm/lib/package-url-cmd.js
+/.local/node/node_modules/npm/man/man1/npm.1
+/.local/node/node_modules/npm/man/man1/npm-access.1
+/.local/node/node_modules/npm/man/man1/npm-adduser.1
+/.local/node/node_modules/npm/man/man1/npm-audit.1
+/.local/node/node_modules/npm/man/man1/npm-bugs.1
+/.local/node/node_modules/npm/man/man1/npm-cache.1
+/.local/node/node_modules/npm/man/man1/npm-ci.1
+/.local/node/node_modules/npm/man/man1/npm-completion.1
+/.local/node/node_modules/npm/man/man1/npm-config.1
+/.local/node/node_modules/npm/man/man1/npm-dedupe.1
+/.local/node/node_modules/npm/man/man1/npm-deprecate.1
+/.local/node/node_modules/npm/man/man1/npm-diff.1
+/.local/node/node_modules/npm/man/man1/npm-dist-tag.1
+/.local/node/node_modules/npm/man/man1/npm-docs.1
+/.local/node/node_modules/npm/man/man1/npm-doctor.1
+/.local/node/node_modules/npm/man/man1/npm-edit.1
+/.local/node/node_modules/npm/man/man1/npm-exec.1
+/.local/node/node_modules/npm/man/man1/npm-explain.1
+/.local/node/node_modules/npm/man/man1/npm-explore.1
+/.local/node/node_modules/npm/man/man1/npm-find-dupes.1
+/.local/node/node_modules/npm/man/man1/npm-fund.1
+/.local/node/node_modules/npm/man/man1/npm-help.1
+/.local/node/node_modules/npm/man/man1/npm-help-search.1
+/.local/node/node_modules/npm/man/man1/npm-hook.1
+/.local/node/node_modules/npm/man/man1/npm-init.1
+/.local/node/node_modules/npm/man/man1/npm-install.1
+/.local/node/node_modules/npm/man/man1/npm-install-ci-test.1
+/.local/node/node_modules/npm/man/man1/npm-install-test.1
+/.local/node/node_modules/npm/man/man1/npm-link.1
+/.local/node/node_modules/npm/man/man1/npm-login.1
+/.local/node/node_modules/npm/man/man1/npm-logout.1
+/.local/node/node_modules/npm/man/man1/npm-ls.1
+/.local/node/node_modules/npm/man/man1/npm-org.1
+/.local/node/node_modules/npm/man/man1/npm-outdated.1
+/.local/node/node_modules/npm/man/man1/npm-owner.1
+/.local/node/node_modules/npm/man/man1/npm-pack.1
+/.local/node/node_modules/npm/man/man1/npm-ping.1
+/.local/node/node_modules/npm/man/man1/npm-pkg.1
+/.local/node/node_modules/npm/man/man1/npm-prefix.1
+/.local/node/node_modules/npm/man/man1/npm-profile.1
+/.local/node/node_modules/npm/man/man1/npm-prune.1
+/.local/node/node_modules/npm/man/man1/npm-publish.1
+/.local/node/node_modules/npm/man/man1/npm-query.1
+/.local/node/node_modules/npm/man/man1/npm-rebuild.1
+/.local/node/node_modules/npm/man/man1/npm-repo.1
+/.local/node/node_modules/npm/man/man1/npm-restart.1
+/.local/node/node_modules/npm/man/man1/npm-root.1
+/.local/node/node_modules/npm/man/man1/npm-run-script.1
+/.local/node/node_modules/npm/man/man1/npm-sbom.1
+/.local/node/node_modules/npm/man/man1/npm-search.1
+/.local/node/node_modules/npm/man/man1/npm-shrinkwrap.1
+/.local/node/node_modules/npm/man/man1/npm-star.1
+/.local/node/node_modules/npm/man/man1/npm-stars.1
+/.local/node/node_modules/npm/man/man1/npm-start.1
+/.local/node/node_modules/npm/man/man1/npm-stop.1
+/.local/node/node_modules/npm/man/man1/npm-team.1
+/.local/node/node_modules/npm/man/man1/npm-test.1
+/.local/node/node_modules/npm/man/man1/npm-token.1
+/.local/node/node_modules/npm/man/man1/npm-uninstall.1
+/.local/node/node_modules/npm/man/man1/npm-unpublish.1
+/.local/node/node_modules/npm/man/man1/npm-unstar.1
+/.local/node/node_modules/npm/man/man1/npm-update.1
+/.local/node/node_modules/npm/man/man1/npm-version.1
+/.local/node/node_modules/npm/man/man1/npm-view.1
+/.local/node/node_modules/npm/man/man1/npm-whoami.1
+/.local/node/node_modules/npm/man/man1/npx.1
+/.local/node/node_modules/npm/man/man5/folders.5
+/.local/node/node_modules/npm/man/man5/install.5
+/.local/node/node_modules/npm/man/man5/npm-global.5
+/.local/node/node_modules/npm/man/man5/npm-json.5
+/.local/node/node_modules/npm/man/man5/npm-shrinkwrap-json.5
+/.local/node/node_modules/npm/man/man5/npmrc.5
+/.local/node/node_modules/npm/man/man5/package-json.5
+/.local/node/node_modules/npm/man/man5/package-lock-json.5
+/.local/node/node_modules/npm/man/man7/config.7
+/.local/node/node_modules/npm/man/man7/dependency-selectors.7
+/.local/node/node_modules/npm/man/man7/developers.7
+/.local/node/node_modules/npm/man/man7/logging.7
+/.local/node/node_modules/npm/man/man7/orgs.7
+/.local/node/node_modules/npm/man/man7/package-spec.7
+/.local/node/node_modules/npm/man/man7/registry.7
+/.local/node/node_modules/npm/man/man7/removal.7
+/.local/node/node_modules/npm/man/man7/scope.7
+/.local/node/node_modules/npm/man/man7/scripts.7
+/.local/node/node_modules/npm/man/man7/workspaces.7
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/license
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/RGI_Emoji.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/es2015/text.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/LICENSE-MIT.txt
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/RGI_Emoji.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex/text.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width/license
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi/license
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/index.mjs
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/LICENSE.txt
+/.local/node/node_modules/npm/node_modules/@isaacs/cliui/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/@isaacs/fs-minipass/package.json
+/.local/node/node_modules/npm/node_modules/@isaacs/string-locale-compare/index.js
+/.local/node/node_modules/npm/node_modules/@isaacs/string-locale-compare/LICENSE
+/.local/node/node_modules/npm/node_modules/@isaacs/string-locale-compare/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/agents.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/dns.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/errors.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/options.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/lib/proxy.js
+/.local/node/node_modules/npm/node_modules/@npmcli/agent/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/lib/logging.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/lib/options.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/lib/print-tree.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/lib/timers.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/actual.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/audit.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/funding.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/ideal.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/license.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/prune.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/reify.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/shrinkwrap.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/bin/virtual.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/load-actual.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/rebuild.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/add-rm-pkg-deps.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/audit-report.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/calc-dep-flags.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/can-place-dep.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/case-insensitive-map.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/consistent-resolve.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/debug.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/deepest-nesting-target.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/dep-valid.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/diff.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/edge.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/from-path.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/gather-dep-set.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/inventory.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/link.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/node.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/optional-set.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/override-resolves.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/override-set.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/packument-cache.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/peer-entry-sets.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/place-dep.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/printable.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/query-selector-all.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/realpath.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/relpath.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/reset-dep-flags.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/retire-path.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/shrinkwrap.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/signal-handling.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/signals.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/spec-from-lock.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/tracker.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/tree-check.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/version-from-tgz.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/vuln.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/lib/yarn-lock.js
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/LICENSE.md
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/arborist/README.md
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/definitions/definition.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/definitions/definitions.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/definitions/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/env-replace.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/errors.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/nerf-dart.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/parse-field.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/set-envs.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/type-defs.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/type-description.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/lib/umask.js
+/.local/node/node_modules/npm/node_modules/@npmcli/config/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/config/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/config/README.md
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/common/get-options.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/common/node.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/cp/errors.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/cp/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/cp/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/cp/polyfill.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/move-file.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/readdir-scoped.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/lib/with-temp-dir.js
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/LICENSE.md
+/.local/node/node_modules/npm/node_modules/@npmcli/fs/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/clone.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/errors.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/find.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/is.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/is-clean.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/lines-to-revs.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/make-error.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/opts.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/revs.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/spawn.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/utils.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/lib/which.js
+/.local/node/node_modules/npm/node_modules/@npmcli/git/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/git/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/installed-package-contents/bin/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/installed-package-contents/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/installed-package-contents/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/installed-package-contents/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/installed-package-contents/README.md
+/.local/node/node_modules/npm/node_modules/@npmcli/map-workspaces/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/map-workspaces/LICENSE.md
+/.local/node/node_modules/npm/node_modules/@npmcli/map-workspaces/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/lib/advisory.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/lib/get-dep-spec.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/lib/hash.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/metavuln-calculator/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/name-from-folder/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/name-from-folder/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/name-from-folder/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/node-gyp/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/node-gyp/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/node-gyp/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/normalize.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/normalize-data.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/read-package.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/sort.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/update-dependencies.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/update-scripts.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/lib/update-workspaces.js
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/package-json/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/promise-spawn/lib/escape.js
+/.local/node/node_modules/npm/node_modules/@npmcli/promise-spawn/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/promise-spawn/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/promise-spawn/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/query/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/query/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/query/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/deep-map.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/error.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/index.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/matchers.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/server.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/lib/utils.js
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/redact/package.json
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node-gyp
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node-gyp.cmd
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/is-server-package.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/make-spawn-args.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/package-envs.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/run-script.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/run-script-pkg.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/set-path.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/signal-manager.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/lib/validate-options.js
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/LICENSE
+/.local/node/node_modules/npm/node_modules/@npmcli/run-script/package.json
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/is-default-value.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/limit-long-syntax.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/negate.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/no-repeated-options.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/ordered-options.mjs
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/examples/simple-hard-coded.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/internal/errors.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/internal/primordials.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/internal/util.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/internal/validators.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/index.js
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/LICENSE
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/package.json
+/.local/node/node_modules/npm/node_modules/@pkgjs/parseargs/utils.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/api/field_behavior.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/any.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/descriptor.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/google/protobuf/timestamp.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/dsse.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/entry.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/hashedrekord.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/rekor/v2/verifier.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/envelope.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/events.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_bundle.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_common.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_rekor.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_trustroot.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/__generated__/sigstore_verification.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/dist/index.js
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/LICENSE
+/.local/node/node_modules/npm/node_modules/@sigstore/protobuf-specs/package.json
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/dist/appdata.js
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/dist/client.js
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/dist/error.js
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/dist/index.js
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/dist/target.js
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/LICENSE
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/package.json
+/.local/node/node_modules/npm/node_modules/@sigstore/tuf/seeds.json
+/.local/node/node_modules/npm/node_modules/@tufjs/canonical-json/lib/index.js
+/.local/node/node_modules/npm/node_modules/@tufjs/canonical-json/LICENSE
+/.local/node/node_modules/npm/node_modules/@tufjs/canonical-json/package.json
+/.local/node/node_modules/npm/node_modules/abbrev/lib/index.js
+/.local/node/node_modules/npm/node_modules/abbrev/LICENSE
+/.local/node/node_modules/npm/node_modules/abbrev/package.json
+/.local/node/node_modules/npm/node_modules/agent-base/dist/helpers.js
+/.local/node/node_modules/npm/node_modules/agent-base/dist/index.js
+/.local/node/node_modules/npm/node_modules/agent-base/LICENSE
+/.local/node/node_modules/npm/node_modules/agent-base/package.json
+/.local/node/node_modules/npm/node_modules/ansi-regex/index.js
+/.local/node/node_modules/npm/node_modules/ansi-regex/license
+/.local/node/node_modules/npm/node_modules/ansi-regex/package.json
+/.local/node/node_modules/npm/node_modules/ansi-styles/index.js
+/.local/node/node_modules/npm/node_modules/ansi-styles/license
+/.local/node/node_modules/npm/node_modules/ansi-styles/package.json
+/.local/node/node_modules/npm/node_modules/aproba/index.js
+/.local/node/node_modules/npm/node_modules/aproba/LICENSE
+/.local/node/node_modules/npm/node_modules/aproba/package.json
+/.local/node/node_modules/npm/node_modules/archy/examples/beep.js
+/.local/node/node_modules/npm/node_modules/archy/examples/multi_line.js
+/.local/node/node_modules/npm/node_modules/archy/index.js
+/.local/node/node_modules/npm/node_modules/archy/LICENSE
+/.local/node/node_modules/npm/node_modules/archy/package.json
+/.local/node/node_modules/npm/node_modules/balanced-match/index.js
+/.local/node/node_modules/npm/node_modules/balanced-match/LICENSE.md
+/.local/node/node_modules/npm/node_modules/balanced-match/package.json
+/.local/node/node_modules/npm/node_modules/bin-links/lib/bin-target.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/check-bin.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/check-bins.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/fix-bin.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/get-node-modules.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/get-paths.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/get-prefix.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/index.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/is-windows.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/link-bin.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/link-bins.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/link-gently.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/link-mans.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/man-target.js
+/.local/node/node_modules/npm/node_modules/bin-links/lib/shim-bin.js
+/.local/node/node_modules/npm/node_modules/bin-links/LICENSE
+/.local/node/node_modules/npm/node_modules/bin-links/package.json
+/.local/node/node_modules/npm/node_modules/binary-extensions/binary-extensions.json
+/.local/node/node_modules/npm/node_modules/binary-extensions/index.js
+/.local/node/node_modules/npm/node_modules/binary-extensions/license
+/.local/node/node_modules/npm/node_modules/binary-extensions/package.json
+/.local/node/node_modules/npm/node_modules/brace-expansion/index.js
+/.local/node/node_modules/npm/node_modules/brace-expansion/LICENSE
+/.local/node/node_modules/npm/node_modules/brace-expansion/package.json
+/.local/node/node_modules/npm/node_modules/cacache/lib/content/path.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/content/read.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/content/rm.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/content/write.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/util/glob.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/util/hash-to-segments.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/util/tmp.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/entry-index.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/get.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/index.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/memoization.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/put.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/rm.js
+/.local/node/node_modules/npm/node_modules/cacache/lib/verify.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/LICENSE.md
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/chownr/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/bin.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/find-made.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/index.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/path-arg.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/src/use-native.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/cjs/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/find-made.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/index.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/opts-arg.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/path-arg.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/dist/mjs/use-native.js.map
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/LICENSE
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/mkdirp/readme.markdown
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/create.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/cwd-error.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/extract.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/get-write-flag.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/header.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/large-numbers.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/list.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/make-command.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mkdir.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/mode-fix.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-unicode.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/normalize-windows-path.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/options.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pack.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/parse.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/path-reservations.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/pax.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/read-entry.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/replace.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-absolute-path.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/strip-trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/symlink-error.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/types.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/unpack.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/update.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/warn-method.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/winchars.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/commonjs/write-entry.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/create.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/cwd-error.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/extract.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/get-write-flag.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/header.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/large-numbers.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/list.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/make-command.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/mkdir.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/mode-fix.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/normalize-unicode.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/normalize-windows-path.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/options.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/pack.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/parse.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/path-reservations.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/pax.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/read-entry.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/replace.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/strip-absolute-path.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/strip-trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/symlink-error.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/types.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/unpack.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/update.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/warn-method.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/winchars.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/dist/esm/write-entry.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/LICENSE
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/tar/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/LICENSE.md
+/.local/node/node_modules/npm/node_modules/cacache/node_modules/yallist/package.json
+/.local/node/node_modules/npm/node_modules/cacache/LICENSE.md
+/.local/node/node_modules/npm/node_modules/cacache/package.json
+/.local/node/node_modules/npm/node_modules/chalk/source/vendor/ansi-styles/index.js
+/.local/node/node_modules/npm/node_modules/chalk/source/vendor/supports-color/browser.js
+/.local/node/node_modules/npm/node_modules/chalk/source/vendor/supports-color/index.js
+/.local/node/node_modules/npm/node_modules/chalk/source/index.js
+/.local/node/node_modules/npm/node_modules/chalk/source/utilities.js
+/.local/node/node_modules/npm/node_modules/chalk/license
+/.local/node/node_modules/npm/node_modules/chalk/package.json
+/.local/node/node_modules/npm/node_modules/chownr/chownr.js
+/.local/node/node_modules/npm/node_modules/chownr/LICENSE
+/.local/node/node_modules/npm/node_modules/chownr/package.json
+/.local/node/node_modules/npm/node_modules/ci-info/index.js
+/.local/node/node_modules/npm/node_modules/ci-info/LICENSE
+/.local/node/node_modules/npm/node_modules/ci-info/package.json
+/.local/node/node_modules/npm/node_modules/ci-info/vendors.json
+/.local/node/node_modules/npm/node_modules/cidr-regex/dist/index.js
+/.local/node/node_modules/npm/node_modules/cidr-regex/LICENSE
+/.local/node/node_modules/npm/node_modules/cidr-regex/package.json
+/.local/node/node_modules/npm/node_modules/cli-columns/color.js
+/.local/node/node_modules/npm/node_modules/cli-columns/index.js
+/.local/node/node_modules/npm/node_modules/cli-columns/license
+/.local/node/node_modules/npm/node_modules/cli-columns/package.json
+/.local/node/node_modules/npm/node_modules/cli-columns/test.js
+/.local/node/node_modules/npm/node_modules/cmd-shim/lib/index.js
+/.local/node/node_modules/npm/node_modules/cmd-shim/lib/to-batch-syntax.js
+/.local/node/node_modules/npm/node_modules/cmd-shim/LICENSE
+/.local/node/node_modules/npm/node_modules/cmd-shim/package.json
+/.local/node/node_modules/npm/node_modules/color-convert/conversions.js
+/.local/node/node_modules/npm/node_modules/color-convert/index.js
+/.local/node/node_modules/npm/node_modules/color-convert/LICENSE
+/.local/node/node_modules/npm/node_modules/color-convert/package.json
+/.local/node/node_modules/npm/node_modules/color-convert/route.js
+/.local/node/node_modules/npm/node_modules/color-name/index.js
+/.local/node/node_modules/npm/node_modules/color-name/LICENSE
+/.local/node/node_modules/npm/node_modules/color-name/package.json
+/.local/node/node_modules/npm/node_modules/common-ancestor-path/index.js
+/.local/node/node_modules/npm/node_modules/common-ancestor-path/LICENSE
+/.local/node/node_modules/npm/node_modules/common-ancestor-path/package.json
+/.local/node/node_modules/npm/node_modules/cross-spawn/lib/util/escape.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/lib/util/readShebang.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/lib/util/resolveCommand.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/lib/enoent.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/lib/parse.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/node_modules/which/bin/node-which
+/.local/node/node_modules/npm/node_modules/cross-spawn/node_modules/which/LICENSE
+/.local/node/node_modules/npm/node_modules/cross-spawn/node_modules/which/package.json
+/.local/node/node_modules/npm/node_modules/cross-spawn/node_modules/which/README.md
+/.local/node/node_modules/npm/node_modules/cross-spawn/node_modules/which/which.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/index.js
+/.local/node/node_modules/npm/node_modules/cross-spawn/LICENSE
+/.local/node/node_modules/npm/node_modules/cross-spawn/package.json
+/.local/node/node_modules/npm/node_modules/cssesc/bin/cssesc
+/.local/node/node_modules/npm/node_modules/cssesc/man/cssesc.1
+/.local/node/node_modules/npm/node_modules/cssesc/cssesc.js
+/.local/node/node_modules/npm/node_modules/cssesc/LICENSE-MIT.txt
+/.local/node/node_modules/npm/node_modules/cssesc/package.json
+/.local/node/node_modules/npm/node_modules/cssesc/README.md
+/.local/node/node_modules/npm/node_modules/debug/src/browser.js
+/.local/node/node_modules/npm/node_modules/debug/src/common.js
+/.local/node/node_modules/npm/node_modules/debug/src/index.js
+/.local/node/node_modules/npm/node_modules/debug/src/node.js
+/.local/node/node_modules/npm/node_modules/debug/LICENSE
+/.local/node/node_modules/npm/node_modules/debug/package.json
+/.local/node/node_modules/npm/node_modules/diff/dist/diff.js
+/.local/node/node_modules/npm/node_modules/diff/dist/diff.min.js
+/.local/node/node_modules/npm/node_modules/diff/lib/convert/dmp.js
+/.local/node/node_modules/npm/node_modules/diff/lib/convert/xml.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/array.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/base.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/character.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/css.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/json.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/line.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/sentence.js
+/.local/node/node_modules/npm/node_modules/diff/lib/diff/word.js
+/.local/node/node_modules/npm/node_modules/diff/lib/patch/apply.js
+/.local/node/node_modules/npm/node_modules/diff/lib/patch/create.js
+/.local/node/node_modules/npm/node_modules/diff/lib/patch/merge.js
+/.local/node/node_modules/npm/node_modules/diff/lib/patch/parse.js
+/.local/node/node_modules/npm/node_modules/diff/lib/patch/reverse.js
+/.local/node/node_modules/npm/node_modules/diff/lib/util/array.js
+/.local/node/node_modules/npm/node_modules/diff/lib/util/distance-iterator.js
+/.local/node/node_modules/npm/node_modules/diff/lib/util/params.js
+/.local/node/node_modules/npm/node_modules/diff/lib/index.es6.js
+/.local/node/node_modules/npm/node_modules/diff/lib/index.js
+/.local/node/node_modules/npm/node_modules/diff/lib/index.mjs
+/.local/node/node_modules/npm/node_modules/diff/CONTRIBUTING.md
+/.local/node/node_modules/npm/node_modules/diff/LICENSE
+/.local/node/node_modules/npm/node_modules/diff/package.json
+/.local/node/node_modules/npm/node_modules/diff/release-notes.md
+/.local/node/node_modules/npm/node_modules/diff/runtime.js
+/.local/node/node_modules/npm/node_modules/eastasianwidth/eastasianwidth.js
+/.local/node/node_modules/npm/node_modules/eastasianwidth/package.json
+/.local/node/node_modules/npm/node_modules/emoji-regex/es2015/index.js
+/.local/node/node_modules/npm/node_modules/emoji-regex/es2015/text.js
+/.local/node/node_modules/npm/node_modules/emoji-regex/index.js
+/.local/node/node_modules/npm/node_modules/emoji-regex/LICENSE-MIT.txt
+/.local/node/node_modules/npm/node_modules/emoji-regex/package.json
+/.local/node/node_modules/npm/node_modules/emoji-regex/text.js
+/.local/node/node_modules/npm/node_modules/encoding/lib/encoding.js
+/.local/node/node_modules/npm/node_modules/encoding/LICENSE
+/.local/node/node_modules/npm/node_modules/encoding/package.json
+/.local/node/node_modules/npm/node_modules/env-paths/index.js
+/.local/node/node_modules/npm/node_modules/env-paths/license
+/.local/node/node_modules/npm/node_modules/env-paths/package.json
+/.local/node/node_modules/npm/node_modules/err-code/bower.json
+/.local/node/node_modules/npm/node_modules/err-code/index.js
+/.local/node/node_modules/npm/node_modules/err-code/index.umd.js
+/.local/node/node_modules/npm/node_modules/err-code/package.json
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/delay/always/always.delay.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/delay/skip-first/skip-first.delay.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/delay/delay.base.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/delay/delay.factory.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/delay/delay.interface.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/jitter/full/full.jitter.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/jitter/no/no.jitter.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/jitter/jitter.factory.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/backoff.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/dist/options.js
+/.local/node/node_modules/npm/node_modules/exponential-backoff/LICENSE
+/.local/node/node_modules/npm/node_modules/exponential-backoff/package.json
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/esm/mod.js
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/bench.js
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/LICENSE.md
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/mod.js
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/package.json
+/.local/node/node_modules/npm/node_modules/fastest-levenshtein/test.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/commonjs/all-signals.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/commonjs/proxy-signals.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/commonjs/watchdog.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/esm/all-signals.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/esm/proxy-signals.js
+/.local/node/node_modules/npm/node_modules/foreground-child/dist/esm/watchdog.js
+/.local/node/node_modules/npm/node_modules/foreground-child/LICENSE
+/.local/node/node_modules/npm/node_modules/foreground-child/package.json
+/.local/node/node_modules/npm/node_modules/fs-minipass/lib/index.js
+/.local/node/node_modules/npm/node_modules/fs-minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/fs-minipass/package.json
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/glob.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/glob.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/glob.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/glob.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/has-magic.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/has-magic.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/has-magic.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/has-magic.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/ignore.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/ignore.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/ignore.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/ignore.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/index.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/index.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/pattern.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/pattern.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/pattern.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/pattern.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/processor.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/processor.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/processor.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/processor.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/walker.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/walker.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/walker.js
+/.local/node/node_modules/npm/node_modules/glob/dist/commonjs/walker.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/bin.d.mts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/bin.d.mts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/bin.mjs
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/bin.mjs.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/glob.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/glob.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/glob.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/glob.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/has-magic.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/has-magic.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/has-magic.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/has-magic.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/ignore.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/ignore.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/ignore.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/ignore.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/index.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/index.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/pattern.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/pattern.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/pattern.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/pattern.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/processor.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/processor.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/processor.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/processor.js.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/walker.d.ts
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/walker.d.ts.map
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/walker.js
+/.local/node/node_modules/npm/node_modules/glob/dist/esm/walker.js.map
+/.local/node/node_modules/npm/node_modules/glob/LICENSE
+/.local/node/node_modules/npm/node_modules/glob/package.json
+/.local/node/node_modules/npm/node_modules/glob/README.md
+/.local/node/node_modules/npm/node_modules/graceful-fs/clone.js
+/.local/node/node_modules/npm/node_modules/graceful-fs/graceful-fs.js
+/.local/node/node_modules/npm/node_modules/graceful-fs/legacy-streams.js
+/.local/node/node_modules/npm/node_modules/graceful-fs/LICENSE
+/.local/node/node_modules/npm/node_modules/graceful-fs/package.json
+/.local/node/node_modules/npm/node_modules/graceful-fs/polyfills.js
+/.local/node/node_modules/npm/node_modules/hosted-git-info/lib/from-url.js
+/.local/node/node_modules/npm/node_modules/hosted-git-info/lib/hosts.js
+/.local/node/node_modules/npm/node_modules/hosted-git-info/lib/index.js
+/.local/node/node_modules/npm/node_modules/hosted-git-info/lib/parse-url.js
+/.local/node/node_modules/npm/node_modules/hosted-git-info/LICENSE
+/.local/node/node_modules/npm/node_modules/hosted-git-info/package.json
+/.local/node/node_modules/npm/node_modules/http-cache-semantics/index.js
+/.local/node/node_modules/npm/node_modules/http-cache-semantics/LICENSE
+/.local/node/node_modules/npm/node_modules/http-cache-semantics/package.json
+/.local/node/node_modules/npm/node_modules/http-proxy-agent/dist/index.js
+/.local/node/node_modules/npm/node_modules/http-proxy-agent/LICENSE
+/.local/node/node_modules/npm/node_modules/http-proxy-agent/package.json
+/.local/node/node_modules/npm/node_modules/https-proxy-agent/dist/index.js
+/.local/node/node_modules/npm/node_modules/https-proxy-agent/dist/parse-proxy-response.js
+/.local/node/node_modules/npm/node_modules/https-proxy-agent/LICENSE
+/.local/node/node_modules/npm/node_modules/https-proxy-agent/package.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/big5-added.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/cp936.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/cp949.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/cp950.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/eucjp.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/gbk-added.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/tables/shiftjis.json
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/dbcs-codec.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/dbcs-data.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/index.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/internal.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/sbcs-codec.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/sbcs-data.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/sbcs-data-generated.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/utf7.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/utf16.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/encodings/utf32.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/lib/bom-handling.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/lib/index.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/lib/streams.js
+/.local/node/node_modules/npm/node_modules/iconv-lite/LICENSE
+/.local/node/node_modules/npm/node_modules/iconv-lite/package.json
+/.local/node/node_modules/npm/node_modules/ignore-walk/lib/index.js
+/.local/node/node_modules/npm/node_modules/ignore-walk/LICENSE
+/.local/node/node_modules/npm/node_modules/ignore-walk/package.json
+/.local/node/node_modules/npm/node_modules/imurmurhash/imurmurhash.js
+/.local/node/node_modules/npm/node_modules/imurmurhash/imurmurhash.min.js
+/.local/node/node_modules/npm/node_modules/imurmurhash/package.json
+/.local/node/node_modules/npm/node_modules/ini/lib/ini.js
+/.local/node/node_modules/npm/node_modules/ini/LICENSE
+/.local/node/node_modules/npm/node_modules/ini/package.json
+/.local/node/node_modules/npm/node_modules/init-package-json/lib/default-input.js
+/.local/node/node_modules/npm/node_modules/init-package-json/lib/init-package-json.js
+/.local/node/node_modules/npm/node_modules/init-package-json/LICENSE.md
+/.local/node/node_modules/npm/node_modules/init-package-json/package.json
+/.local/node/node_modules/npm/node_modules/ip-address/dist/v4/constants.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/v6/constants.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/v6/helpers.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/v6/regular-expressions.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/address-error.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/common.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/ip-address.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/ipv4.js
+/.local/node/node_modules/npm/node_modules/ip-address/dist/ipv6.js
+/.local/node/node_modules/npm/node_modules/ip-address/LICENSE
+/.local/node/node_modules/npm/node_modules/ip-address/package.json
+/.local/node/node_modules/npm/node_modules/ip-regex/index.js
+/.local/node/node_modules/npm/node_modules/ip-regex/license
+/.local/node/node_modules/npm/node_modules/ip-regex/package.json
+/.local/node/node_modules/npm/node_modules/is-cidr/dist/index.js
+/.local/node/node_modules/npm/node_modules/is-cidr/LICENSE
+/.local/node/node_modules/npm/node_modules/is-cidr/package.json
+/.local/node/node_modules/npm/node_modules/is-fullwidth-code-point/index.js
+/.local/node/node_modules/npm/node_modules/is-fullwidth-code-point/license
+/.local/node/node_modules/npm/node_modules/is-fullwidth-code-point/package.json
+/.local/node/node_modules/npm/node_modules/isexe/index.js
+/.local/node/node_modules/npm/node_modules/isexe/LICENSE
+/.local/node/node_modules/npm/node_modules/isexe/mode.js
+/.local/node/node_modules/npm/node_modules/isexe/package.json
+/.local/node/node_modules/npm/node_modules/isexe/windows.js
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/commonjs/parse-args.js
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/jackspeak/dist/esm/parse-args.js
+/.local/node/node_modules/npm/node_modules/jackspeak/LICENSE.md
+/.local/node/node_modules/npm/node_modules/jackspeak/package.json
+/.local/node/node_modules/npm/node_modules/jsbn/example.html
+/.local/node/node_modules/npm/node_modules/jsbn/example.js
+/.local/node/node_modules/npm/node_modules/jsbn/index.js
+/.local/node/node_modules/npm/node_modules/jsbn/LICENSE
+/.local/node/node_modules/npm/node_modules/jsbn/package.json
+/.local/node/node_modules/npm/node_modules/json-parse-even-better-errors/lib/index.js
+/.local/node/node_modules/npm/node_modules/json-parse-even-better-errors/LICENSE.md
+/.local/node/node_modules/npm/node_modules/json-parse-even-better-errors/package.json
+/.local/node/node_modules/npm/node_modules/json-stringify-nice/index.js
+/.local/node/node_modules/npm/node_modules/json-stringify-nice/LICENSE
+/.local/node/node_modules/npm/node_modules/json-stringify-nice/package.json
+/.local/node/node_modules/npm/node_modules/jsonparse/examples/twitterfeed.js
+/.local/node/node_modules/npm/node_modules/jsonparse/samplejson/basic.json
+/.local/node/node_modules/npm/node_modules/jsonparse/samplejson/basic2.json
+/.local/node/node_modules/npm/node_modules/jsonparse/bench.js
+/.local/node/node_modules/npm/node_modules/jsonparse/jsonparse.js
+/.local/node/node_modules/npm/node_modules/jsonparse/LICENSE
+/.local/node/node_modules/npm/node_modules/jsonparse/package.json
+/.local/node/node_modules/npm/node_modules/just-diff/index.cjs
+/.local/node/node_modules/npm/node_modules/just-diff/index.mjs
+/.local/node/node_modules/npm/node_modules/just-diff/LICENSE
+/.local/node/node_modules/npm/node_modules/just-diff/package.json
+/.local/node/node_modules/npm/node_modules/just-diff/rollup.config.js
+/.local/node/node_modules/npm/node_modules/just-diff-apply/index.cjs
+/.local/node/node_modules/npm/node_modules/just-diff-apply/index.mjs
+/.local/node/node_modules/npm/node_modules/just-diff-apply/LICENSE
+/.local/node/node_modules/npm/node_modules/just-diff-apply/package.json
+/.local/node/node_modules/npm/node_modules/just-diff-apply/rollup.config.js
+/.local/node/node_modules/npm/node_modules/libnpmaccess/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmaccess/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmaccess/package.json
+/.local/node/node_modules/npm/node_modules/libnpmaccess/README.md
+/.local/node/node_modules/npm/node_modules/libnpmdiff/lib/format-diff.js
+/.local/node/node_modules/npm/node_modules/libnpmdiff/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmdiff/lib/should-print-patch.js
+/.local/node/node_modules/npm/node_modules/libnpmdiff/lib/tarball.js
+/.local/node/node_modules/npm/node_modules/libnpmdiff/lib/untar.js
+/.local/node/node_modules/npm/node_modules/libnpmdiff/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmdiff/package.json
+/.local/node/node_modules/npm/node_modules/libnpmdiff/README.md
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/file-exists.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/get-bin-from-manifest.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/is-windows.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/no-tty.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/lib/run-script.js
+/.local/node/node_modules/npm/node_modules/libnpmexec/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmexec/package.json
+/.local/node/node_modules/npm/node_modules/libnpmexec/README.md
+/.local/node/node_modules/npm/node_modules/libnpmfund/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmfund/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmfund/package.json
+/.local/node/node_modules/npm/node_modules/libnpmfund/README.md
+/.local/node/node_modules/npm/node_modules/libnpmhook/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmhook/LICENSE.md
+/.local/node/node_modules/npm/node_modules/libnpmhook/package.json
+/.local/node/node_modules/npm/node_modules/libnpmhook/README.md
+/.local/node/node_modules/npm/node_modules/libnpmorg/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmorg/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmorg/package.json
+/.local/node/node_modules/npm/node_modules/libnpmorg/README.md
+/.local/node/node_modules/npm/node_modules/libnpmpack/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmpack/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmpack/package.json
+/.local/node/node_modules/npm/node_modules/libnpmpack/README.md
+/.local/node/node_modules/npm/node_modules/libnpmpublish/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmpublish/lib/provenance.js
+/.local/node/node_modules/npm/node_modules/libnpmpublish/lib/publish.js
+/.local/node/node_modules/npm/node_modules/libnpmpublish/lib/unpublish.js
+/.local/node/node_modules/npm/node_modules/libnpmpublish/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmpublish/package.json
+/.local/node/node_modules/npm/node_modules/libnpmpublish/README.md
+/.local/node/node_modules/npm/node_modules/libnpmsearch/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmsearch/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmsearch/package.json
+/.local/node/node_modules/npm/node_modules/libnpmsearch/README.md
+/.local/node/node_modules/npm/node_modules/libnpmteam/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmteam/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmteam/package.json
+/.local/node/node_modules/npm/node_modules/libnpmteam/README.md
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/commit.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/enforce-clean.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/index.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/read-json.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/retrieve-tag.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/tag.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/version.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/lib/write-json.js
+/.local/node/node_modules/npm/node_modules/libnpmversion/LICENSE
+/.local/node/node_modules/npm/node_modules/libnpmversion/package.json
+/.local/node/node_modules/npm/node_modules/libnpmversion/README.md
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/commonjs/index.min.js
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/esm/index.min.js
+/.local/node/node_modules/npm/node_modules/lru-cache/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/lru-cache/LICENSE
+/.local/node/node_modules/npm/node_modules/lru-cache/package.json
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/cache/entry.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/cache/errors.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/cache/index.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/cache/key.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/cache/policy.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/fetch.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/index.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/options.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/pipeline.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/lib/remote.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/charset.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/encoding.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/language.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/mediaType.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/HISTORY.md
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/index.js
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/LICENSE
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator/package.json
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/LICENSE
+/.local/node/node_modules/npm/node_modules/make-fetch-happen/package.json
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/ast.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/brace-expressions.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/escape.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/minimatch/dist/commonjs/unescape.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/assert-valid-pattern.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/ast.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/brace-expressions.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/escape.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/minimatch/dist/esm/unescape.js
+/.local/node/node_modules/npm/node_modules/minimatch/LICENSE
+/.local/node/node_modules/npm/node_modules/minimatch/package.json
+/.local/node/node_modules/npm/node_modules/minipass/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/minipass/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/minipass/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/minipass/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/minipass-collect/index.js
+/.local/node/node_modules/npm/node_modules/minipass-collect/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-collect/package.json
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/abort-error.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/blob.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/body.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/fetch-error.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/headers.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/index.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/request.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/lib/response.js
+/.local/node/node_modules/npm/node_modules/minipass-fetch/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-fetch/package.json
+/.local/node/node_modules/npm/node_modules/minipass-flush/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/minipass-flush/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-flush/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/minipass-flush/index.js
+/.local/node/node_modules/npm/node_modules/minipass-flush/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-flush/package.json
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/index.js
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-pipeline/package.json
+/.local/node/node_modules/npm/node_modules/minipass-sized/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/minipass-sized/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-sized/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/minipass-sized/index.js
+/.local/node/node_modules/npm/node_modules/minipass-sized/LICENSE
+/.local/node/node_modules/npm/node_modules/minipass-sized/package.json
+/.local/node/node_modules/npm/node_modules/minizlib/dist/commonjs/constants.js
+/.local/node/node_modules/npm/node_modules/minizlib/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/minizlib/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/minizlib/dist/esm/constants.js
+/.local/node/node_modules/npm/node_modules/minizlib/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/minizlib/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/minizlib/LICENSE
+/.local/node/node_modules/npm/node_modules/minizlib/package.json
+/.local/node/node_modules/npm/node_modules/mkdirp/bin/cmd.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/find-made.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/mkdirp-manual.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/mkdirp-native.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/opts-arg.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/path-arg.js
+/.local/node/node_modules/npm/node_modules/mkdirp/lib/use-native.js
+/.local/node/node_modules/npm/node_modules/mkdirp/index.js
+/.local/node/node_modules/npm/node_modules/mkdirp/LICENSE
+/.local/node/node_modules/npm/node_modules/mkdirp/package.json
+/.local/node/node_modules/npm/node_modules/mkdirp/readme.markdown
+/.local/node/node_modules/npm/node_modules/ms/index.js
+/.local/node/node_modules/npm/node_modules/ms/license.md
+/.local/node/node_modules/npm/node_modules/ms/package.json
+/.local/node/node_modules/npm/node_modules/mute-stream/lib/index.js
+/.local/node/node_modules/npm/node_modules/mute-stream/LICENSE
+/.local/node/node_modules/npm/node_modules/mute-stream/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/data/ninja/build.ninja
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/GypVsCMake.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/Hacking.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/InputFormatReference.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/LanguageSpecification.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/README.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/Testing.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/docs/UserDocumentation.md
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/.release-please-manifest.json
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/gyp
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/gyp.bat
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/LICENSE
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/pyproject.toml
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/release-please-config.json
+/.local/node/node_modules/npm/node_modules/node-gyp/gyp/test_gyp.py
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/build.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/clean.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/configure.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/create-config-gypi.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/download.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/find-node-directory.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/find-python.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/Find-VisualStudio.cs
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/find-visualstudio.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/install.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/list.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/log.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/node-gyp.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/process-release.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/rebuild.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/remove.js
+/.local/node/node_modules/npm/node_modules/node-gyp/lib/util.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/LICENSE.md
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/chownr/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js.map
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/LICENSE
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/mkdirp/readme.markdown
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/create.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/cwd-error.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/extract.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/get-write-flag.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/header.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/large-numbers.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/list.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/make-command.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mkdir.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mode-fix.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-unicode.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-windows-path.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/options.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pack.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/parse.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/path-reservations.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pax.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/read-entry.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/replace.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-absolute-path.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/symlink-error.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/types.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/unpack.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/update.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/warn-method.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/winchars.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/write-entry.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/create.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/cwd-error.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/extract.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/get-write-flag.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/header.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/large-numbers.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/list.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/make-command.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mkdir.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mode-fix.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-unicode.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-windows-path.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/options.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pack.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/parse.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/path-reservations.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pax.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/read-entry.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/replace.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-absolute-path.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/symlink-error.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/types.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/unpack.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/update.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/warn-method.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/winchars.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/dist/esm/write-entry.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/LICENSE
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/tar/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/LICENSE.md
+/.local/node/node_modules/npm/node_modules/node-gyp/node_modules/yallist/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/src/win_delay_load_hook.cc
+/.local/node/node_modules/npm/node_modules/node-gyp/.release-please-manifest.json
+/.local/node/node_modules/npm/node_modules/node-gyp/addon.gypi
+/.local/node/node_modules/npm/node_modules/node-gyp/CHANGELOG.md
+/.local/node/node_modules/npm/node_modules/node-gyp/CODE_OF_CONDUCT.md
+/.local/node/node_modules/npm/node_modules/node-gyp/CONTRIBUTING.md
+/.local/node/node_modules/npm/node_modules/node-gyp/eslint.config.js
+/.local/node/node_modules/npm/node_modules/node-gyp/LICENSE
+/.local/node/node_modules/npm/node_modules/node-gyp/macOS_Catalina_acid_test.sh
+/.local/node/node_modules/npm/node_modules/node-gyp/package.json
+/.local/node/node_modules/npm/node_modules/node-gyp/README.md
+/.local/node/node_modules/npm/node_modules/node-gyp/release-please-config.json
+/.local/node/node_modules/npm/node_modules/node-gyp/SECURITY.md
+/.local/node/node_modules/npm/node_modules/nopt/bin/nopt.js
+/.local/node/node_modules/npm/node_modules/nopt/lib/debug.js
+/.local/node/node_modules/npm/node_modules/nopt/lib/nopt.js
+/.local/node/node_modules/npm/node_modules/nopt/lib/nopt-lib.js
+/.local/node/node_modules/npm/node_modules/nopt/lib/type-defs.js
+/.local/node/node_modules/npm/node_modules/nopt/LICENSE
+/.local/node/node_modules/npm/node_modules/nopt/package.json
+/.local/node/node_modules/npm/node_modules/nopt/README.md
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/extract_description.js
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/fixer.js
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/make_warning.js
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/normalize.js
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/safe_format.js
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/typos.json
+/.local/node/node_modules/npm/node_modules/normalize-package-data/lib/warning_messages.json
+/.local/node/node_modules/npm/node_modules/normalize-package-data/LICENSE
+/.local/node/node_modules/npm/node_modules/normalize-package-data/package.json
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/reporters/detail.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/reporters/install.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/reporters/json.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/reporters/quiet.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/colors.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/exit-code.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-audit-report/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-audit-report/package.json
+/.local/node/node_modules/npm/node_modules/npm-bundled/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-bundled/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-bundled/package.json
+/.local/node/node_modules/npm/node_modules/npm-install-checks/lib/current-env.js
+/.local/node/node_modules/npm/node_modules/npm-install-checks/lib/dev-engines.js
+/.local/node/node_modules/npm/node_modules/npm-install-checks/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-install-checks/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-install-checks/package.json
+/.local/node/node_modules/npm/node_modules/npm-normalize-package-bin/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-normalize-package-bin/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-normalize-package-bin/package.json
+/.local/node/node_modules/npm/node_modules/npm-package-arg/lib/npa.js
+/.local/node/node_modules/npm/node_modules/npm-package-arg/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-package-arg/package.json
+/.local/node/node_modules/npm/node_modules/npm-packlist/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-packlist/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-packlist/package.json
+/.local/node/node_modules/npm/node_modules/npm-pick-manifest/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-pick-manifest/LICENSE.md
+/.local/node/node_modules/npm/node_modules/npm-pick-manifest/package.json
+/.local/node/node_modules/npm/node_modules/npm-profile/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-profile/LICENSE.md
+/.local/node/node_modules/npm/node_modules/npm-profile/package.json
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/auth.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/check-response.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/default-opts.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/errors.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/lib/json-stream.js
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/LICENSE.md
+/.local/node/node_modules/npm/node_modules/npm-registry-fetch/package.json
+/.local/node/node_modules/npm/node_modules/npm-user-validate/lib/index.js
+/.local/node/node_modules/npm/node_modules/npm-user-validate/LICENSE
+/.local/node/node_modules/npm/node_modules/npm-user-validate/package.json
+/.local/node/node_modules/npm/node_modules/p-map/index.js
+/.local/node/node_modules/npm/node_modules/p-map/license
+/.local/node/node_modules/npm/node_modules/p-map/package.json
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/LICENSE.md
+/.local/node/node_modules/npm/node_modules/package-json-from-dist/package.json
+/.local/node/node_modules/npm/node_modules/pacote/bin/index.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/add-git-sha.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/cache-dir.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/is-package-bin.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/npm.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/protected.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/tar-create-options.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/util/trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/dir.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/fetcher.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/file.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/git.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/index.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/registry.js
+/.local/node/node_modules/npm/node_modules/pacote/lib/remote.js
+/.local/node/node_modules/npm/node_modules/pacote/LICENSE
+/.local/node/node_modules/npm/node_modules/pacote/package.json
+/.local/node/node_modules/npm/node_modules/pacote/README.md
+/.local/node/node_modules/npm/node_modules/parse-conflict-json/lib/index.js
+/.local/node/node_modules/npm/node_modules/parse-conflict-json/LICENSE.md
+/.local/node/node_modules/npm/node_modules/parse-conflict-json/package.json
+/.local/node/node_modules/npm/node_modules/path-key/index.js
+/.local/node/node_modules/npm/node_modules/path-key/license
+/.local/node/node_modules/npm/node_modules/path-key/package.json
+/.local/node/node_modules/npm/node_modules/path-scurry/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/path-scurry/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/path-scurry/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/path-scurry/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/path-scurry/LICENSE.md
+/.local/node/node_modules/npm/node_modules/path-scurry/package.json
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/attribute.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/className.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/combinator.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/comment.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/constructors.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/container.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/guards.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/id.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/index.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/namespace.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/nesting.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/node.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/pseudo.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/root.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/selector.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/string.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/tag.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/types.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/selectors/universal.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/util/ensureObject.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/util/getProp.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/util/index.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/util/stripComments.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/util/unesc.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/index.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/parser.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/processor.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/sortAscending.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/tokenize.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/dist/tokenTypes.js
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/API.md
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/LICENSE-MIT
+/.local/node/node_modules/npm/node_modules/postcss-selector-parser/package.json
+/.local/node/node_modules/npm/node_modules/proc-log/lib/index.js
+/.local/node/node_modules/npm/node_modules/proc-log/LICENSE
+/.local/node/node_modules/npm/node_modules/proc-log/package.json
+/.local/node/node_modules/npm/node_modules/proggy/lib/client.js
+/.local/node/node_modules/npm/node_modules/proggy/lib/index.js
+/.local/node/node_modules/npm/node_modules/proggy/lib/tracker.js
+/.local/node/node_modules/npm/node_modules/proggy/LICENSE
+/.local/node/node_modules/npm/node_modules/proggy/package.json
+/.local/node/node_modules/npm/node_modules/promise-all-reject-late/index.js
+/.local/node/node_modules/npm/node_modules/promise-all-reject-late/LICENSE
+/.local/node/node_modules/npm/node_modules/promise-all-reject-late/package.json
+/.local/node/node_modules/npm/node_modules/promise-call-limit/dist/commonjs/index.js
+/.local/node/node_modules/npm/node_modules/promise-call-limit/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/promise-call-limit/dist/esm/index.js
+/.local/node/node_modules/npm/node_modules/promise-call-limit/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/promise-call-limit/LICENSE
+/.local/node/node_modules/npm/node_modules/promise-call-limit/package.json
+/.local/node/node_modules/npm/node_modules/promise-retry/index.js
+/.local/node/node_modules/npm/node_modules/promise-retry/LICENSE
+/.local/node/node_modules/npm/node_modules/promise-retry/package.json
+/.local/node/node_modules/npm/node_modules/promzard/lib/index.js
+/.local/node/node_modules/npm/node_modules/promzard/LICENSE
+/.local/node/node_modules/npm/node_modules/promzard/package.json
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/bin/qrcode-terminal.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/example/basic.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/example/basic.png
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/example/callback.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/example/small-qrcode.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/lib/main.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/index.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QR8bitByte.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRBitBuffer.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRMaskPattern.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRMath.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRMode.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRPolynomial.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRRSBlock.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/vendor/QRCode/QRUtil.js
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/.travis.yml
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/LICENSE
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/package.json
+/.local/node/node_modules/npm/node_modules/qrcode-terminal/README.md
+/.local/node/node_modules/npm/node_modules/read/dist/commonjs/package.json
+/.local/node/node_modules/npm/node_modules/read/dist/commonjs/read.js
+/.local/node/node_modules/npm/node_modules/read/dist/esm/package.json
+/.local/node/node_modules/npm/node_modules/read/dist/esm/read.js
+/.local/node/node_modules/npm/node_modules/read/LICENSE
+/.local/node/node_modules/npm/node_modules/read/package.json
+/.local/node/node_modules/npm/node_modules/read-cmd-shim/lib/index.js
+/.local/node/node_modules/npm/node_modules/read-cmd-shim/LICENSE
+/.local/node/node_modules/npm/node_modules/read-cmd-shim/package.json
+/.local/node/node_modules/npm/node_modules/read-package-json-fast/lib/index.js
+/.local/node/node_modules/npm/node_modules/read-package-json-fast/LICENSE
+/.local/node/node_modules/npm/node_modules/read-package-json-fast/package.json
+/.local/node/node_modules/npm/node_modules/retry/example/dns.js
+/.local/node/node_modules/npm/node_modules/retry/example/stop.js
+/.local/node/node_modules/npm/node_modules/retry/lib/retry.js
+/.local/node/node_modules/npm/node_modules/retry/lib/retry_operation.js
+/.local/node/node_modules/npm/node_modules/retry/equation.gif
+/.local/node/node_modules/npm/node_modules/retry/index.js
+/.local/node/node_modules/npm/node_modules/retry/License
+/.local/node/node_modules/npm/node_modules/retry/Makefile
+/.local/node/node_modules/npm/node_modules/retry/package.json
+/.local/node/node_modules/npm/node_modules/safer-buffer/dangerous.js
+/.local/node/node_modules/npm/node_modules/safer-buffer/LICENSE
+/.local/node/node_modules/npm/node_modules/safer-buffer/package.json
+/.local/node/node_modules/npm/node_modules/safer-buffer/Porting-Buffer.md
+/.local/node/node_modules/npm/node_modules/safer-buffer/safer.js
+/.local/node/node_modules/npm/node_modules/safer-buffer/tests.js
+/.local/node/node_modules/npm/node_modules/semver/bin/semver.js
+/.local/node/node_modules/npm/node_modules/semver/classes/comparator.js
+/.local/node/node_modules/npm/node_modules/semver/classes/index.js
+/.local/node/node_modules/npm/node_modules/semver/classes/range.js
+/.local/node/node_modules/npm/node_modules/semver/classes/semver.js
+/.local/node/node_modules/npm/node_modules/semver/functions/clean.js
+/.local/node/node_modules/npm/node_modules/semver/functions/cmp.js
+/.local/node/node_modules/npm/node_modules/semver/functions/coerce.js
+/.local/node/node_modules/npm/node_modules/semver/functions/compare.js
+/.local/node/node_modules/npm/node_modules/semver/functions/compare-build.js
+/.local/node/node_modules/npm/node_modules/semver/functions/compare-loose.js
+/.local/node/node_modules/npm/node_modules/semver/functions/diff.js
+/.local/node/node_modules/npm/node_modules/semver/functions/eq.js
+/.local/node/node_modules/npm/node_modules/semver/functions/gt.js
+/.local/node/node_modules/npm/node_modules/semver/functions/gte.js
+/.local/node/node_modules/npm/node_modules/semver/functions/inc.js
+/.local/node/node_modules/npm/node_modules/semver/functions/lt.js
+/.local/node/node_modules/npm/node_modules/semver/functions/lte.js
+/.local/node/node_modules/npm/node_modules/semver/functions/major.js
+/.local/node/node_modules/npm/node_modules/semver/functions/minor.js
+/.local/node/node_modules/npm/node_modules/semver/functions/neq.js
+/.local/node/node_modules/npm/node_modules/semver/functions/parse.js
+/.local/node/node_modules/npm/node_modules/semver/functions/patch.js
+/.local/node/node_modules/npm/node_modules/semver/functions/prerelease.js
+/.local/node/node_modules/npm/node_modules/semver/functions/rcompare.js
+/.local/node/node_modules/npm/node_modules/semver/functions/rsort.js
+/.local/node/node_modules/npm/node_modules/semver/functions/satisfies.js
+/.local/node/node_modules/npm/node_modules/semver/functions/sort.js
+/.local/node/node_modules/npm/node_modules/semver/functions/valid.js
+/.local/node/node_modules/npm/node_modules/semver/internal/constants.js
+/.local/node/node_modules/npm/node_modules/semver/internal/debug.js
+/.local/node/node_modules/npm/node_modules/semver/internal/identifiers.js
+/.local/node/node_modules/npm/node_modules/semver/internal/lrucache.js
+/.local/node/node_modules/npm/node_modules/semver/internal/parse-options.js
+/.local/node/node_modules/npm/node_modules/semver/internal/re.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/gtr.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/intersects.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/ltr.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/max-satisfying.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/min-satisfying.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/min-version.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/outside.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/simplify.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/subset.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/to-comparators.js
+/.local/node/node_modules/npm/node_modules/semver/ranges/valid.js
+/.local/node/node_modules/npm/node_modules/semver/index.js
+/.local/node/node_modules/npm/node_modules/semver/LICENSE
+/.local/node/node_modules/npm/node_modules/semver/package.json
+/.local/node/node_modules/npm/node_modules/semver/preload.js
+/.local/node/node_modules/npm/node_modules/semver/range.bnf
+/.local/node/node_modules/npm/node_modules/semver/README.md
+/.local/node/node_modules/npm/node_modules/shebang-command/index.js
+/.local/node/node_modules/npm/node_modules/shebang-command/license
+/.local/node/node_modules/npm/node_modules/shebang-command/package.json
+/.local/node/node_modules/npm/node_modules/shebang-regex/index.js
+/.local/node/node_modules/npm/node_modules/shebang-regex/license
+/.local/node/node_modules/npm/node_modules/shebang-regex/package.json
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/cjs/browser.js
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/cjs/index.js
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/cjs/package.json
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/cjs/signals.js
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/mjs/browser.js
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/mjs/index.js
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/mjs/package.json
+/.local/node/node_modules/npm/node_modules/signal-exit/dist/mjs/signals.js
+/.local/node/node_modules/npm/node_modules/signal-exit/LICENSE.txt
+/.local/node/node_modules/npm/node_modules/signal-exit/package.json
+/.local/node/node_modules/npm/node_modules/sigstore/dist/config.js
+/.local/node/node_modules/npm/node_modules/sigstore/dist/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/dist/sigstore.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/build.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/bundle.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/serialized.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/utility.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/validate.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/LICENSE
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle/package.json
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/length.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/obj.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/parse.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/tag.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/timestamp.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/cert.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/ext.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/sct.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/crypto.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/dsse.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/encoding.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/json.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/oid.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/pem.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/stream.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/LICENSE
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core/package.json
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/base.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/bundle.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/dsse.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/message.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fetch.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fulcio.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/rekor.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/tsa.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/ci.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/provider.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/signer.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/types/fetch.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/oidc.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/ua.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/client.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/entry.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/client.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/witness.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/LICENSE
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign/package.json
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/dsse.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/message.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/certificate.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/sct.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/merkle.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/set.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/tsa.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/dsse.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/intoto.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/filter.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/trust.types.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/error.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/index.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/policy.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/shared.types.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/verifier.js
+/.local/node/node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify/package.json
+/.local/node/node_modules/npm/node_modules/sigstore/LICENSE
+/.local/node/node_modules/npm/node_modules/sigstore/package.json
+/.local/node/node_modules/npm/node_modules/smart-buffer/docs/ROADMAP.md
+/.local/node/node_modules/npm/node_modules/smart-buffer/LICENSE
+/.local/node/node_modules/npm/node_modules/smart-buffer/package.json
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/javascript/associateExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/javascript/bindExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/javascript/connectExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/typescript/associateExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/typescript/bindExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/typescript/connectExample.md
+/.local/node/node_modules/npm/node_modules/socks/docs/examples/index.md
+/.local/node/node_modules/npm/node_modules/socks/docs/index.md
+/.local/node/node_modules/npm/node_modules/socks/docs/migratingFromV1.md
+/.local/node/node_modules/npm/node_modules/socks/LICENSE
+/.local/node/node_modules/npm/node_modules/socks/package.json
+/.local/node/node_modules/npm/node_modules/socks-proxy-agent/dist/index.js
+/.local/node/node_modules/npm/node_modules/socks-proxy-agent/LICENSE
+/.local/node/node_modules/npm/node_modules/socks-proxy-agent/package.json
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/AUTHORS
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/index.js
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/LICENSE
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/package.json
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/parse.js
+/.local/node/node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse/scan.js
+/.local/node/node_modules/npm/node_modules/spdx-correct/index.js
+/.local/node/node_modules/npm/node_modules/spdx-correct/LICENSE
+/.local/node/node_modules/npm/node_modules/spdx-correct/package.json
+/.local/node/node_modules/npm/node_modules/spdx-exceptions/deprecated.json
+/.local/node/node_modules/npm/node_modules/spdx-exceptions/index.json
+/.local/node/node_modules/npm/node_modules/spdx-exceptions/package.json
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/AUTHORS
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/index.js
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/LICENSE
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/package.json
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/parse.js
+/.local/node/node_modules/npm/node_modules/spdx-expression-parse/scan.js
+/.local/node/node_modules/npm/node_modules/spdx-license-ids/deprecated.json
+/.local/node/node_modules/npm/node_modules/spdx-license-ids/index.json
+/.local/node/node_modules/npm/node_modules/spdx-license-ids/package.json
+/.local/node/node_modules/npm/node_modules/sprintf-js/demo/angular.html
+/.local/node/node_modules/npm/node_modules/sprintf-js/dist/.gitattributes
+/.local/node/node_modules/npm/node_modules/sprintf-js/dist/angular-sprintf.min.js
+/.local/node/node_modules/npm/node_modules/sprintf-js/dist/sprintf.min.js
+/.local/node/node_modules/npm/node_modules/sprintf-js/src/angular-sprintf.js
+/.local/node/node_modules/npm/node_modules/sprintf-js/src/sprintf.js
+/.local/node/node_modules/npm/node_modules/sprintf-js/bower.json
+/.local/node/node_modules/npm/node_modules/sprintf-js/CONTRIBUTORS.md
+/.local/node/node_modules/npm/node_modules/sprintf-js/gruntfile.js
+/.local/node/node_modules/npm/node_modules/sprintf-js/LICENSE
+/.local/node/node_modules/npm/node_modules/sprintf-js/package.json
+/.local/node/node_modules/npm/node_modules/ssri/lib/index.js
+/.local/node/node_modules/npm/node_modules/ssri/LICENSE.md
+/.local/node/node_modules/npm/node_modules/ssri/package.json
+/.local/node/node_modules/npm/node_modules/string-width/index.js
+/.local/node/node_modules/npm/node_modules/string-width/license
+/.local/node/node_modules/npm/node_modules/string-width/package.json
+/.local/node/node_modules/npm/node_modules/string-width-cjs/index.js
+/.local/node/node_modules/npm/node_modules/string-width-cjs/license
+/.local/node/node_modules/npm/node_modules/string-width-cjs/package.json
+/.local/node/node_modules/npm/node_modules/strip-ansi/index.js
+/.local/node/node_modules/npm/node_modules/strip-ansi/license
+/.local/node/node_modules/npm/node_modules/strip-ansi/package.json
+/.local/node/node_modules/npm/node_modules/strip-ansi-cjs/index.js
+/.local/node/node_modules/npm/node_modules/strip-ansi-cjs/license
+/.local/node/node_modules/npm/node_modules/strip-ansi-cjs/package.json
+/.local/node/node_modules/npm/node_modules/supports-color/browser.js
+/.local/node/node_modules/npm/node_modules/supports-color/index.js
+/.local/node/node_modules/npm/node_modules/supports-color/license
+/.local/node/node_modules/npm/node_modules/supports-color/package.json
+/.local/node/node_modules/npm/node_modules/tar/lib/create.js
+/.local/node/node_modules/npm/node_modules/tar/lib/extract.js
+/.local/node/node_modules/npm/node_modules/tar/lib/get-write-flag.js
+/.local/node/node_modules/npm/node_modules/tar/lib/header.js
+/.local/node/node_modules/npm/node_modules/tar/lib/high-level-opt.js
+/.local/node/node_modules/npm/node_modules/tar/lib/large-numbers.js
+/.local/node/node_modules/npm/node_modules/tar/lib/list.js
+/.local/node/node_modules/npm/node_modules/tar/lib/mkdir.js
+/.local/node/node_modules/npm/node_modules/tar/lib/mode-fix.js
+/.local/node/node_modules/npm/node_modules/tar/lib/normalize-unicode.js
+/.local/node/node_modules/npm/node_modules/tar/lib/normalize-windows-path.js
+/.local/node/node_modules/npm/node_modules/tar/lib/pack.js
+/.local/node/node_modules/npm/node_modules/tar/lib/parse.js
+/.local/node/node_modules/npm/node_modules/tar/lib/path-reservations.js
+/.local/node/node_modules/npm/node_modules/tar/lib/pax.js
+/.local/node/node_modules/npm/node_modules/tar/lib/read-entry.js
+/.local/node/node_modules/npm/node_modules/tar/lib/replace.js
+/.local/node/node_modules/npm/node_modules/tar/lib/strip-absolute-path.js
+/.local/node/node_modules/npm/node_modules/tar/lib/strip-trailing-slashes.js
+/.local/node/node_modules/npm/node_modules/tar/lib/types.js
+/.local/node/node_modules/npm/node_modules/tar/lib/unpack.js
+/.local/node/node_modules/npm/node_modules/tar/lib/update.js
+/.local/node/node_modules/npm/node_modules/tar/lib/warn-mixin.js
+/.local/node/node_modules/npm/node_modules/tar/lib/winchars.js
+/.local/node/node_modules/npm/node_modules/tar/lib/write-entry.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/index.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/node_modules/fs-minipass/package.json
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minipass/index.mjs
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass/index.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass/package.json
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/constants.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/index.js
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/node_modules/minizlib/package.json
+/.local/node/node_modules/npm/node_modules/tar/index.js
+/.local/node/node_modules/npm/node_modules/tar/LICENSE
+/.local/node/node_modules/npm/node_modules/tar/package.json
+/.local/node/node_modules/npm/node_modules/text-table/example/align.js
+/.local/node/node_modules/npm/node_modules/text-table/example/center.js
+/.local/node/node_modules/npm/node_modules/text-table/example/dotalign.js
+/.local/node/node_modules/npm/node_modules/text-table/example/doubledot.js
+/.local/node/node_modules/npm/node_modules/text-table/example/table.js
+/.local/node/node_modules/npm/node_modules/text-table/index.js
+/.local/node/node_modules/npm/node_modules/text-table/LICENSE
+/.local/node/node_modules/npm/node_modules/text-table/package.json
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/lib/factory.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/lib/index.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/src/factory.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/src/index.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/translations/da.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/translations/de.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/translations/en.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/translations/en-short.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/translations/es.js
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/LICENSE.md
+/.local/node/node_modules/npm/node_modules/tiny-relative-date/package.json
+/.local/node/node_modules/npm/node_modules/tinyglobby/dist/index.d.mts
+/.local/node/node_modules/npm/node_modules/tinyglobby/dist/index.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/dist/index.mjs
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/get-array.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/group-files.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/invoke-callback.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/join-path.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-directory.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/push-file.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/resolve-symlink.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/functions/walk-directory.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/async.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/counter.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/queue.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/sync.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/api/walker.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/builder/api-builder.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/builder/index.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/index.cjs
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/index.d.cts
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/index.d.mts
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/index.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/index.mjs
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/types.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/dist/utils.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/LICENSE
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/fdir/package.json
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/lib/constants.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/lib/parse.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/lib/picomatch.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/lib/scan.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/lib/utils.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/index.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/LICENSE
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/package.json
+/.local/node/node_modules/npm/node_modules/tinyglobby/node_modules/picomatch/posix.js
+/.local/node/node_modules/npm/node_modules/tinyglobby/LICENSE
+/.local/node/node_modules/npm/node_modules/tinyglobby/package.json
+/.local/node/node_modules/npm/node_modules/treeverse/lib/breadth.js
+/.local/node/node_modules/npm/node_modules/treeverse/lib/depth.js
+/.local/node/node_modules/npm/node_modules/treeverse/lib/depth-descent.js
+/.local/node/node_modules/npm/node_modules/treeverse/lib/index.js
+/.local/node/node_modules/npm/node_modules/treeverse/LICENSE
+/.local/node/node_modules/npm/node_modules/treeverse/package.json
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/utils/tmpfile.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/utils/url.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/config.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/error.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/fetcher.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/index.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/store.js
+/.local/node/node_modules/npm/node_modules/tuf-js/dist/updater.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/guard.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/index.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/key.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/oid.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/types.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/verify.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/base.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/delegations.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/error.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/file.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/index.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/key.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/metadata.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/role.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/root.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/signature.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/snapshot.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/targets.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/timestamp.js
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/LICENSE
+/.local/node/node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models/package.json
+/.local/node/node_modules/npm/node_modules/tuf-js/LICENSE
+/.local/node/node_modules/npm/node_modules/tuf-js/package.json
+/.local/node/node_modules/npm/node_modules/unique-filename/lib/index.js
+/.local/node/node_modules/npm/node_modules/unique-filename/LICENSE
+/.local/node/node_modules/npm/node_modules/unique-filename/package.json
+/.local/node/node_modules/npm/node_modules/unique-slug/lib/index.js
+/.local/node/node_modules/npm/node_modules/unique-slug/LICENSE
+/.local/node/node_modules/npm/node_modules/unique-slug/package.json
+/.local/node/node_modules/npm/node_modules/util-deprecate/browser.js
+/.local/node/node_modules/npm/node_modules/util-deprecate/History.md
+/.local/node/node_modules/npm/node_modules/util-deprecate/LICENSE
+/.local/node/node_modules/npm/node_modules/util-deprecate/node.js
+/.local/node/node_modules/npm/node_modules/util-deprecate/package.json
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/AUTHORS
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/index.js
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/LICENSE
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/package.json
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/parse.js
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse/scan.js
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/index.js
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/LICENSE
+/.local/node/node_modules/npm/node_modules/validate-npm-package-license/package.json
+/.local/node/node_modules/npm/node_modules/validate-npm-package-name/lib/index.js
+/.local/node/node_modules/npm/node_modules/validate-npm-package-name/LICENSE
+/.local/node/node_modules/npm/node_modules/validate-npm-package-name/package.json
+/.local/node/node_modules/npm/node_modules/walk-up-path/dist/cjs/index.js
+/.local/node/node_modules/npm/node_modules/walk-up-path/dist/cjs/package.json
+/.local/node/node_modules/npm/node_modules/walk-up-path/dist/mjs/index.js
+/.local/node/node_modules/npm/node_modules/walk-up-path/dist/mjs/package.json
+/.local/node/node_modules/npm/node_modules/walk-up-path/LICENSE
+/.local/node/node_modules/npm/node_modules/walk-up-path/package.json
+/.local/node/node_modules/npm/node_modules/which/bin/which.js
+/.local/node/node_modules/npm/node_modules/which/lib/index.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/cjs/index.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/cjs/options.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/cjs/package.json
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/cjs/posix.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/cjs/win32.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/mjs/index.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/mjs/options.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/mjs/package.json
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/mjs/posix.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/dist/mjs/win32.js
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/LICENSE
+/.local/node/node_modules/npm/node_modules/which/node_modules/isexe/package.json
+/.local/node/node_modules/npm/node_modules/which/LICENSE
+/.local/node/node_modules/npm/node_modules/which/package.json
+/.local/node/node_modules/npm/node_modules/which/README.md
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/es2015/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/es2015/RGI_Emoji.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/es2015/text.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/LICENSE-MIT.txt
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/RGI_Emoji.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex/text.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/string-width/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/package.json
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/index.js
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/license
+/.local/node/node_modules/npm/node_modules/wrap-ansi-cjs/package.json
+/.local/node/node_modules/npm/node_modules/write-file-atomic/lib/index.js
+/.local/node/node_modules/npm/node_modules/write-file-atomic/LICENSE.md
+/.local/node/node_modules/npm/node_modules/write-file-atomic/package.json
+/.local/node/node_modules/npm/node_modules/yallist/iterator.js
+/.local/node/node_modules/npm/node_modules/yallist/LICENSE
+/.local/node/node_modules/npm/node_modules/yallist/package.json
+/.local/node/node_modules/npm/node_modules/yallist/yallist.js
+/.local/node/node_modules/npm/.npmrc
+/.local/node/node_modules/npm/index.js
+/.local/node/node_modules/npm/LICENSE
+/.local/node/node_modules/npm/package.json
+/.local/node/node_modules/npm/README.md
+/.local/node/CHANGELOG.md
+/.local/node/corepack
+/.local/node/corepack.cmd
+/.local/node/install_tools.bat
+/.local/node/LICENSE
+/.local/node/node.exe
+/.local/node/nodevars.bat
+/.local/node/npm
+/.local/node/npm.cmd
+/.local/node/npm.ps1
+/.local/node/npx
+/.local/node/npx.cmd
+/.local/node/npx.ps1
+/.local/node/README.md
+/.local/node-v22.22.1-win-x64.zip
diff --git a/.local/mqtt-smoke/AwsIotConnectRunner.java b/.local/mqtt-smoke/AwsIotConnectRunner.java
new file mode 100644
index 0000000..c2d78dc
--- /dev/null
+++ b/.local/mqtt-smoke/AwsIotConnectRunner.java
@@ -0,0 +1,81 @@
+import com.zy.integration.iot.client.impl.PahoIotMqttClient;
+import com.zy.integration.iot.handler.IotInboundMessageHandler;
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.entity.IotTopicConfig;
+
+import java.lang.reflect.Field;
+
+/**
+ * 鍙仛 IoT MQTT 寤鸿繛涓庤闃呴獙璇侊紝涓嶄笅鍙戜笟鍔℃秷鎭紝閬垮厤姹℃煋姝e紡 topic銆�
+ * 鏀寔涓ょ璋冪敤鏂瑰紡锛�
+ * 1. 鏄庢枃 TCP锛�<endpoint> <clientId> <egressStow> <egressPick> <egressFeedback>
+ * 2. TLS/mTLS锛�<endpoint> <clientId> <caCert> <clientCert> <clientKey> <egressStow> <egressPick> <egressFeedback>
+ */
+public class AwsIotConnectRunner {
+
+ public static void main(String[] args) throws Exception {
+ if (args.length != 5 && args.length != 8) {
+ System.err.println("Usage plain : <endpoint> <clientId> <egressStow> <egressPick> <egressFeedback>");
+ System.err.println("Usage tls : <endpoint> <clientId> <caCert> <clientCert> <clientKey> <egressStow> <egressPick> <egressFeedback>");
+ System.exit(2);
+ }
+
+ boolean tlsMode = args.length == 8;
+ IotProperties properties = new IotProperties();
+ properties.setEnabled(true);
+ properties.setEndpoint(args[0]);
+ properties.setPort(tlsMode ? 8883 : 1883);
+ properties.setThingName(args[1]);
+ properties.setClientId(args[1]);
+ properties.setCleanSession(false);
+ properties.setAutomaticReconnect(true);
+ properties.setKeepAliveSeconds(60);
+ properties.setConnectionTimeoutSeconds(10);
+ properties.setPersistenceDir(".local/iot-mqtt-connect-test");
+
+ int topicOffset;
+ if (tlsMode) {
+ properties.setCaCertPath(args[2]);
+ properties.setClientCertPath(args[3]);
+ properties.setPrivateKeyPath(args[4]);
+ topicOffset = 5;
+ } else {
+ topicOffset = 2;
+ }
+
+ IotTopicConfig topics = properties.getTopics();
+ topics.setEgressStow(args[topicOffset]);
+ topics.setEgressPick(args[topicOffset + 1]);
+ topics.setEgressFeedback(args[topicOffset + 2]);
+
+ IotInboundMessageHandler inboundHandler = new IotInboundMessageHandler() {
+ @Override
+ public void handleMessage(String topic, String payload) {
+ System.out.println("received topic=" + topic + ", payloadLength=" + (payload == null ? 0 : payload.length()));
+ }
+ };
+
+ PahoIotMqttClient client = new PahoIotMqttClient();
+ setField(client, "iotProperties", properties);
+ setField(client, "inboundMessageHandler", inboundHandler);
+
+ try {
+ client.ensureConnected();
+ if (!client.isConnected()) {
+ throw new IllegalStateException("MQTT client not connected");
+ }
+ System.out.println("IoT MQTT connect test passed");
+ System.out.println("serverUri=" + properties.getServerUri());
+ System.out.println("clientId=" + properties.getResolvedClientId());
+ Thread.sleep(3000L);
+ } finally {
+ client.destroy();
+ }
+ }
+
+ private static void setField(Object target, String name, Object value) throws Exception {
+ Field field = target.getClass().getDeclaredField(name);
+ field.setAccessible(true);
+ field.set(target, value);
+ }
+}
diff --git a/.local/mqtt-smoke/bin/AwsIotConnectRunner$1.class b/.local/mqtt-smoke/bin/AwsIotConnectRunner$1.class
new file mode 100644
index 0000000..d507b7f
--- /dev/null
+++ b/.local/mqtt-smoke/bin/AwsIotConnectRunner$1.class
Binary files differ
diff --git a/.local/mqtt-smoke/bin/AwsIotConnectRunner.class b/.local/mqtt-smoke/bin/AwsIotConnectRunner.class
new file mode 100644
index 0000000..eff0889
--- /dev/null
+++ b/.local/mqtt-smoke/bin/AwsIotConnectRunner.class
Binary files differ
diff --git a/pom.xml b/pom.xml
index 405cb39..3945d24 100644
--- a/pom.xml
+++ b/pom.xml
@@ -118,6 +118,21 @@
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
+ <groupId>org.eclipse.paho</groupId>
+ <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
+ <version>1.2.5</version>
+ </dependency>
+ <dependency>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcpkix-jdk15on</artifactId>
+ <version>1.70</version>
+ </dependency>
+ <dependency>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk15on</artifactId>
+ <version>1.70</version>
+ </dependency>
+ <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index 11ad45f..b812841 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -464,6 +464,7 @@
validComb.add(mesToCombParam);
}
for (MesToCombParam mesToCombParam : validComb) {
+ mesToCombParam.setBoxType1("ERP");
openService.mesToComb(mesToCombParam);
}
// TODO:寰呮祴璇�
diff --git a/src/main/java/com/zy/asrs/entity/param/MesToCombParam.java b/src/main/java/com/zy/asrs/entity/param/MesToCombParam.java
index fc32ced..41266cb 100644
--- a/src/main/java/com/zy/asrs/entity/param/MesToCombParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/MesToCombParam.java
@@ -31,4 +31,6 @@
private String bizNo;
//鏄惁鏁h揣锛�0 闈炴暎璐э紱1 鏁h揣锛涗负浜嗙鎺у嚭璐ч�熺巼锛屾暎璐у彲浠ュ嚭鎱㈢偣銆�
private Integer package1;
+ //鍏ュ簱閫氱煡鏉ユ簮锛孍RP 榛樿 erp锛孧QTT 缁勬墭浼� aws銆�
+ private String boxType1;
}
diff --git a/src/main/java/com/zy/asrs/service/ExternalTaskFacadeService.java b/src/main/java/com/zy/asrs/service/ExternalTaskFacadeService.java
new file mode 100644
index 0000000..cd9d2c7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/ExternalTaskFacadeService.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service;
+
+import com.core.common.R;
+import com.zy.asrs.entity.param.MesToCombParam;
+import com.zy.asrs.entity.param.OutTaskParam;
+
+public interface ExternalTaskFacadeService {
+
+ R acceptInboundNotice(MesToCombParam param);
+
+ R createOutboundTask(OutTaskParam param, boolean autoConfirm);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/ExternalTaskFacadeServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ExternalTaskFacadeServiceImpl.java
new file mode 100644
index 0000000..72d96fa
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/ExternalTaskFacadeServiceImpl.java
@@ -0,0 +1,108 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.asrs.entity.param.MesToCombParam;
+import com.zy.asrs.entity.param.OpenOrderPakoutPauseParam;
+import com.zy.asrs.entity.param.OutTaskParam;
+import com.zy.asrs.service.ExternalTaskFacadeService;
+import com.zy.asrs.service.LocDetlService;
+import com.zy.asrs.service.OpenService;
+import com.zy.asrs.service.WaitPakinService;
+import com.zy.asrs.service.WrkDetlService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * 瀵瑰浠诲姟闂ㄩ潰銆�
+ * 鎶� Controller 閲岀殑鏍¢獙鍜屾斁琛岄�昏緫娌夊埌 service锛屼究浜� HTTP 鍜� MQTT 涓ゆ潯鍏ュ彛鍏辩敤銆�
+ */
+@Service
+public class ExternalTaskFacadeServiceImpl implements ExternalTaskFacadeService {
+
+ @Autowired
+ private OpenService openService;
+ @Autowired
+ private LocDetlService locDetlService;
+ @Autowired
+ private WrkDetlService wrkDetlService;
+ @Autowired
+ private WaitPakinService waitPakinService;
+
+ /**
+ * 澶嶇敤鐜版湁鍏ュ簱閫氱煡寤烘。閫昏緫锛屽苟琛ュ厖鎵樼洏閲嶅鏍¢獙銆�
+ */
+ @Override
+ public R acceptInboundNotice(MesToCombParam param) {
+ if (param == null) {
+ return R.error("璇锋眰鍙傛暟涓嶈兘涓虹┖");
+ }
+ if (Cools.isEmpty(param.getPalletId())) {
+ return R.error("palletId涓嶈兘涓虹┖");
+ }
+ if (Cools.isEmpty(param.getBizNo())) {
+ return R.error("bizNo涓嶈兘涓虹┖");
+ }
+
+ int countLoc = locDetlService.selectCount(new EntityWrapper<com.zy.asrs.entity.LocDetl>().eq("zpallet", param.getPalletId()));
+ int countWrk = wrkDetlService.selectCount(new EntityWrapper<com.zy.asrs.entity.WrkDetl>().eq("zpallet", param.getPalletId()));
+ if (countLoc > 0 || countWrk > 0) {
+ return R.error("鎵樼洏宸插湪搴撳瓨涓�/宸插紑濮嬪叆搴�");
+ }
+
+ if (waitPakinService.selectCount(new EntityWrapper<com.zy.asrs.entity.WaitPakin>()
+ .eq("zpallet", param.getPalletId())
+ .eq("io_status", "N")) > 0) {
+ // 鍚屾墭鐩樺瓨鍦ㄦ棫鐨勫緟鍏ュ簱閫氱煡鏃讹紝鍒犻櫎鏃ц褰曪紝淇濈暀鏈�鏂颁竴娆¢鐧昏銆�
+ waitPakinService.delete(new EntityWrapper<com.zy.asrs.entity.WaitPakin>().eq("zpallet", param.getPalletId()));
+ }
+
+ R result = openService.mesToComb(param);
+ return result == null ? R.ok() : result;
+ }
+
+ /**
+ * 澶嶇敤鐜版湁鍑哄簱寤哄崟閫昏緫锛涘綋 autoConfirm=true 鏃讹紝缁х画璋冪敤鍘熸湁纭鎺ュ彛鑷姩鏀捐銆�
+ */
+ @Override
+ public R createOutboundTask(OutTaskParam param, boolean autoConfirm) {
+ if (param == null) {
+ return R.error("璇锋眰鍙傛暟涓嶈兘涓虹┖");
+ }
+ if (Cools.isEmpty(param.getOrderId())) {
+ return R.error("鍑哄簱鍗曞彿涓嶈兘涓虹┖");
+ }
+ if (Cools.isEmpty(param.getPalletId())) {
+ return R.error("palletId涓嶈兘涓虹┖");
+ }
+ if (Cools.isEmpty(param.getStationId())) {
+ return R.error("stationId涓嶈兘涓虹┖");
+ }
+ int countLoc = locDetlService.selectCount(new EntityWrapper<com.zy.asrs.entity.LocDetl>().eq("zpallet", param.getPalletId()));
+ if (countLoc == 0) {
+ return R.error("搴撳瓨涓笉瀛樺湪璇ユ墭鐩�");
+ }
+
+ if (param.getSeq() == null) {
+ param.setSeq(1);
+ }
+
+ R result = openService.outOrder(param, 1);
+ if (!Objects.equals(result.get("code"), 200) || !autoConfirm) {
+ return result;
+ }
+
+ // IoT pick 绾﹀畾涓衡�滄敹鍒板嵆鎵ц鈥濓紝鍥犳杩欓噷鐩存帴澶嶇敤鍘熸湁纭鏀捐鎺ュ彛銆�
+ OpenOrderPakoutPauseParam executeParam = new OpenOrderPakoutPauseParam();
+ executeParam.setOrderId(param.getOrderId());
+ executeParam.setExecute(1);
+ R confirmResult = openService.pakoutOrderPause(executeParam);
+ if (result.get("wrkNo") != null) {
+ confirmResult.add(Cools.add("wrkNo", result.get("wrkNo")));
+ }
+ return confirmResult;
+ }
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 8d86038..00009af 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1262,7 +1262,12 @@
if (param.getFull() == 1) {
//婊℃墭鐩�
- mat = matService.selectByMatnr("cloudWarehouse");
+ if(param.getBoxType1().equals("aws")){
+ mat = matService.selectByMatnr("amazon");
+ }else {
+ mat = matService.selectByMatnr("cloudWarehouse");
+ }
+
} else if (param.getFull() == 0) {
//绌烘墭鐩�
mat = matService.selectByMatnr("emptyPallet");
@@ -1287,11 +1292,12 @@
waitPakin.setManu(String.valueOf(param.getLocId()));//mes鍏蜂綋搴撲綅缂栧彿
waitPakin.setThreeCode(param.getBizNo());
waitPakin.setBeBatch(param.getPackage1());//鏄惁鏁h揣锛�0 闈炴暎璐э紱1 鏁h揣锛涗负浜嗙鎺у嚭璐ч�熺巼锛屾暎璐у彲浠ュ嚭鎱㈢偣銆�
- waitPakin.setBoxType1("erp");
+ // ERP 鍏ュ彛榛樿鎵� erp锛孧QTT 缁勬墭浼氬湪鍙傛暟閲屾樉寮忎紶 aws銆�
+ waitPakin.setBoxType1(Cools.isEmpty(param.getBoxType1()) ? "erp" : param.getBoxType1());
if (!waitPakinService.insert(waitPakin)) {
throw new CoolException("淇濆瓨鍏ュ簱閫氱煡妗eけ璐�");
}
- return null;
+ return R.ok().add(Cools.add("palletId", param.getPalletId()).add("orderId", param.getOrderId()));
}
@Override
@@ -1370,7 +1376,8 @@
log.error(locMast.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
throw new CoolException(locMast.getLocNo() + "搴撲綅涓嶆槸鍦ㄥ簱鐘舵��");
}
- return R.ok();
+ return R.ok().add(Cools.add("wrkNo", workNo).add("orderId", param.getOrderId()));
}
}
+
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index f031611..b80c943 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -10,6 +10,7 @@
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.entity.Parameter;
+import com.zy.integration.iot.biz.IotInstructionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -49,6 +50,8 @@
private OrderPakinService orderPakinService;
@Autowired
private WorkService workService;
+ @Autowired
+ private IotInstructionService iotInstructionService;
@Value("${erp.switch.ErpReportOld}")
private boolean erpReportOld;
@@ -456,6 +459,7 @@
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return FAIL.setMsg("鏇存柊鍏ュ簱瀹屾垚鐘舵�佸け璐�; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
}
+ iotInstructionService.queueWorkCompletion(wrkMast);
} catch (Exception e) {
log.error("fail", e);
e.printStackTrace();
@@ -605,6 +609,7 @@
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return FAIL.setMsg("鏇存柊鍑哄簱瀹屾垚鐘舵�佸け璐�; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
}
+ iotInstructionService.queueWorkCompletion(wrkMast);
} catch (Exception e) {
log.error("fail", e);
e.printStackTrace();
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index 1081c54..8bfd23c 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -338,11 +338,11 @@
return defaultRowLastno;
}
RowLastnoService rowLastnoService = SpringUtils.getBean(RowLastnoService.class);
- List<RowLastno> typeMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>()
- .eq("type_id", area));
- if (!Cools.isEmpty(typeMatched)) {
- return typeMatched.get(0);
- }
+// List<RowLastno> typeMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>()
+// .eq("type_id", area));
+// if (!Cools.isEmpty(typeMatched)) {
+// return typeMatched.get(0);
+// }
List<RowLastno> whsMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>()
.eq("whs_type", area));
if (!Cools.isEmpty(whsMatched)) {
diff --git a/src/main/java/com/zy/common/web/WcsController.java b/src/main/java/com/zy/common/web/WcsController.java
index c42d6f7..f5adbea 100644
--- a/src/main/java/com/zy/common/web/WcsController.java
+++ b/src/main/java/com/zy/common/web/WcsController.java
@@ -52,42 +52,47 @@
private RowLastnoService rowLastnoService;
@Autowired
private WorkService workService;
+ @Autowired
+ private StaDescService staDescService;
@PostMapping("/pakin/loc/v1")
@ResponseBody
public synchronized R getLocNo(@RequestBody SearchLocParam param) {
+ long startTime = System.currentTimeMillis();
+ String barcode = param == null ? null : param.getBarcode();
+ Integer sourceStaNo = param == null ? null : param.getSourceStaNo();
+ try {
+ if(param.getBarcode().contains("-") || param.getBarcode().contains("gsl")){
+ log.info("鏀跺埌WCS鍏ュ簱鎺ュ彛璇锋眰====>>鍏ュ弬:{}", param);
+ }
+ if (Cools.isEmpty(param.getSourceStaNo())) {
+ return R.error("婧愮珯缂栧彿涓嶈兘涓虹┖");
+ }
+ List<WaitPakin> waitPakins = null;
- if(param.getBarcode().contains("-") || param.getBarcode().contains("gsl")){
- log.info("鏀跺埌WCS鍏ュ簱鎺ュ彛璇锋眰====>>鍏ュ弬:{}", param);
- }
- if (Cools.isEmpty(param.getSourceStaNo())) {
- return R.error("婧愮珯缂栧彿涓嶈兘涓虹┖");
- }
- List<WaitPakin> waitPakins = null;
-
- if (Cools.isEmpty(param.getBarcode())) {
- return R.error("鏉$爜涓嶈兘涓虹┖");
- }
- WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
- if (!Cools.isEmpty(wrkMast1) && wrkMast1.getWrkSts() == 2) {
- StartupDto dto1 = new StartupDto();
- dto1.setBarcode(param.getBarcode());
- dto1.setStaNo(Integer.valueOf(wrkMast1.getStaNo()));
- String wcsLoc = Utils.WMSLocToWCSLoc(wrkMast1.getLocNo());
- dto1.setLocNo(wcsLoc);
- dto1.setCrnNo(wrkMast1.getCrnNo());
- dto1.setWorkNo(wrkMast1.getWrkNo());
- dto1.setTaskNo(wrkMast1.getWrkNo() + "");
+ if (Cools.isEmpty(param.getBarcode())) {
+ return R.error("鏉$爜涓嶈兘涓虹┖");
+ }
+ WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
+ if (!Cools.isEmpty(wrkMast1) && wrkMast1.getWrkSts() == 2) {
+ StartupDto dto1 = new StartupDto();
+ dto1.setBarcode(param.getBarcode());
+ dto1.setStaNo(Integer.valueOf(wrkMast1.getStaNo()));
+ String wcsLoc = Utils.WMSLocToWCSLoc(wrkMast1.getLocNo());
+ dto1.setLocNo(wcsLoc);
+ dto1.setCrnNo(wrkMast1.getCrnNo());
+ dto1.setWorkNo(wrkMast1.getWrkNo());
+ dto1.setTaskNo(wrkMast1.getWrkNo() + "");
// dto1.setTaskPri((int) Math.round(wrkMast1.getIoPri()));
- return R.ok(dto1);
- }
+ return R.ok(dto1);
+ }
// List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1));
// if (!Cools.isEmpty(wrkMasts) && wrkMasts.size() > 10) {
// return R.error("闄愯");
// }
- waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
- if (Cools.isEmpty(waitPakins)) {
- return R.error("璇峰厛娣诲姞鍏ュ簱閫氱煡妗�");
+ waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
+ if (Cools.isEmpty(waitPakins)) {
+ return R.error("璇峰厛娣诲姞鍏ュ簱閫氱煡妗�");
// WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
// if (wrkMast != null && wrkMast.getIoType() == 103) {
// return R.parse(CodeRes.PICK_600);
@@ -112,27 +117,30 @@
// return R.error("鑷姩鐢熸垚鍏ュ簱閫氱煡妗e悗鏈煡璇㈠埌鏁版嵁");
// }
// log.info("WCS鍏ュ簱鎺ュ彛鑷姩鐢熸垚鍏ュ簱閫氱煡妗�, zpallet:{}, matnr:{}, anfme:{}", param.getBarcode(), "32149", 1D);
- }
- int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()));
- int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBarcode()));
- if (countLoc > 0 || countWrk > 0) {
- return R.error(CodeRes.EXIST_500);
- }
- if (Cools.isEmpty(param.getLocType1())) {
- return R.error("楂樹綆妫�娴嬩俊鍙蜂笉鑳戒负绌�");
- }
+ }
+ int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()));
+ int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBarcode()));
+ if (countLoc > 0 || countWrk > 0) {
+ return R.error(CodeRes.EXIST_500);
+ }
+ if (Cools.isEmpty(param.getLocType1())) {
+ return R.error("楂樹綆妫�娴嬩俊鍙蜂笉鑳戒负绌�");
+ }
- // 婧愮珯鐐圭姸鎬佹娴�
- BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
- sourceStaNo.setLocType1(param.getLocType1());
- LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
- if (waitPakins.get(0).getMatnr().equals("emptyPallet")) {
- locTypeDto.setLocType2((short) 1);
- }
+ // 婧愮珯鐐圭姸鎬佹娴�
+ BasDevp sourceStaNoEntity = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
+ sourceStaNoEntity.setLocType1(param.getLocType1());
+ LocTypeDto locTypeDto = new LocTypeDto(sourceStaNoEntity);
+ if (waitPakins.get(0).getMatnr().equals("emptyPallet")) {
+ locTypeDto.setLocType2((short) 1);
+ }
- StartupDto dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins);
- log.info("WCS鍏ュ簱鎺ュ彛杩斿弬:{},鎵樼洏鐮�:{}", dto, param.getBarcode());
- return R.ok().add(dto);
+ StartupDto dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins);
+ log.info("WCS鍏ュ簱鎺ュ彛杩斿弬:{},鎵樼洏鐮�:{}", dto, param.getBarcode());
+ return R.ok().add(dto);
+ } finally {
+ log.info("WCS鍏ュ簱鎺ュ彛鎬昏�楁椂:{}ms, sourceStaNo:{}, barcode:{}", System.currentTimeMillis() - startTime, sourceStaNo, barcode);
+ }
}
@PostMapping("/pakin/agv/loc/v1")
@@ -439,92 +447,141 @@
public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) {
long startTime = System.currentTimeMillis();
try {
- // 婧愮珯鐐圭姸鎬佹娴�
- BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
- // 妫�绱㈠簱浣�
- List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
- List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
- FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
+ // 婧愮珯鐐圭姸鎬佹娴�
+ BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
+ // 妫�绱㈠簱浣�
+ List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
+ List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
+ FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
// FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
- // 婊℃澘鍏ュ簱缁熶竴鎸夊簱浣嶆帓鍙�(row_lastno)鐨� currentRow/crn_qty 杞锛屼笉鍙傝�� WCS 閫忎紶鐨勬帹鑽愭帓銆�
- StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
- int workNo = dto.getWorkNo();
- Date now = new Date();
- // 鐢熸垚宸ヤ綔妗�
- WrkMast wrkMast = new WrkMast();
- wrkMast.setWrkNo(workNo);
- wrkMast.setIoTime(new Date());
- wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
- wrkMast.setIoType(1); // 鍏ュ嚭搴撶姸鎬侊細1.鍏ュ簱
- wrkMast.setIoPri(13D); // 浼樺厛绾�
- wrkMast.setCrnNo(dto.getCrnNo());
- wrkMast.setSourceStaNo(dto.getSourceStaNo());
- wrkMast.setStaNo(dto.getStaNo());
- wrkMast.setLocNo(dto.getLocNo());
- wrkMast.setBarcode(barcode); // 鎵樼洏鐮�
- wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
- wrkMast.setPicking("N"); // 鎷f枡
- wrkMast.setExitMk("N"); // 閫�鍑�
- wrkMast.setEmptyMk("N"); // 绌烘澘
- wrkMast.setLinkMis("Y");
- wrkMast.setCtnType(sourceStaNo.getCtnType()); // 瀹瑰櫒绫诲瀷
- // 鎿嶄綔浜哄憳鏁版嵁
- wrkMast.setAppeTime(now);
- wrkMast.setModiTime(now);
- boolean res = wrkMastService.insert(wrkMast);
- if (!res) {
- throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
- }
- // 鐢熸垚宸ヤ綔妗f槑缁�
- waitPakins.forEach(waitPakin -> {
- WrkDetl wrkDetl = new WrkDetl();
- wrkDetl.sync(waitPakin);
- wrkDetl.setWrkNo(wrkMast.getWrkNo());
- wrkDetl.setIoTime(wrkMast.getIoTime());
- wrkDetl.setAppeTime(now);
- wrkDetl.setModiTime(now);
- if (!wrkDetlService.insert(wrkDetl)) {
- throw new CoolException("淇濆瓨宸ヤ綔鏄庣粏澶辫触");
+ // IoT 鎸囧畾浜嗙洰鏍囧簱浣嶆椂浼樺厛灏濊瘯璇ュ簱浣嶏紱涓嶅彲鐢ㄦ椂鍐嶉��鍥炵幇鏈夎嚜鍔ㄦ壘浣嶈鍒欍��
+ StartupDto dto = buildPreferredStartupDto(devpNo, extractPreferredInboundLoc(waitPakins));
+ if (dto == null) {
+ dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
}
- });
- // 鏇存柊鍏ュ簱閫氱煡妗� ioStatus ===>> Y
- Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
- .eq("zpallet", barcode);
- WaitPakin setParam = new WaitPakin();
- setParam.setLocNo(dto.getLocNo());
- setParam.setIoStatus("Y");
- setParam.setModiTime(now);
- if (!waitPakinService.update(setParam, wrapper)) {
- throw new CoolException("鏇存柊閫氱煡妗eけ璐�");
- }
+ int workNo = dto.getWorkNo();
+ Date now = new Date();
+ // 鐢熸垚宸ヤ綔妗�
+ WrkMast wrkMast = new WrkMast();
+ wrkMast.setWrkNo(workNo);
+ wrkMast.setIoTime(new Date());
+ wrkMast.setWrkSts(2L); // 宸ヤ綔鐘舵�侊細鐢熸垚鍏ュ簱ID
+ wrkMast.setIoType(1); // 鍏ュ嚭搴撶姸鎬侊細1.鍏ュ簱
+ wrkMast.setIoPri(13D); // 浼樺厛绾�
+ wrkMast.setCrnNo(dto.getCrnNo());
+ wrkMast.setSourceStaNo(dto.getSourceStaNo());
+ wrkMast.setStaNo(dto.getStaNo());
+ wrkMast.setLocNo(dto.getLocNo());
+ wrkMast.setBarcode(barcode); // 鎵樼洏鐮�
+ wrkMast.setFullPlt("Y"); // 婊℃澘锛歒
+ wrkMast.setPicking("N"); // 鎷f枡
+ wrkMast.setExitMk("N"); // 閫�鍑�
+ wrkMast.setEmptyMk("N"); // 绌烘澘
+ wrkMast.setLinkMis("Y");
+ // 鎶� referenceId/orderNo 閫忎紶鍒板伐浣滀富妗o紝渚夸簬浣滀笟瀹屾垚鍚庣户缁洖浼犵粰 IoT銆�
+ wrkMast.setUserNo(waitPakins.get(0).getOrderNo());
+ wrkMast.setCtnType(sourceStaNo.getCtnType()); // 瀹瑰櫒绫诲瀷
+ // 鎿嶄綔浜哄憳鏁版嵁
+ wrkMast.setAppeTime(now);
+ wrkMast.setModiTime(now);
+ boolean res = wrkMastService.insert(wrkMast);
+ if (!res) {
+ throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+ }
+ // 鐢熸垚宸ヤ綔妗f槑缁�
+ waitPakins.forEach(waitPakin -> {
+ WrkDetl wrkDetl = new WrkDetl();
+ wrkDetl.sync(waitPakin);
+ wrkDetl.setWrkNo(wrkMast.getWrkNo());
+ wrkDetl.setIoTime(wrkMast.getIoTime());
+ wrkDetl.setAppeTime(now);
+ wrkDetl.setModiTime(now);
+ if (!wrkDetlService.insert(wrkDetl)) {
+ throw new CoolException("淇濆瓨宸ヤ綔鏄庣粏澶辫触");
+ }
+ });
+ // 鏇存柊鍏ュ簱閫氱煡妗� ioStatus ===>> Y
+ Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
+ .eq("zpallet", barcode);
+ WaitPakin setParam = new WaitPakin();
+ setParam.setLocNo(dto.getLocNo());
+ setParam.setIoStatus("Y");
+ setParam.setModiTime(now);
+ if (!waitPakinService.update(setParam, wrapper)) {
+ throw new CoolException("鏇存柊閫氱煡妗eけ璐�");
+ }
// // 鏇存柊婧愮珯鐐逛俊鎭�
// sourceStaNo.setWrkNo(workNo);
// sourceStaNo.setModiTime(now);
// if (!basDevpService.updateById(sourceStaNo)){
// throw new CoolException("鏇存柊婧愮珯澶辫触");
// }
- // 鏇存柊鐩爣搴撲綅鐘舵��
- LocMast locMast = locMastService.selectById(dto.getLocNo());
- if (locMast.getLocSts().equals("O")) {
- locMast.setLocSts("S"); // S.鍏ュ簱棰勭害
- locMast.setModiTime(now);
- if (!locMastService.updateById(locMast)) {
- throw new CoolException("鏀瑰彉搴撲綅鐘舵�佸け璐�");
+ // 鏇存柊鐩爣搴撲綅鐘舵��
+ LocMast locMast = locMastService.selectById(dto.getLocNo());
+ if (locMast.getLocSts().equals("O")) {
+ locMast.setLocSts("S"); // S.鍏ュ簱棰勭害
+ locMast.setModiTime(now);
+ if (!locMastService.updateById(locMast)) {
+ throw new CoolException("鏀瑰彉搴撲綅鐘舵�佸け璐�");
+ }
+ } else {
+ throw new CoolException(dto.getLocNo() + "鐩爣搴撲綅宸茶鍗犵敤");
}
- } else {
- throw new CoolException(dto.getLocNo() + "鐩爣搴撲綅宸茶鍗犵敤");
- }
- String wcsLoc = Utils.WMSLocToWCSLoc(dto.getLocNo());
- dto.setLocNo(wcsLoc);
- dto.setTaskNo(workNo + "");
- return dto;
+ String wcsLoc = Utils.WMSLocToWCSLoc(dto.getLocNo());
+ dto.setLocNo(wcsLoc);
+ dto.setTaskNo(workNo + "");
+ return dto;
} finally {
log.info("startupFullPutStore鑰楁椂:{}ms, sourceStaNo:{}, barcode:{}", System.currentTimeMillis() - startTime, devpNo, barcode);
}
}
+ /**
+ * 鎸囧畾搴撲綅鏆傚瓨鍦ㄥ叆搴撻�氱煡妗� manu 瀛楁锛岀瓑 WCS 鐪熸寤轰换鍔℃椂鍐嶈鍙栥��
+ */
+ private String extractPreferredInboundLoc(List<WaitPakin> waitPakins) {
+ if (Cools.isEmpty(waitPakins)) {
+ return null;
+ }
+ for (WaitPakin waitPakin : waitPakins) {
+ if (!Cools.isEmpty(waitPakin.getManu())) {
+ return waitPakin.getManu();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鎶婅繙绔寚瀹氬簱浣嶈浆鎹㈡垚鍙洿鎺ヤ笅鍙戠粰 WCS 鐨勭洰鏍囩珯鍙板拰浣滀笟鍙傛暟銆�
+ * 濡傛灉搴撲綅宸插崰鐢ㄦ垨瀵瑰簲璁惧涓嶅湪鑷姩妯″紡锛屽垯杩斿洖 null 浜ょ粰鍘熸湁鎵句綅閫昏緫澶勭悊銆�
+ */
+ private StartupDto buildPreferredStartupDto(Integer sourceStaNo, String preferredLocNo) {
+ if (Cools.isEmpty(preferredLocNo)) {
+ return null;
+ }
+ LocMast targetLoc = locMastService.selectById(preferredLocNo);
+ if (targetLoc == null || !"O".equalsIgnoreCase(targetLoc.getLocSts())) {
+ return null;
+ }
+ StaDesc staDesc = staDescService.queryCrnStn(targetLoc.getCrnNo());
+ if (staDesc == null) {
+ return null;
+ }
+ BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
+ if (staNo == null || !"Y".equalsIgnoreCase(staNo.getAutoing())) {
+ return null;
+ }
+ StartupDto dto = new StartupDto();
+ dto.setWorkNo(commonService.getWorkNo(0));
+ dto.setCrnNo(targetLoc.getCrnNo());
+ dto.setSourceStaNo(sourceStaNo);
+ dto.setStaNo(staNo.getDevNo());
+ dto.setLocNo(targetLoc.getLocNo());
+ return dto;
+ }
+
@Transactional
- public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode) {
+public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode) {
// 婧愮珯鐐圭姸鎬佹娴�
BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
// 妫�绱㈠簱浣�
diff --git a/src/main/java/com/zy/integration/iot/biz/IotInstructionService.java b/src/main/java/com/zy/integration/iot/biz/IotInstructionService.java
new file mode 100644
index 0000000..7c6e9b8
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/biz/IotInstructionService.java
@@ -0,0 +1,16 @@
+package com.zy.integration.iot.biz;
+
+import com.zy.asrs.entity.WrkMast;
+import com.zy.iot.entity.IotFeedbackMessage;
+import com.zy.iot.entity.IotInstructionMessage;
+
+public interface IotInstructionService {
+
+ Long handleStowInstruction(IotInstructionMessage message, String topic, String rawPayload);
+
+ Long handlePickInstruction(IotInstructionMessage message, String topic, String rawPayload);
+
+ void handleFeedbackAck(IotFeedbackMessage feedbackMessage, String topic, String rawPayload);
+
+ void queueWorkCompletion(WrkMast wrkMast);
+}
diff --git a/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java b/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java
new file mode 100644
index 0000000..314d3f8
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java
@@ -0,0 +1,439 @@
+package com.zy.integration.iot.biz.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.entity.WrkDetl;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.entity.param.MesToCombParam;
+import com.zy.asrs.entity.param.OutTaskParam;
+import com.zy.asrs.service.ExternalTaskFacadeService;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkDetlService;
+import com.zy.integration.iot.biz.IotInstructionService;
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.constant.IotConstants;
+import com.zy.iot.entity.IotFeedbackMessage;
+import com.zy.iot.entity.IotInstructionMessage;
+import com.zy.iot.entity.IotPublishRecord;
+import com.zy.iot.service.IotPublishRecordService;
+import com.zy.iot.util.IotInstructionIdGenerator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * IoT 鎸囦护鏍稿績缂栨帓鏈嶅姟銆�
+ * 璐熻矗鎶� XBPS 涓嬪彂鐨� MQTT 鎸囦护杞崲鎴愮幇鏈� ASRS 鍏ュ簱/鍑哄簱娴佺▼锛屽苟鍦ㄦ湰鍦拌褰曞箓绛夈�佷贡搴忓拰鍥炴墽鐘舵�併��
+ */
+@Slf4j
+@Service
+public class IotInstructionServiceImpl implements IotInstructionService {
+
+ @Autowired
+ private IotPublishRecordService iotPublishRecordService;
+ @Autowired
+ private IotProperties iotProperties;
+ @Autowired
+ private ExternalTaskFacadeService externalTaskFacadeService;
+ @Autowired
+ private LocMastService locMastService;
+ @Autowired
+ private WrkDetlService wrkDetlService;
+
+ /**
+ * 澶勭悊 egress/asrs/stow 鎸囦护銆�
+ * 鍙帴鍗曞拰棰勭櫥璁帮紝涓嶅湪 MQTT 鍥炶皟閲岀洿鎺ヨЕ鍙戠湡瀹炲叆搴撲綔涓氥��
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long handleStowInstruction(IotInstructionMessage message, String topic, String rawPayload) {
+ if (message == null || Cools.isEmpty(message.getInstructionId())) {
+ log.warn("ignore invalid stow message, payload={}", rawPayload);
+ return null;
+ }
+ IotPublishRecord existing = iotPublishRecordService.findByInstructionId(message.getInstructionId());
+ if (existing != null) {
+ return existing.getId();
+ }
+
+ IotPublishRecord record = initInboundRecord(message, topic, rawPayload, IotConstants.MESSAGE_TYPE_STOW);
+ iotPublishRecordService.insert(record);
+ if (Cools.isEmpty(message.getContainerId())) {
+ return updateAsFailure(record, null, "containerId涓嶈兘涓虹┖");
+ }
+ if (isDelayed(message, IotConstants.MESSAGE_TYPE_STOW)) {
+ return updateAsFailure(record, IotConstants.ERROR_CODE_DELAYED, "寤惰繜娑堟伅宸插拷鐣�");
+ }
+
+ String preferredLocNo = resolvePreferredInboundLoc(message);
+ MesToCombParam param = buildInboundParam(message, preferredLocNo);
+ R result = externalTaskFacadeService.acceptInboundNotice(param);
+ if (result == null || !Objects.equals(result.get("code"), 200)) {
+ return updateAsFailure(record, null, resolveResultMessage(result, "鎺ユ敹鍏ュ簱鎸囦护澶辫触"));
+ }
+
+ Date now = new Date();
+ record.setOrderNo(param.getOrderId());
+ record.setProcessStatus(IotConstants.PROCESS_STATUS_PROCESSED);
+ record.setErrorCode(null);
+ record.setErrorMessage(null);
+ applyFeedback(record, IotConstants.FEEDBACK_SUCCESS, null, null, now);
+ iotPublishRecordService.updateById(record);
+ return record.getId();
+ }
+
+ /**
+ * 澶勭悊 egress/asrs/pick 鎸囦护銆�
+ * 杩滅鍑哄簱鍙d細鍏堟槧灏勬垚鏈湴绔欏彴鍙凤紝鍐嶅鐢ㄧ幇鏈夊嚭搴撳缓鍗曞苟鑷姩纭鏀捐銆�
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long handlePickInstruction(IotInstructionMessage message, String topic, String rawPayload) {
+ if (message == null || Cools.isEmpty(message.getInstructionId())) {
+ log.warn("ignore invalid pick message, payload={}", rawPayload);
+ return null;
+ }
+ IotPublishRecord existing = iotPublishRecordService.findByInstructionId(message.getInstructionId());
+ if (existing != null) {
+ return existing.getId();
+ }
+
+ IotPublishRecord record = initInboundRecord(message, topic, rawPayload, IotConstants.MESSAGE_TYPE_PICK);
+ iotPublishRecordService.insert(record);
+ if (Cools.isEmpty(message.getContainerId())) {
+ return updateAsFailure(record, null, "containerId涓嶈兘涓虹┖");
+ }
+ if (isDelayed(message, IotConstants.MESSAGE_TYPE_PICK)) {
+ return updateAsFailure(record, IotConstants.ERROR_CODE_DELAYED, "寤惰繜娑堟伅宸插拷鐣�");
+ }
+
+ String remoteDestination = extractFirstDestination(message.getDestinationLocationIds());
+ Integer stationId = Cools.isEmpty(remoteDestination) ? null : iotProperties.getPickStationMappings().get(remoteDestination);
+ if (stationId == null) {
+ return updateAsFailure(record, IotConstants.ERROR_CODE_STATION_MAPPING, "鏈壘鍒扮洰鏍囧嚭搴撳彛鏄犲皠");
+ }
+
+ OutTaskParam param = new OutTaskParam();
+ param.setPalletId(message.getContainerId());
+ param.setOrderId(resolveReferenceId(message));
+ param.setStationId(String.valueOf(stationId));
+ param.setSeq(1);
+ R result = externalTaskFacadeService.createOutboundTask(param, true);
+ if (result == null || !Objects.equals(result.get("code"), 200)) {
+ return updateAsFailure(record, null, resolveResultMessage(result, "鎺ユ敹鎷h揣鎸囦护澶辫触"));
+ }
+
+ Date now = new Date();
+ record.setOrderNo(param.getOrderId());
+ record.setWrkNo(resolveWrkNo(result));
+ record.setProcessStatus(IotConstants.PROCESS_STATUS_PROCESSED);
+ record.setErrorCode(null);
+ record.setErrorMessage(null);
+ applyFeedback(record, IotConstants.FEEDBACK_SUCCESS, null, null, now);
+ iotPublishRecordService.updateById(record);
+ return record.getId();
+ }
+
+ /**
+ * 澶勭悊 XBPS 瀵� ASRS 鍔ㄤ綔娑堟伅鐨� feedback 鍥炴墽銆�
+ * 杩欓噷鍙洖鍐� IoT 鍙戝竷鐘舵�侊紝涓嶆敼搴撳瓨鍜屽伐浣滄。銆�
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void handleFeedbackAck(IotFeedbackMessage feedbackMessage, String topic, String rawPayload) {
+ if (feedbackMessage == null || Cools.isEmpty(feedbackMessage.getInstructionId())) {
+ return;
+ }
+ IotPublishRecord record = iotPublishRecordService.findByInstructionId(feedbackMessage.getInstructionId());
+ if (record == null || !IotConstants.DIRECTION_OUTBOUND.equals(record.getDirection())) {
+ log.warn("ignore iot ack without outbound record, instructionId={}", feedbackMessage.getInstructionId());
+ return;
+ }
+ Date now = new Date();
+ record.setAckPayload(rawPayload);
+ record.setAckTime(now);
+ record.setReceiveTopic(topic);
+ record.setPublishStatus(IotConstants.FEEDBACK_SUCCESS.equalsIgnoreCase(feedbackMessage.getStatus())
+ ? IotConstants.PUBLISH_STATUS_ACK_SUCCESS
+ : IotConstants.PUBLISH_STATUS_ACK_FAILURE);
+ record.setErrorCode(feedbackMessage.getErrorCode());
+ record.setErrorMessage(truncate(feedbackMessage.getMessage(), 500));
+ record.setUpdateTime(now);
+ iotPublishRecordService.updateById(record);
+ }
+
+ /**
+ * 鍦ㄥ伐浣滄。鐪熸瀹屾垚鍚庤惤涓�鏉″緟鍙戝竷璁板綍銆�
+ * 浜嬪姟鍐呭彧鍐欏簱锛屼笉鐩存帴鍙� MQTT锛岄伩鍏嶄笟鍔℃彁浜ゅ拰缃戠粶鍙戦�佽�﹀悎銆�
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void queueWorkCompletion(WrkMast wrkMast) {
+ if (!iotProperties.isEnabled() || wrkMast == null || wrkMast.getWrkNo() == null) {
+ return;
+ }
+ IotPublishRecord existed = iotPublishRecordService.selectOne(new EntityWrapper<IotPublishRecord>()
+ .eq("direction", IotConstants.DIRECTION_OUTBOUND)
+ .eq("wrk_no", wrkMast.getWrkNo()));
+ if (existed != null) {
+ return;
+ }
+ IotPublishRecord record = buildOutboundRecord(wrkMast);
+ if (record != null) {
+ iotPublishRecordService.insert(record);
+ }
+ }
+
+ private IotPublishRecord initInboundRecord(IotInstructionMessage message, String topic, String rawPayload, String messageType) {
+ Date now = new Date();
+ IotPublishRecord record = new IotPublishRecord();
+ record.setInstructionId(message.getInstructionId());
+ record.setDirection(IotConstants.DIRECTION_INBOUND);
+ record.setMessageType(messageType);
+ record.setReceiveTopic(topic);
+ record.setContainerId(message.getContainerId());
+ record.setReferenceId(message.getReferenceId());
+ record.setSourceLocationId(message.getSourceLocationId());
+ record.setDestinationLocationIds(normalizeDestinations(message.getDestinationLocationIds()));
+ record.setMessageCreationTime(resolveCreationTime(message.getCreationTime()));
+ record.setRawPayload(rawPayload);
+ record.setProcessStatus(IotConstants.PROCESS_STATUS_RECEIVED);
+ record.setPublishStatus(IotConstants.PUBLISH_STATUS_NOT_REQUIRED);
+ record.setCreateTime(now);
+ record.setUpdateTime(now);
+ return record;
+ }
+
+ private boolean isDelayed(IotInstructionMessage message, String messageType) {
+ Long creationTime = resolveCreationTime(message.getCreationTime());
+ IotPublishRecord latest = iotPublishRecordService.findLatestInboundInstruction(message.getContainerId(), messageType);
+ return latest != null && latest.getMessageCreationTime() != null && latest.getMessageCreationTime() > creationTime;
+ }
+
+ /**
+ * IoT 鏂囨。鏈彁渚涚墿鏂欏拰鏁伴噺鏄庣粏锛岃繖閲屾部鐢ㄧ幇鏈夋弧鎵樺叆搴撻�氱煡鐨勫厹搴曠害瀹氥��
+ */
+ private MesToCombParam buildInboundParam(IotInstructionMessage message, String preferredLocNo) {
+ MesToCombParam param = new MesToCombParam();
+ param.setPalletId(message.getContainerId());
+ param.setOrderId("");
+ param.setBizNo(message.getInstructionId());
+ param.setAnfme(1D);
+ param.setFull(1);
+ param.setLocId(preferredLocNo);
+ param.setBoxType1("aws");
+ return param;
+ }
+
+ /**
+ * 浠呭綋鎸囧畾搴撲綅褰撳墠浠嶄负绌轰綅鏃舵墠寮哄埗浼樺厛浣跨敤锛屽惁鍒欏洖閫�鍒板師鏈夎嚜鍔ㄦ壘浣嶃��
+ */
+ private String resolvePreferredInboundLoc(IotInstructionMessage message) {
+ String preferredLoc = extractFirstDestination(message.getDestinationLocationIds());
+ if (Cools.isEmpty(preferredLoc)) {
+ return null;
+ }
+ LocMast locMast = locMastService.selectById(preferredLoc);
+ if (locMast != null && "O".equalsIgnoreCase(locMast.getLocSts())) {
+ return locMast.getLocNo();
+ }
+ return null;
+ }
+
+ private String resolveReferenceId(IotInstructionMessage message) {
+ return Cools.isEmpty(message.getReferenceId()) ? message.getInstructionId() : message.getReferenceId();
+ }
+
+ private Long updateAsFailure(IotPublishRecord record, String errorCode, String errorMessage) {
+ Date now = new Date();
+ record.setProcessStatus(IotConstants.PROCESS_STATUS_FAILED);
+ record.setOrderNo(Cools.isEmpty(record.getOrderNo()) ? record.getReferenceId() : record.getOrderNo());
+ record.setErrorCode(errorCode);
+ record.setErrorMessage(truncate(errorMessage, 500));
+ applyFeedback(record, IotConstants.FEEDBACK_FAILURE, errorCode, errorMessage, now);
+ iotPublishRecordService.updateById(record);
+ return record.getId();
+ }
+
+ private void applyFeedback(IotPublishRecord record, String status, String errorCode, String errorMessage, Date now) {
+ IotFeedbackMessage feedbackMessage = new IotFeedbackMessage();
+ feedbackMessage.setInstructionId(record.getInstructionId());
+ feedbackMessage.setStatus(status);
+ feedbackMessage.setErrorCode(errorCode);
+ feedbackMessage.setMessage(errorMessage);
+ feedbackMessage.setCreationTime(System.currentTimeMillis());
+
+ record.setFeedbackStatus(status);
+ record.setPublishTopic(iotProperties.getTopics().getIngressFeedback());
+ record.setPublishPayload(JSON.toJSONString(feedbackMessage));
+ record.setPublishStatus(IotConstants.PUBLISH_STATUS_PENDING);
+ record.setUpdateTime(now);
+ }
+
+ private String resolveResultMessage(R result, String defaultMessage) {
+ if (result == null) {
+ return defaultMessage;
+ }
+ Object msg = result.get("msg");
+ return msg == null ? defaultMessage : String.valueOf(msg);
+ }
+
+ private Integer resolveWrkNo(R result) {
+ if (result == null) {
+ return null;
+ }
+ Object wrkNo = result.get("wrkNo");
+ if (wrkNo instanceof Number) {
+ return ((Number) wrkNo).intValue();
+ }
+ if (wrkNo instanceof String && !Cools.isEmpty(String.valueOf(wrkNo))) {
+ return Integer.valueOf(String.valueOf(wrkNo));
+ }
+ return null;
+ }
+
+ private IotPublishRecord buildOutboundRecord(WrkMast wrkMast) {
+ Integer ioType = wrkMast.getIoType();
+ if (ioType == null) {
+ return null;
+ }
+ String containerId = resolveContainerId(wrkMast);
+ if (Cools.isEmpty(containerId)) {
+ return null;
+ }
+ if (Arrays.asList(1, 8, 11, 53, 54, 57).contains(ioType)) {
+ return buildStowOutboundRecord(wrkMast, containerId);
+ }
+ if (Arrays.asList(101, 108).contains(ioType)) {
+ return buildPickOutboundRecord(wrkMast, containerId);
+ }
+ return null;
+ }
+
+ private IotPublishRecord buildStowOutboundRecord(WrkMast wrkMast, String containerId) {
+ List<String> destinationLocationIds = wrkMast.getLocNo() == null
+ ? Collections.<String>emptyList()
+ : Collections.singletonList(wrkMast.getLocNo());
+ if (destinationLocationIds.isEmpty()) {
+ return null;
+ }
+ IotInstructionMessage payload = new IotInstructionMessage();
+ payload.setInstructionId(IotInstructionIdGenerator.generate(String.valueOf(wrkMast.getWrkNo())));
+ payload.setContainerId(containerId);
+ if (Objects.equals(wrkMast.getIoType(), 11)) {
+ payload.setSourceLocationId(wrkMast.getSourceLocNo());
+ }
+ payload.setDestinationLocationIds(destinationLocationIds);
+ if (!Cools.isEmpty(wrkMast.getUserNo())) {
+ payload.setReferenceId(wrkMast.getUserNo());
+ }
+ payload.setCreationTime(System.currentTimeMillis());
+ return initOutboundRecord(wrkMast, IotConstants.MESSAGE_TYPE_STOW, iotProperties.getTopics().getIngressStow(), payload);
+ }
+
+ private IotPublishRecord buildPickOutboundRecord(WrkMast wrkMast, String containerId) {
+ IotInstructionMessage payload = new IotInstructionMessage();
+ payload.setInstructionId(IotInstructionIdGenerator.generate(String.valueOf(wrkMast.getWrkNo())));
+ payload.setContainerId(containerId);
+ payload.setSourceLocationId(wrkMast.getSourceLocNo());
+ payload.setDestinationLocationIds(Collections.singletonList(resolveRemoteStationId(wrkMast.getStaNo())));
+ if (!Cools.isEmpty(wrkMast.getUserNo())) {
+ payload.setReferenceId(wrkMast.getUserNo());
+ }
+ payload.setCreationTime(System.currentTimeMillis());
+ return initOutboundRecord(wrkMast, IotConstants.MESSAGE_TYPE_PICK, iotProperties.getTopics().getIngressPick(), payload);
+ }
+
+ private IotPublishRecord initOutboundRecord(WrkMast wrkMast, String messageType, String publishTopic, IotInstructionMessage payload) {
+ Date now = new Date();
+ IotPublishRecord record = new IotPublishRecord();
+ record.setInstructionId(payload.getInstructionId());
+ record.setDirection(IotConstants.DIRECTION_OUTBOUND);
+ record.setMessageType(messageType);
+ record.setPublishTopic(publishTopic);
+ record.setContainerId(payload.getContainerId());
+ record.setReferenceId(payload.getReferenceId());
+ record.setSourceLocationId(payload.getSourceLocationId());
+ record.setDestinationLocationIds(normalizeDestinations(payload.getDestinationLocationIds()));
+ record.setMessageCreationTime(payload.getCreationTime());
+ record.setPublishPayload(JSON.toJSONString(payload));
+ record.setRawPayload(record.getPublishPayload());
+ record.setProcessStatus(IotConstants.PROCESS_STATUS_PENDING);
+ record.setPublishStatus(IotConstants.PUBLISH_STATUS_PENDING);
+ record.setWrkNo(wrkMast.getWrkNo());
+ record.setOrderNo(wrkMast.getUserNo());
+ record.setCreateTime(now);
+ record.setUpdateTime(now);
+ return record;
+ }
+
+ private String resolveContainerId(WrkMast wrkMast) {
+ if (!Cools.isEmpty(wrkMast.getBarcode())) {
+ return wrkMast.getBarcode();
+ }
+ List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
+ if (Cools.isEmpty(wrkDetls)) {
+ return null;
+ }
+ for (WrkDetl wrkDetl : wrkDetls) {
+ if (!Cools.isEmpty(wrkDetl.getZpallet())) {
+ return wrkDetl.getZpallet();
+ }
+ }
+ return null;
+ }
+
+ private String resolveRemoteStationId(Integer staNo) {
+ if (staNo == null) {
+ return null;
+ }
+ for (Map.Entry<String, Integer> entry : iotProperties.getPickStationMappings().entrySet()) {
+ if (Objects.equals(entry.getValue(), staNo)) {
+ return entry.getKey();
+ }
+ }
+ return String.valueOf(staNo);
+ }
+
+ private String extractFirstDestination(List<String> destinationLocationIds) {
+ if (Cools.isEmpty(destinationLocationIds)) {
+ return null;
+ }
+ for (String destinationLocationId : destinationLocationIds) {
+ if (!Cools.isEmpty(destinationLocationId)) {
+ return destinationLocationId;
+ }
+ }
+ return null;
+ }
+
+ private Long resolveCreationTime(Long creationTime) {
+ return creationTime == null ? System.currentTimeMillis() : creationTime;
+ }
+
+ private String normalizeDestinations(List<String> destinationLocationIds) {
+ if (Cools.isEmpty(destinationLocationIds)) {
+ return null;
+ }
+ return JSON.toJSONString(new ArrayList<String>(destinationLocationIds));
+ }
+
+ private String truncate(String message, int maxLength) {
+ if (message == null || message.length() <= maxLength) {
+ return message;
+ }
+ return message.substring(0, maxLength);
+ }
+}
diff --git a/src/main/java/com/zy/integration/iot/client/IotMqttClient.java b/src/main/java/com/zy/integration/iot/client/IotMqttClient.java
new file mode 100644
index 0000000..1904797
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/client/IotMqttClient.java
@@ -0,0 +1,10 @@
+package com.zy.integration.iot.client;
+
+public interface IotMqttClient {
+
+ void ensureConnected() throws Exception;
+
+ void publish(String topic, String payload) throws Exception;
+
+ boolean isConnected();
+}
diff --git a/src/main/java/com/zy/integration/iot/client/impl/PahoIotMqttClient.java b/src/main/java/com/zy/integration/iot/client/impl/PahoIotMqttClient.java
new file mode 100644
index 0000000..231666b
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/client/impl/PahoIotMqttClient.java
@@ -0,0 +1,205 @@
+package com.zy.integration.iot.client.impl;
+
+import com.core.common.Cools;
+import com.zy.integration.iot.client.IotMqttClient;
+import com.zy.integration.iot.handler.IotInboundMessageHandler;
+import com.zy.integration.iot.util.IotMqttSslUtils;
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.entity.IotTopicConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * IoT MQTT 瀹㈡埛绔��
+ * 鍏煎 AWS IoT 鐨� mTLS 妯″紡锛屼篃鍏煎灞�鍩熺綉妯℃嫙 broker 鐨勬槑鏂� TCP 妯″紡銆�
+ */
+@Slf4j
+@Service
+public class PahoIotMqttClient implements IotMqttClient {
+
+ @Autowired
+ private IotProperties iotProperties;
+ @Autowired
+ private IotInboundMessageHandler inboundMessageHandler;
+
+ private volatile MqttClient mqttClient;
+
+ @PostConstruct
+ public void init() {
+ if (!iotProperties.isEnabled()) {
+ return;
+ }
+ try {
+ ensureConnected();
+ } catch (Exception e) {
+ log.error("initial connect to iot mqtt failed", e);
+ }
+ }
+
+ @PreDestroy
+ public void destroy() {
+ if (mqttClient == null) {
+ return;
+ }
+ try {
+ if (mqttClient.isConnected()) {
+ mqttClient.disconnect();
+ }
+ mqttClient.close();
+ } catch (Exception e) {
+ log.warn("close iot mqtt client failed", e);
+ }
+ }
+
+ /**
+ * 鎳掑姞杞藉缓杩烇紝棣栨鍙戦�佹垨鍚姩鏃惰嚜鍔ㄨ繛鎺ュ苟琛ヨ闃呬富棰樸��
+ */
+ @Override
+ public synchronized void ensureConnected() throws Exception {
+ if (!iotProperties.isEnabled()) {
+ return;
+ }
+ if (!hasRequiredConfig()) {
+ log.warn("iot config incomplete, mqtt client will not connect");
+ return;
+ }
+ if (mqttClient == null) {
+ mqttClient = createClient();
+ }
+ if (mqttClient.isConnected()) {
+ return;
+ }
+ mqttClient.connect(buildOptions());
+ subscribeTopics();
+ }
+
+ /**
+ * 缁熶竴鎸� QoS1 鍙戝竷锛屽吋椤惧彲闈犳�у拰瀹炵幇澶嶆潅搴︺��
+ */
+ @Override
+ public void publish(String topic, String payload) throws Exception {
+ if (!iotProperties.isEnabled() || Cools.isEmpty(topic) || payload == null) {
+ return;
+ }
+ ensureConnected();
+ if (mqttClient == null || !mqttClient.isConnected()) {
+ throw new MqttException(MqttException.REASON_CODE_CLIENT_NOT_CONNECTED);
+ }
+ MqttMessage mqttMessage = new MqttMessage(payload.getBytes(StandardCharsets.UTF_8));
+ mqttMessage.setQos(1);
+ mqttMessage.setRetained(false);
+ mqttClient.publish(topic, mqttMessage);
+ }
+
+ @Override
+ public boolean isConnected() {
+ return mqttClient != null && mqttClient.isConnected();
+ }
+
+ private boolean hasRequiredConfig() {
+ if (Cools.isEmpty(iotProperties.getServerUri()) || Cools.isEmpty(iotProperties.getResolvedClientId())) {
+ return false;
+ }
+ if (!iotProperties.isTlsEnabled()) {
+ return true;
+ }
+ return !Cools.isEmpty(iotProperties.getCaCertPath())
+ && !Cools.isEmpty(iotProperties.getClientCertPath())
+ && !Cools.isEmpty(iotProperties.getPrivateKeyPath());
+ }
+
+ private MqttClient createClient() throws Exception {
+ MqttClient client = new MqttClient(
+ iotProperties.getServerUri(),
+ iotProperties.getResolvedClientId(),
+ new MqttDefaultFilePersistence(resolvePersistenceDir())
+ );
+ client.setCallback(new MqttCallbackExtended() {
+ @Override
+ public void connectionLost(Throwable cause) {
+ log.warn("iot mqtt connection lost", cause);
+ }
+
+ @Override
+ public void messageArrived(String topic, MqttMessage message) {
+ inboundMessageHandler.handleMessage(topic, new String(message.getPayload(), StandardCharsets.UTF_8));
+ }
+
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken token) {
+ }
+
+ @Override
+ public void connectComplete(boolean reconnect, String serverURI) {
+ try {
+ subscribeTopics();
+ log.info("iot mqtt connected, reconnect={}, serverURI={}", reconnect, serverURI);
+ } catch (Exception e) {
+ log.error("subscribe iot topics failed", e);
+ }
+ }
+ });
+ return client;
+ }
+
+ private MqttConnectOptions buildOptions() throws Exception {
+ MqttConnectOptions options = new MqttConnectOptions();
+ options.setAutomaticReconnect(iotProperties.isAutomaticReconnect());
+ options.setCleanSession(iotProperties.isCleanSession());
+ options.setKeepAliveInterval(iotProperties.getKeepAliveSeconds());
+ options.setConnectionTimeout(iotProperties.getConnectionTimeoutSeconds());
+ if (iotProperties.isTlsEnabled()) {
+ options.setSocketFactory(IotMqttSslUtils.buildSocketFactory(
+ iotProperties.getCaCertPath(),
+ iotProperties.getClientCertPath(),
+ iotProperties.getPrivateKeyPath()
+ ));
+ }
+ return options;
+ }
+
+ /**
+ * 鍙闃� XBPS 涓嬪彂鐨� stow/pick 鎸囦护鍜屽閮� feedback 鍥炴墽銆�
+ */
+ private synchronized void subscribeTopics() throws Exception {
+ if (mqttClient == null || !mqttClient.isConnected()) {
+ return;
+ }
+ IotTopicConfig topics = iotProperties.getTopics();
+ subscribe(topics.getEgressStow());
+ subscribe(topics.getEgressPick());
+ subscribe(topics.getEgressFeedback());
+ }
+
+ private void subscribe(String topic) throws Exception {
+ if (Cools.isEmpty(topic)) {
+ return;
+ }
+ mqttClient.subscribe(topic, 1);
+ }
+
+ private String resolvePersistenceDir() {
+ String configured = iotProperties.getPersistenceDir();
+ String dir = Cools.isEmpty(configured)
+ ? System.getProperty("java.io.tmpdir") + File.separator + "asrs-iot-mqtt"
+ : configured;
+ File file = new File(dir);
+ if (!file.exists()) {
+ file.mkdirs();
+ }
+ return file.getAbsolutePath();
+ }
+}
diff --git a/src/main/java/com/zy/integration/iot/handler/IotInboundMessageHandler.java b/src/main/java/com/zy/integration/iot/handler/IotInboundMessageHandler.java
new file mode 100644
index 0000000..abaffe8
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/handler/IotInboundMessageHandler.java
@@ -0,0 +1,6 @@
+package com.zy.integration.iot.handler;
+
+public interface IotInboundMessageHandler {
+
+ void handleMessage(String topic, String payload);
+}
diff --git a/src/main/java/com/zy/integration/iot/handler/impl/IotInboundMessageHandlerImpl.java b/src/main/java/com/zy/integration/iot/handler/impl/IotInboundMessageHandlerImpl.java
new file mode 100644
index 0000000..1d21e4b
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/handler/impl/IotInboundMessageHandlerImpl.java
@@ -0,0 +1,57 @@
+package com.zy.integration.iot.handler.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
+import com.zy.integration.iot.biz.IotInstructionService;
+import com.zy.integration.iot.handler.IotInboundMessageHandler;
+import com.zy.integration.iot.publish.IotPublishService;
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.entity.IotFeedbackMessage;
+import com.zy.iot.entity.IotInstructionMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * MQTT 鍏ョ珯鍒嗗彂鍣ㄣ��
+ * 鎸� topic 璇嗗埆 stow/pick/feedback锛屽苟鍦ㄦ帴鍗曞悗绔嬪嵆灏濊瘯鍥炲彂 feedback銆�
+ */
+@Slf4j
+@Service
+public class IotInboundMessageHandlerImpl implements IotInboundMessageHandler {
+
+ @Autowired
+ private IotProperties iotProperties;
+ @Autowired
+ private IotInstructionService iotInstructionService;
+ @Autowired
+ private IotPublishService iotPublishService;
+
+ /**
+ * MQTT 鍥炶皟灞傚彧鍋� topic 鍒嗗彂鍜屾姤鏂囧弽搴忓垪鍖栵紝涓氬姟鍔ㄤ綔浠嶄笅娌夊埌 service銆�
+ */
+ @Override
+ public void handleMessage(String topic, String payload) {
+ if (!iotProperties.isEnabled() || Cools.isEmpty(topic) || payload == null) {
+ return;
+ }
+ try {
+ Long recordId = null;
+ if (topic.equals(iotProperties.getTopics().getEgressStow())) {
+ recordId = iotInstructionService.handleStowInstruction(JSON.parseObject(payload, IotInstructionMessage.class), topic, payload);
+ } else if (topic.equals(iotProperties.getTopics().getEgressPick())) {
+ recordId = iotInstructionService.handlePickInstruction(JSON.parseObject(payload, IotInstructionMessage.class), topic, payload);
+ } else if (topic.equals(iotProperties.getTopics().getEgressFeedback())) {
+ iotInstructionService.handleFeedbackAck(JSON.parseObject(payload, IotFeedbackMessage.class), topic, payload);
+ } else {
+ log.warn("ignore unknown iot topic={}, payload={}", topic, payload);
+ }
+ if (recordId != null) {
+ // feedback 鍏堝啓鏈湴璁板綍锛屽啀绔嬪嵆灏濊瘯鍙戦�侊紱浼犺緭澶辫触鐢卞畾鏃朵换鍔¤ˉ鍋裤��
+ iotPublishService.publishRecordNow(recordId);
+ }
+ } catch (Exception e) {
+ log.error("handle iot inbound message failed, topic={}, payload={}", topic, payload, e);
+ }
+ }
+}
diff --git a/src/main/java/com/zy/integration/iot/publish/IotPublishService.java b/src/main/java/com/zy/integration/iot/publish/IotPublishService.java
new file mode 100644
index 0000000..1f0b743
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/publish/IotPublishService.java
@@ -0,0 +1,6 @@
+package com.zy.integration.iot.publish;
+
+public interface IotPublishService {
+
+ void publishRecordNow(Long recordId);
+}
diff --git a/src/main/java/com/zy/integration/iot/publish/impl/IotPublishServiceImpl.java b/src/main/java/com/zy/integration/iot/publish/impl/IotPublishServiceImpl.java
new file mode 100644
index 0000000..092ecde
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/publish/impl/IotPublishServiceImpl.java
@@ -0,0 +1,61 @@
+package com.zy.integration.iot.publish.impl;
+
+import com.core.common.Cools;
+import com.zy.integration.iot.client.IotMqttClient;
+import com.zy.integration.iot.publish.IotPublishService;
+import com.zy.iot.constant.IotConstants;
+import com.zy.iot.entity.IotPublishRecord;
+import com.zy.iot.service.IotPublishRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/**
+ * IoT 缁熶竴鍙戝竷鍣ㄣ��
+ * 杩欓噷鍙鐞� MQTT 浼犺緭缁撴灉锛屼笟鍔℃垚鍔熶笌鍚︾敱鎸囦护澶勭悊闃舵鍐冲畾銆�
+ */
+@Slf4j
+@Service
+public class IotPublishServiceImpl implements IotPublishService {
+
+ @Autowired
+ private IotPublishRecordService iotPublishRecordService;
+ @Autowired
+ private IotMqttClient iotMqttClient;
+
+ /**
+ * 绔嬪嵆鍙戝竷鎸囧畾璁板綍锛涜嫢缃戠粶鍙戦�佸け璐ワ紝浠呮洿鏂扮姸鎬侊紝鍚庣画鐢辫皟搴﹀櫒閲嶈瘯銆�
+ */
+ @Override
+ public void publishRecordNow(Long recordId) {
+ if (recordId == null) {
+ return;
+ }
+ IotPublishRecord record = iotPublishRecordService.selectById(recordId);
+ if (record == null || Cools.isEmpty(record.getPublishTopic()) || Cools.isEmpty(record.getPublishPayload())) {
+ return;
+ }
+ Date now = new Date();
+ try {
+ iotMqttClient.publish(record.getPublishTopic(), record.getPublishPayload());
+ record.setPublishStatus(IotConstants.PUBLISH_STATUS_SUCCESS);
+ record.setUpdateTime(now);
+ iotPublishRecordService.updateById(record);
+ } catch (Exception e) {
+ record.setPublishStatus(IotConstants.PUBLISH_STATUS_FAILURE);
+ record.setErrorMessage(truncate(e.getMessage(), 500));
+ record.setUpdateTime(now);
+ iotPublishRecordService.updateById(record);
+ log.error("publish iot message failed, recordId={}", recordId, e);
+ }
+ }
+
+ private String truncate(String message, int maxLength) {
+ if (message == null || message.length() <= maxLength) {
+ return message;
+ }
+ return message.substring(0, maxLength);
+ }
+}
diff --git a/src/main/java/com/zy/integration/iot/task/IotPendingPublishScheduler.java b/src/main/java/com/zy/integration/iot/task/IotPendingPublishScheduler.java
new file mode 100644
index 0000000..813d184
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/task/IotPendingPublishScheduler.java
@@ -0,0 +1,49 @@
+package com.zy.integration.iot.task;
+
+import com.zy.integration.iot.publish.IotPublishService;
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.entity.IotPublishRecord;
+import com.zy.iot.service.IotPublishRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 寰呭彂甯冩秷鎭ˉ鍋夸换鍔°��
+ * 璐熻矗鎵弿 PENDING/FAILURE 鐨勮褰曠户缁帹閫侊紝涓嶅涓氬姟 ACK_FAILURE 鍋氶潤榛橀噸鍙戙��
+ */
+@Slf4j
+@Component
+public class IotPendingPublishScheduler {
+
+ @Autowired
+ private IotProperties iotProperties;
+ @Autowired
+ private IotPublishRecordService iotPublishRecordService;
+ @Autowired
+ private IotPublishService iotPublishService;
+
+ /**
+ * 灏忔壒閲忚ˉ鍙戯紝閬垮厤鍗曟潯寮傚父娑堟伅鎷栦綇鏁存壒寰呭彂鏁版嵁銆�
+ */
+ @Scheduled(cron = "0/5 * * * * ? ")
+ private void execute() {
+ if (!iotProperties.isEnabled()) {
+ return;
+ }
+ List<IotPublishRecord> records = iotPublishRecordService.selectPendingPublishes(50);
+ if (records == null || records.isEmpty()) {
+ return;
+ }
+ for (IotPublishRecord record : records) {
+ try {
+ iotPublishService.publishRecordNow(record.getId());
+ } catch (Exception e) {
+ log.error("publish pending iot record failed, id={}", record.getId(), e);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/zy/integration/iot/util/IotMqttSslUtils.java b/src/main/java/com/zy/integration/iot/util/IotMqttSslUtils.java
new file mode 100644
index 0000000..780db87
--- /dev/null
+++ b/src/main/java/com/zy/integration/iot/util/IotMqttSslUtils.java
@@ -0,0 +1,87 @@
+package com.zy.integration.iot.util;
+
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.openssl.PEMKeyPair;
+import org.bouncycastle.openssl.PEMParser;
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+
+public final class IotMqttSslUtils {
+
+ private static final String BC_PROVIDER = "BC";
+
+ private IotMqttSslUtils() {
+ }
+
+ public static SSLSocketFactory buildSocketFactory(String caCertPath, String clientCertPath, String privateKeyPath) throws Exception {
+ ensureProvider();
+ X509Certificate caCertificate = readCertificate(caCertPath);
+ X509Certificate clientCertificate = readCertificate(clientCertPath);
+ PrivateKey privateKey = readPrivateKey(privateKeyPath);
+
+ KeyStore clientStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ clientStore.load(null, null);
+ clientStore.setKeyEntry("iot-client-key", privateKey, new char[0], new Certificate[]{clientCertificate});
+
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ keyManagerFactory.init(clientStore, new char[0]);
+
+ KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ trustStore.load(null, null);
+ trustStore.setCertificateEntry("iot-ca", caCertificate);
+
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ trustManagerFactory.init(trustStore);
+
+ SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
+ sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
+ return sslContext.getSocketFactory();
+ }
+
+ private static X509Certificate readCertificate(String path) throws Exception {
+ try (PEMParser parser = new PEMParser(new BufferedReader(new FileReader(path)))) {
+ Object object = parser.readObject();
+ if (!(object instanceof X509CertificateHolder)) {
+ throw new IllegalArgumentException("invalid certificate file: " + path);
+ }
+ return new JcaX509CertificateConverter()
+ .setProvider(BC_PROVIDER)
+ .getCertificate((X509CertificateHolder) object);
+ }
+ }
+
+ private static PrivateKey readPrivateKey(String path) throws Exception {
+ try (PEMParser parser = new PEMParser(new BufferedReader(new FileReader(path)))) {
+ Object object = parser.readObject();
+ JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BC_PROVIDER);
+ if (object instanceof PEMKeyPair) {
+ return converter.getKeyPair((PEMKeyPair) object).getPrivate();
+ }
+ if (object instanceof PrivateKeyInfo) {
+ return converter.getPrivateKey((PrivateKeyInfo) object);
+ }
+ throw new IllegalArgumentException("invalid private key file: " + path);
+ }
+ }
+
+ private static void ensureProvider() {
+ if (Security.getProvider(BC_PROVIDER) == null) {
+ Security.addProvider(new BouncyCastleProvider());
+ }
+ }
+}
diff --git a/src/main/java/com/zy/iot/config/IotProperties.java b/src/main/java/com/zy/iot/config/IotProperties.java
new file mode 100644
index 0000000..42585ce
--- /dev/null
+++ b/src/main/java/com/zy/iot/config/IotProperties.java
@@ -0,0 +1,69 @@
+package com.zy.iot.config;
+
+import com.zy.iot.entity.IotTopicConfig;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "iot")
+public class IotProperties {
+
+ private boolean enabled;
+
+ private String endpoint;
+
+ private Integer port = 8883;
+
+ private String thingName;
+
+ private String clientId;
+
+ private boolean cleanSession;
+
+ private boolean automaticReconnect = true;
+
+ private Integer keepAliveSeconds = 60;
+
+ private Integer connectionTimeoutSeconds = 10;
+
+ private String persistenceDir;
+
+ private String caCertPath;
+
+ private String clientCertPath;
+
+ private String privateKeyPath;
+
+ private IotTopicConfig topics = new IotTopicConfig();
+
+ private Map<String, Integer> pickStationMappings = new LinkedHashMap<>();
+
+ public String getResolvedClientId() {
+ if (clientId != null && clientId.trim().length() > 0) {
+ return clientId.trim();
+ }
+ return thingName;
+ }
+
+ public boolean isTlsEnabled() {
+ String serverUri = getServerUri();
+ return serverUri != null && serverUri.startsWith("ssl://");
+ }
+
+ public String getServerUri() {
+ if (endpoint == null || endpoint.trim().length() == 0) {
+ return null;
+ }
+ String trimmed = endpoint.trim();
+ if (trimmed.startsWith("ssl://") || trimmed.startsWith("tcp://")) {
+ return trimmed;
+ }
+ int resolvedPort = port == null ? 8883 : port;
+ return "ssl://" + trimmed + ":" + resolvedPort;
+ }
+}
diff --git a/src/main/java/com/zy/iot/constant/IotConstants.java b/src/main/java/com/zy/iot/constant/IotConstants.java
new file mode 100644
index 0000000..5539420
--- /dev/null
+++ b/src/main/java/com/zy/iot/constant/IotConstants.java
@@ -0,0 +1,36 @@
+package com.zy.iot.constant;
+
+public final class IotConstants {
+
+ private IotConstants() {
+ }
+
+ public static final String DIRECTION_INBOUND = "INBOUND";
+ public static final String DIRECTION_OUTBOUND = "OUTBOUND";
+
+ public static final String MESSAGE_TYPE_STOW = "STOW";
+ public static final String MESSAGE_TYPE_PICK = "PICK";
+ public static final String MESSAGE_TYPE_FEEDBACK = "FEEDBACK";
+
+ public static final String PROCESS_STATUS_RECEIVED = "RECEIVED";
+ public static final String PROCESS_STATUS_PROCESSED = "PROCESSED";
+ public static final String PROCESS_STATUS_FAILED = "FAILED";
+ public static final String PROCESS_STATUS_DELAYED = "DELAYED";
+ public static final String PROCESS_STATUS_DUPLICATE = "DUPLICATE";
+ public static final String PROCESS_STATUS_PENDING = "PENDING";
+
+ public static final String FEEDBACK_SUCCESS = "SUCCESS";
+ public static final String FEEDBACK_FAILURE = "FAILURE";
+
+ public static final String PUBLISH_STATUS_NOT_REQUIRED = "NOT_REQUIRED";
+ public static final String PUBLISH_STATUS_PENDING = "PENDING";
+ public static final String PUBLISH_STATUS_SUCCESS = "SUCCESS";
+ public static final String PUBLISH_STATUS_FAILURE = "FAILURE";
+ public static final String PUBLISH_STATUS_ACK_SUCCESS = "ACK_SUCCESS";
+ public static final String PUBLISH_STATUS_ACK_FAILURE = "ACK_FAILURE";
+
+ public static final String ERROR_CODE_DELAYED = "DELAYED_MESSAGE";
+ public static final String ERROR_CODE_DUPLICATE = "DUPLICATE_MESSAGE";
+ public static final String ERROR_CODE_STATION_MAPPING = "STATION_MAPPING_NOT_FOUND";
+ public static final String ERROR_CODE_TARGET_LOC = "TARGET_LOCATION_INVALID";
+}
diff --git a/src/main/java/com/zy/iot/entity/IotFeedbackMessage.java b/src/main/java/com/zy/iot/entity/IotFeedbackMessage.java
new file mode 100644
index 0000000..49805bf
--- /dev/null
+++ b/src/main/java/com/zy/iot/entity/IotFeedbackMessage.java
@@ -0,0 +1,17 @@
+package com.zy.iot.entity;
+
+import lombok.Data;
+
+@Data
+public class IotFeedbackMessage {
+
+ private String instructionId;
+
+ private String status;
+
+ private String errorCode;
+
+ private String message;
+
+ private Long creationTime;
+}
diff --git a/src/main/java/com/zy/iot/entity/IotInstructionMessage.java b/src/main/java/com/zy/iot/entity/IotInstructionMessage.java
new file mode 100644
index 0000000..a1fe344
--- /dev/null
+++ b/src/main/java/com/zy/iot/entity/IotInstructionMessage.java
@@ -0,0 +1,21 @@
+package com.zy.iot.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class IotInstructionMessage {
+
+ private String instructionId;
+
+ private String containerId;
+
+ private String sourceLocationId;
+
+ private List<String> destinationLocationIds;
+
+ private String referenceId;
+
+ private Long creationTime;
+}
diff --git a/src/main/java/com/zy/iot/entity/IotPublishRecord.java b/src/main/java/com/zy/iot/entity/IotPublishRecord.java
new file mode 100644
index 0000000..6ab11a9
--- /dev/null
+++ b/src/main/java/com/zy/iot/entity/IotPublishRecord.java
@@ -0,0 +1,89 @@
+package com.zy.iot.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("asr_iot_publish_record")
+public class IotPublishRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @TableField("instruction_id")
+ private String instructionId;
+
+ @TableField("direction")
+ private String direction;
+
+ @TableField("message_type")
+ private String messageType;
+
+ @TableField("receive_topic")
+ private String receiveTopic;
+
+ @TableField("publish_topic")
+ private String publishTopic;
+
+ @TableField("container_id")
+ private String containerId;
+
+ @TableField("reference_id")
+ private String referenceId;
+
+ @TableField("source_location_id")
+ private String sourceLocationId;
+
+ @TableField("destination_location_ids")
+ private String destinationLocationIds;
+
+ @TableField("message_creation_time")
+ private Long messageCreationTime;
+
+ @TableField("raw_payload")
+ private String rawPayload;
+
+ @TableField("publish_payload")
+ private String publishPayload;
+
+ @TableField("process_status")
+ private String processStatus;
+
+ @TableField("publish_status")
+ private String publishStatus;
+
+ @TableField("feedback_status")
+ private String feedbackStatus;
+
+ @TableField("error_code")
+ private String errorCode;
+
+ @TableField("error_message")
+ private String errorMessage;
+
+ @TableField("ack_payload")
+ private String ackPayload;
+
+ @TableField("ack_time")
+ private Date ackTime;
+
+ @TableField("wrk_no")
+ private Integer wrkNo;
+
+ @TableField("order_no")
+ private String orderNo;
+
+ @TableField("create_time")
+ private Date createTime;
+
+ @TableField("update_time")
+ private Date updateTime;
+}
diff --git a/src/main/java/com/zy/iot/entity/IotTopicConfig.java b/src/main/java/com/zy/iot/entity/IotTopicConfig.java
new file mode 100644
index 0000000..d09b609
--- /dev/null
+++ b/src/main/java/com/zy/iot/entity/IotTopicConfig.java
@@ -0,0 +1,19 @@
+package com.zy.iot.entity;
+
+import lombok.Data;
+
+@Data
+public class IotTopicConfig {
+
+ private String egressStow;
+
+ private String egressPick;
+
+ private String ingressStow;
+
+ private String ingressPick;
+
+ private String ingressFeedback;
+
+ private String egressFeedback;
+}
diff --git a/src/main/java/com/zy/iot/mapper/IotPublishRecordMapper.java b/src/main/java/com/zy/iot/mapper/IotPublishRecordMapper.java
new file mode 100644
index 0000000..3d46d2a
--- /dev/null
+++ b/src/main/java/com/zy/iot/mapper/IotPublishRecordMapper.java
@@ -0,0 +1,11 @@
+package com.zy.iot.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.iot.entity.IotPublishRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface IotPublishRecordMapper extends BaseMapper<IotPublishRecord> {
+}
diff --git a/src/main/java/com/zy/iot/service/IotPublishRecordService.java b/src/main/java/com/zy/iot/service/IotPublishRecordService.java
new file mode 100644
index 0000000..5c9d1bf
--- /dev/null
+++ b/src/main/java/com/zy/iot/service/IotPublishRecordService.java
@@ -0,0 +1,15 @@
+package com.zy.iot.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.iot.entity.IotPublishRecord;
+
+import java.util.List;
+
+public interface IotPublishRecordService extends IService<IotPublishRecord> {
+
+ IotPublishRecord findByInstructionId(String instructionId);
+
+ IotPublishRecord findLatestInboundInstruction(String containerId, String messageType);
+
+ List<IotPublishRecord> selectPendingPublishes(int limit);
+}
diff --git a/src/main/java/com/zy/iot/service/impl/IotPublishRecordServiceImpl.java b/src/main/java/com/zy/iot/service/impl/IotPublishRecordServiceImpl.java
new file mode 100644
index 0000000..eb1cbf1
--- /dev/null
+++ b/src/main/java/com/zy/iot/service/impl/IotPublishRecordServiceImpl.java
@@ -0,0 +1,66 @@
+package com.zy.iot.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
+import com.zy.iot.constant.IotConstants;
+import com.zy.iot.entity.IotPublishRecord;
+import com.zy.iot.mapper.IotPublishRecordMapper;
+import com.zy.iot.service.IotPublishRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+public class IotPublishRecordServiceImpl extends ServiceImpl<IotPublishRecordMapper, IotPublishRecord> implements IotPublishRecordService {
+
+ @Override
+ public IotPublishRecord findByInstructionId(String instructionId) {
+ if (Cools.isEmpty(instructionId)) {
+ return null;
+ }
+ return selectOne(new EntityWrapper<IotPublishRecord>().eq("instruction_id", instructionId));
+ }
+
+ @Override
+ public IotPublishRecord findLatestInboundInstruction(String containerId, String messageType) {
+ if (Cools.isEmpty(containerId) || Cools.isEmpty(messageType)) {
+ return null;
+ }
+ Wrapper<IotPublishRecord> wrapper = new EntityWrapper<IotPublishRecord>()
+ .eq("direction", IotConstants.DIRECTION_INBOUND)
+ .eq("message_type", messageType)
+ .eq("container_id", containerId)
+ .orderBy("message_creation_time", false)
+ .orderBy("create_time", false);
+ Page<IotPublishRecord> page = selectPage(new Page<IotPublishRecord>(1, 1), wrapper);
+ if (page == null || page.getRecords() == null || page.getRecords().isEmpty()) {
+ return null;
+ }
+ return page.getRecords().get(0);
+ }
+
+ @Override
+ public List<IotPublishRecord> selectPendingPublishes(int limit) {
+ if (limit <= 0) {
+ return Collections.emptyList();
+ }
+ Wrapper<IotPublishRecord> wrapper = new EntityWrapper<IotPublishRecord>()
+ .in("publish_status", Arrays.asList(IotConstants.PUBLISH_STATUS_PENDING, IotConstants.PUBLISH_STATUS_FAILURE))
+ .isNotNull("publish_topic")
+ .isNotNull("publish_payload")
+ .orderBy("create_time", true)
+ .orderBy("id", true);
+ Page<IotPublishRecord> page = selectPage(new Page<IotPublishRecord>(1, limit), wrapper);
+ if (page == null || page.getRecords() == null) {
+ return Collections.emptyList();
+ }
+ return page.getRecords();
+ }
+}
+
+
diff --git a/src/main/java/com/zy/iot/util/IotInstructionIdGenerator.java b/src/main/java/com/zy/iot/util/IotInstructionIdGenerator.java
new file mode 100644
index 0000000..b28dd22
--- /dev/null
+++ b/src/main/java/com/zy/iot/util/IotInstructionIdGenerator.java
@@ -0,0 +1,30 @@
+package com.zy.iot.util;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.util.Locale;
+import java.util.UUID;
+
+public final class IotInstructionIdGenerator {
+
+ private IotInstructionIdGenerator() {
+ }
+
+ public static String generate() {
+ return generate(UUID.randomUUID() + "-" + System.nanoTime());
+ }
+
+ public static String generate(String seed) {
+ try {
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
+ byte[] hash = digest.digest(seed.getBytes(StandardCharsets.UTF_8));
+ StringBuilder builder = new StringBuilder();
+ for (byte item : hash) {
+ builder.append(String.format(Locale.ROOT, "%02x", item));
+ }
+ return builder.substring(0, 20).toUpperCase(Locale.ROOT);
+ } catch (Exception e) {
+ throw new IllegalStateException("generate iot instruction id failed", e);
+ }
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 4070614..f8aaf02 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -121,3 +121,36 @@
stopOutTask: /openapi/cancelTaskBatch
#璁惧鐘舵�佽幏鍙栧湴鍧�
getDeviceStatus: /openapi/deviceStatus
+
+
+# AWS IoT 瀵规帴寮�鍏充笌 topic/璇佷功閰嶇疆銆�
+# 榛樿鍏抽棴锛屽彧鏈夐厤缃綈 endpoint 鍜岃瘉涔﹁矾寰勫悗鎵嶄細灏濊瘯寤鸿繛銆�
+iot:
+ enabled: true
+ endpoint: tcp://192.168.100.170:1883
+ port: 1883
+ thingName: asrs-iot-client
+ clientId: asrs-iot-client
+ cleanSession: false
+ automaticReconnect: true
+ keepAliveSeconds: 60
+ connectionTimeoutSeconds: 10
+ persistenceDir: .local/iot-mqtt
+ caCertPath:
+ clientCertPath:
+ privateKeyPath:
+ topics:
+ #浜氶┈閫婂彂閫佺粍鎵樼粰wms,鍦ㄦ墭鐩樹笂鏀跺埌绾哥鍚庯紝鍙戝竷鍫嗗灈鎸囦护浠ュ皢鎵樼洏鍙戦�佸埌浠撳簱銆�
+ egressStow: glenn/instruction/icna/egress/asrs/stow
+ #浜氶┈閫婂彂閫佸嚭搴撴寚浠ょ粰wms,鍚姩鎷i�夎姹傚悗锛屽彂甯冩嫞閫夋寚浠や互寮曞ASRS浠庢枡绠变腑鍙栬揣銆�
+ egressPick: glenn/instruction/icna/egress/asrs/pick
+ #wms鍏ュ簱瀹屾垚鍙戦�佺粰浜氶┈閫婏紝ASRS瀹為檯鎷栨嫿鎵樼洏鍒版枡绠卞悗锛屽彂甯冨爢鍨涘姩浣滀互鍚屾BPS鏁版嵁銆�
+ egressFeedback: glenn/instruction/icna/egress/asrs/feedback
+ #wms鍑哄簱瀹屾垚鍙戦�佺粰浜氶┈閫婏紝鍦ˋSRS瀹為檯浠庢枡绠卞彇璐у悗锛屽彂甯冩嫞閫夊姩浣渟z XBPS鏁版嵁銆�
+ ingressStow: glenn/instruction/icna/ingress/asrs/stow
+ #ASRS 鎺ユ敹鍒� XBPS 鎸囦护鍚庯紝鍚戝弽棣圶BPS 鍙戦�佸搷搴斻��
+ ingressPick: glenn/instruction/icna/ingress/asrs/pick
+ #鍦╔BPs鏀跺埌ASRS鎿嶄綔鍚庯紝鍚戝弽棣圓SRS鍙戦�佸搷搴�
+ ingressFeedback: glenn/instruction/icna/ingress/asrs/feedback
+ pickStationMappings:
+ ASRSOutbound1: 101
diff --git a/src/main/resources/sql/20260324_asr_iot_publish_record.sql b/src/main/resources/sql/20260324_asr_iot_publish_record.sql
new file mode 100644
index 0000000..4172107
--- /dev/null
+++ b/src/main/resources/sql/20260324_asr_iot_publish_record.sql
@@ -0,0 +1,47 @@
+IF NOT EXISTS (
+ SELECT 1
+ FROM sys.objects
+ WHERE object_id = OBJECT_ID(N'[dbo].[asr_iot_publish_record]')
+ AND type = N'U'
+)
+BEGIN
+ CREATE TABLE [dbo].[asr_iot_publish_record] (
+ [id] BIGINT IDENTITY(1,1) NOT NULL,
+ [instruction_id] VARCHAR(64) NOT NULL,
+ [direction] VARCHAR(16) NOT NULL,
+ [message_type] VARCHAR(16) NOT NULL,
+ [receive_topic] VARCHAR(255) NULL,
+ [publish_topic] VARCHAR(255) NULL,
+ [container_id] VARCHAR(128) NULL,
+ [reference_id] VARCHAR(128) NULL,
+ [source_location_id] VARCHAR(128) NULL,
+ [destination_location_ids] VARCHAR(500) NULL,
+ [message_creation_time] BIGINT NULL,
+ [raw_payload] VARCHAR(MAX) NULL,
+ [publish_payload] VARCHAR(MAX) NULL,
+ [process_status] VARCHAR(32) NULL,
+ [publish_status] VARCHAR(32) NULL,
+ [feedback_status] VARCHAR(16) NULL,
+ [error_code] VARCHAR(64) NULL,
+ [error_message] VARCHAR(500) NULL,
+ [ack_payload] VARCHAR(MAX) NULL,
+ [ack_time] DATETIME NULL,
+ [wrk_no] INT NULL,
+ [order_no] VARCHAR(128) NULL,
+ [create_time] DATETIME NULL,
+ [update_time] DATETIME NULL,
+ CONSTRAINT [PK_asr_iot_publish_record] PRIMARY KEY CLUSTERED ([id] ASC),
+ CONSTRAINT [UK_asr_iot_publish_record_instruction_id] UNIQUE NONCLUSTERED ([instruction_id] ASC)
+ );
+
+ CREATE NONCLUSTERED INDEX [IDX_asr_iot_publish_record_container_type]
+ ON [dbo].[asr_iot_publish_record] ([container_id] ASC, [message_type] ASC, [message_creation_time] DESC);
+
+ CREATE NONCLUSTERED INDEX [IDX_asr_iot_publish_record_publish_status]
+ ON [dbo].[asr_iot_publish_record] ([publish_status] ASC, [create_time] ASC);
+
+ EXEC sys.sp_addextendedproperty
+ @name = N'MS_Description', @value = N'ASRS IoT 鍙戝竷涓庡洖鎵ц褰�',
+ @level0type = N'SCHEMA', @level0name = N'dbo',
+ @level1type = N'TABLE', @level1name = N'asr_iot_publish_record';
+END;
diff --git a/src/test/java/com/zy/integration/iot/IotSupportTest.java b/src/test/java/com/zy/integration/iot/IotSupportTest.java
new file mode 100644
index 0000000..b93cd14
--- /dev/null
+++ b/src/test/java/com/zy/integration/iot/IotSupportTest.java
@@ -0,0 +1,31 @@
+package com.zy.integration.iot;
+
+import com.zy.iot.config.IotProperties;
+import com.zy.iot.util.IotInstructionIdGenerator;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class IotSupportTest {
+
+ @Test
+ public void shouldResolveServerUriAndClientId() {
+ IotProperties properties = new IotProperties();
+ properties.setEndpoint("example-ats.iot.cn-north-1.amazonaws.com.cn");
+ properties.setPort(8883);
+ properties.setThingName("thing-a");
+
+ Assertions.assertEquals("ssl://example-ats.iot.cn-north-1.amazonaws.com.cn:8883", properties.getServerUri());
+ Assertions.assertEquals("thing-a", properties.getResolvedClientId());
+
+ properties.setClientId("client-b");
+ Assertions.assertEquals("client-b", properties.getResolvedClientId());
+ }
+
+ @Test
+ public void shouldGenerateStableLengthInstructionId() {
+ String instructionId = IotInstructionIdGenerator.generate("wrk-1001");
+
+ Assertions.assertEquals(20, instructionId.length());
+ Assertions.assertEquals(instructionId, instructionId.toUpperCase());
+ }
+}
--
Gitblit v1.9.1