You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@casbin.apache.org by hs...@apache.org on 2026/08/30 17:42:55 UTC
(casbin-gateway) branch master updated: feat: drop the HTTP reverse-proxy WAF
This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-gateway.git
The following commit(s) were added to refs/heads/master by this push:
new 272e8d8 feat: drop the HTTP reverse-proxy WAF
272e8d8 is described below
commit 272e8d8424ea5a6ef1d28ca092a8bfe64e86064f
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Mon Aug 31 01:42:48 2026 +0800
feat: drop the HTTP reverse-proxy WAF
---
.gitignore | 1 -
README.md | 45 +-
README_zh.md | 45 +-
auth/auth.go | 53 +-
certificate/account.go | 105 --
certificate/account_test.go | 44 -
certificate/conf.go | 18 -
certificate/dns.go | 151 ---
certificate/ecc.go | 52 -
certificate/ecc_test.go | 31 -
conf/app.conf | 44 +-
conf/conf.go | 20 -
conf/waf.conf | 246 ----
controllers/application.go | 37 -
controllers/casdoor_provider.go | 37 -
controllers/cert.go | 174 ---
controllers/metric.go | 124 --
controllers/node.go | 147 --
controllers/record.go | 134 --
controllers/rule.go | 212 ---
controllers/setting.go | 40 -
controllers/site.go | 147 --
controllers/system.go | 18 -
embed.go | 5 +-
embedsupport/setup.go | 25 +-
go.mod | 53 +-
go.sum | 1693 ------------------------
ip/17monipdb.dat | Bin 1556587 -> 0 bytes
ip/ip.go | 61 -
ip/ip17mon.go | 200 ---
main.go | 48 +-
object/cert.go | 224 ----
object/cert_test.go | 163 ---
object/cert_util.go | 40 -
object/cert_whois.go | 69 -
object/cert_whois_test.go | 52 -
object/node.go | 152 ---
object/ormer.go | 27 +-
object/record.go | 168 ---
object/rule.go | 134 --
object/rule_cache.go | 57 -
object/setting.go | 63 +-
object/site.go | 377 ------
object/site_cache.go | 137 --
object/site_cert.go | 227 ----
object/site_cert_account.go | 125 --
object/site_cert_ecc.go | 59 -
object/site_cert_http.go | 90 --
object/site_test.go | 58 -
object/site_timer.go | 120 --
object/site_timer_health.go | 115 --
object/util.go | 197 ---
routers/router.go | 40 -
rule/rule.go | 114 --
rule/rule_compound.go | 60 -
rule/rule_ip.go | 94 --
rule/rule_ip_rate.go | 134 --
rule/rule_ip_rate_test.go | 154 ---
rule/rule_ua.go | 63 -
rule/rule_url_path.go | 62 -
rule/rule_waf.go | 105 --
run/cdn.go | 145 --
run/database.go | 50 -
run/database_cloud.go | 91 --
run/database_cloud_test.go | 41 -
run/git.go | 122 --
run/git_test.go | 88 --
run/run.go | 184 ---
run/util.go | 117 --
run/util_path.go | 67 -
run/util_process.go | 135 --
service/captcha.go | 146 --
service/oauth.go | 78 --
service/proxy.go | 519 --------
service/startup.go | 39 +-
service/util.go | 151 ---
storage/casdoor.go | 80 --
storage/provider.go | 38 -
util/json.go | 9 -
util/network.go | 17 -
util/path.go | 22 +-
util/port.go | 4 +-
util/port_test.go | 4 +-
util/rule.go | 29 -
util/stacks.go | 59 -
util/string.go | 35 -
web/README.md | 2 +-
web/src/App.tsx | 45 +-
web/src/backend/CertBackend.ts | 62 -
web/src/backend/MiscBackend.ts | 37 +-
web/src/backend/NodeBackend.ts | 58 -
web/src/backend/RecordBackend.ts | 50 -
web/src/backend/RuleBackend.ts | 50 -
web/src/backend/SiteBackend.ts | 58 -
web/src/components/NodeTable.tsx | 213 ---
web/src/components/charts/ChartCards.tsx | 153 ---
web/src/components/rules/CompoundRule.tsx | 156 ---
web/src/components/rules/IpRateRuleTable.tsx | 86 --
web/src/components/rules/IpRuleTable.tsx | 134 --
web/src/components/rules/RowActions.tsx | 54 -
web/src/components/rules/SiteRuleTable.tsx | 127 --
web/src/components/rules/UaRuleTable.tsx | 145 --
web/src/components/rules/WafRuleTable.tsx | 114 --
web/src/components/rules/useExpressionTable.ts | 76 --
web/src/components/shared/app-sidebar.tsx | 6 +-
web/src/components/shared/status-badge.tsx | 2 +-
web/src/lib/rules.ts | 35 -
web/src/locales/en/data.json | 170 +--
web/src/locales/zh/data.json | 170 +--
web/src/nav.ts | 27 +-
web/src/pages/CertEditPage.tsx | 214 ---
web/src/pages/CertListPage.tsx | 352 -----
web/src/pages/DashboardPage.tsx | 195 ---
web/src/pages/NodeEditPage.tsx | 117 --
web/src/pages/NodeListPage.tsx | 266 ----
web/src/pages/RecordEditPage.tsx | 106 --
web/src/pages/RecordListPage.tsx | 289 ----
web/src/pages/RuleEditPage.tsx | 193 ---
web/src/pages/RuleListPage.tsx | 320 -----
web/src/pages/SettingPage.tsx | 48 +-
web/src/pages/SiteEditPage.tsx | 303 -----
web/src/pages/SiteListPage.tsx | 484 -------
web/src/types.ts | 137 --
123 files changed, 72 insertions(+), 14742 deletions(-)
diff --git a/.gitignore b/.gitignore
index 80cb178..5884cba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,4 +42,3 @@ data/agent-patches/
lastupdate.tmp
commentsRouter*.go
-acme_account.key
diff --git a/README.md b/README.md
index 6f26403..3979ef1 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
<h1 align="center" style="border-bottom: none;">📦⚡️ Casbin Gateway</h1>
-<h3 align="center">An open-source gateway for the AI coding agents and the web traffic on your machine, developed by Go and React.</h3>
+<h3 align="center">An open-source gateway for the AI coding agents on your machine, developed by Go and React.</h3>
<p align="center">
<a href="https://github.com/apache/casbin-gateway/actions/workflows/golangci-lint.yml">
<img alt="Lint" src="https://github.com/apache/casbin-gateway/actions/workflows/golangci-lint.yml/badge.svg">
@@ -89,7 +89,6 @@ Gateway installed some other way, or in a directory it cannot write to, says so
| **Skills, MCP & Prompts** | Every skill, MCP server and instruction file of every agent in one table. Add an MCP server to one agent or to several at once, edit the instructions an agent reads before every session, open one, delete it, or copy it into another agent. | Nothing |
| **Providers** | One endpoint in front of your model vendors. Gateway holds the API key, so the agents never have it — or forwards the agent's own sign-in and holds nothing. | A vendor API key, or nothing at all |
| **LLM Records** | Every request an agent relayed: the full system prompt, every message and tool call, the schema of every tool the model was offered, plus tokens and cost. | A provider, and `llmRecordMode` — see [Recording prompts](#recording-prompts) |
-| **Advanced → Sites** | The reverse-proxy WAF: per-site routing, rules, certificates and analytics. | Turning the proxy on — see [Turning the WAF proxy on](#turning-the-waf-proxy-on) |
Agents are found by reading the user accounts, home directories and install paths of **the machine Gateway runs on**, so run it on the machine whose agents you want to watch.
@@ -140,9 +139,9 @@ To serve other machines anyway, set `httpaddr = 0.0.0.0` in `conf/app.conf`, and
### Running in Docker or Podman
-**A container cannot see the agents on your machine.** Agents are discovered by reading the home directories and install paths of the machine Gateway runs on, and inside a container that is the container's own filesystem. **Agents**, **Skills, MCP & Prompts** and agent monitoring therefore stay empty there, and the pages say so rather than pretending nothing is installed. Everything that does not depend on the host works normally: **Providers**, **LLM Records** and the reverse-proxy WAF.
+**A container cannot see the agents on your machine.** Agents are discovered by reading the home directories and install paths of the machine Gateway runs on, and inside a container that is the container's own filesystem. **Agents**, **Skills, MCP & Prompts** and agent monitoring therefore stay empty there, and the pages say so rather than pretending nothing is installed. Everything that does not depend on the host works normally: **Providers** and **LLM Records**.
-So run the one-command install above on the machine whose agents you want to watch, and use a container when Gateway is only a model endpoint or a reverse proxy for other machines.
+So run the one-command install above on the machine whose agents you want to watch, and use a container when Gateway is only a model endpoint for other machines.
No image is published, so the compose file builds one from a checkout of this repository:
@@ -158,15 +157,6 @@ podman compose up -d
Either way the UI is on http://localhost:17000, the SQLite database lives in a named volume that survives `down`, and `conf/app.conf` is mounted from the repository, so the settings it seeds can be edited before the first start without rebuilding the image.
-To serve the WAF proxy from a container, turn the reverse proxy on on the **Settings** page and publish its ports too, by adding them next to `17000:17000` in `docker-compose.yml`:
-
-```yaml
- ports:
- - "17000:17000"
- - "8080:80"
- - "8443:443"
-```
-
## Configuration
Everything is optional. Settings are changed on the **Settings** page of the web UI and stored in the database, so nothing has to be edited by hand and nothing has to be restarted. `conf/app.conf`, next to the executable, seeds them on the very first start and explains each one; the one-step install has no file beside it and seeds from the copy baked into the binary instead. Editing the file after that first start does nothing, except for the keys read before the database is open: `httpp [...]
@@ -176,8 +166,6 @@ Everything is optional. Settings are changed on the **Settings** page of the web
| `httpport` | `17000` | Port of the web UI and the REST API |
| `httpaddr` | `127.0.0.1` | Interface the web UI binds to — see [Serving other machines](#serving-other-machines) |
| `driverName` / `dataSourceName` | `sqlite` / `./data/casbin-gateway.db` | Where data is stored |
-| `gatewayEnabled` | `false` | Turns the reverse-proxy WAF on |
-| `gatewayHttpPort` / `gatewayHttpsPort` | `80` / `443` | Ports the proxy listens on |
| `llmRecordMode` | `full` | How much of each relayed LLM request is kept — including the prompt, see [Recording prompts](#recording-prompts) |
| `apiKeyEncryptionKey` | empty | Encrypts provider API keys at rest (AES-256-GCM) |
| `casdoorEndpoint` | empty | Switches sign-in over to [Casdoor](https://casdoor.org) SSO |
@@ -191,17 +179,13 @@ Gateway prints what it is actually doing when it starts, so the result can be ch
| Management UI | http://localhost:17000 (this machine only) |
| Settings | Settings page, seeded from conf/app.conf |
| Web UI files | web/build |
-| Reverse proxy | enabled |
-| Gateway HTTP | :8080 |
-| Gateway HTTPS | :8443 |
| Database | sqlite, file "./data/casbin-gateway.db" (connected) |
| Sign-in | built-in user table, Casdoor is not configured |
| Relay auth | this machine only, no token needed |
-| App dir | ./data/apps |
+---------------------------------------------------------------------+
```
-A previous Gateway still holding one of these ports is stopped first, so a restart never waits on it. A port held by anything else stays with that program: Gateway names the process holding it and stops, rather than taking the port or starting half-configured.
+A previous Gateway still holding this port is stopped first, so a restart never waits on it. A port held by anything else stays with that program: Gateway names the process holding it and stops, rather than taking the port or starting half-configured.
### Recording prompts
@@ -221,23 +205,9 @@ Bodies are sanitized before they are stored: anything that looks like a credenti
The cost next to each record uses built-in list prices, which vendors change and resellers do not follow. Point `llmPricingFile` at a JSON file of your own rates to correct them.
-### Turning the WAF proxy on
-
-The reverse proxy is off by default, so installing Gateway does not take over ports 80 and 443. To use it:
-
-1. **Advanced → Sites → Add**. Set **Domain** to the hostname clients will use (`test.example.com`), **Host** and **Port** to where the traffic goes (`127.0.0.1` and `8000`), and **Mode** to `HTTP` — `HTTPS Only`, the default, redirects plain HTTP away before it reaches the backend.
-2. Flip **Reverse proxy**, the switch at the top of the Sites page. It takes effect at once and is remembered across restarts. Ports 80 and 443 need root on Linux and macOS, so for a first try set the gateway HTTP port to `8080` on the **Settings** page.
-3. Start anything on the backend port, e.g. `python -m http.server 8000`, then ask for the site by `Host` header — the gateway routes on it, so no DNS or `hosts` entry is needed:
-
-```bash
-curl -H "Host: test.example.com" http://127.0.0.1:8080/
-```
-
-You should get your backend's response. A `site not found for host` reply means the request reached Gateway but no site matches that `Host` value.
-
### Connecting Casdoor
-[Casdoor](https://casdoor.org) is optional and takes over member management. Create an organization and an application for Gateway in a Casdoor instance, then fill in the five fields of **Settings → Sign-in**. Sign-in redirects to Casdoor as soon as `casdoorEndpoint` is set, which also enables [OAuth logins](https://casdoor.org/docs/provider/oauth/overview), health-check alerts, the `CAPTCHA` rule action, per-site SSO and cloud file storage.
+[Casdoor](https://casdoor.org) is optional and takes over member management. Create an organization and an application for Gateway in a Casdoor instance, then fill in the five fields of **Settings → Sign-in**. Sign-in redirects to Casdoor as soon as `casdoorEndpoint` is set, which also enables [OAuth logins](https://casdoor.org/docs/provider/oauth/overview).
## Development
@@ -279,7 +249,7 @@ dbName = casbin_gateway
### Building a single binary
-Gateway normally reads three things from disk: `conf/app.conf`, the compiled UI in `web/build`, and the IP location database `ip/17monipdb.dat`. The `embed` build tag bakes all three into the executable, which is what the install scripts ship:
+Gateway normally reads two things from disk: `conf/app.conf` and the compiled UI in `web/build`. The `embed` build tag bakes both into the executable, which is what the install scripts ship:
```bash
cd web && yarn install && yarn build
@@ -297,13 +267,12 @@ Files on disk always win over the embedded copies, so a single binary can still
| --- | --- |
| `conf/app.conf` | `conf/app.conf` in the working directory, or next to the executable |
| `web/build` | `web/build/index.html` in the working directory, which then serves the whole UI |
-| `ip/17monipdb.dat` | `ip/17monipdb.dat` in the working directory |
The startup summary reports which source each one came from.
### Where the data goes
-Being self-contained is about startup, not about staying read-only. A running Gateway writes `./data` (the SQLite database, deployed apps, agent patch state), `./logs` and `./tmp` relative to its working directory — which is why the installed `casbin-gateway` command is a wrapper that always starts it in its install directory. Running the executable directly from somewhere else gives you a second, empty installation there.
+Being self-contained is about startup, not about staying read-only. A running Gateway writes `./data` (the SQLite database and agent patch state), `./logs` and `./tmp` relative to its working directory — which is why the installed `casbin-gateway` command is a wrapper that always starts it in its install directory. Running the executable directly from somewhere else gives you a second, empty installation there.
## Architecture
diff --git a/README_zh.md b/README_zh.md
index 8b49302..98d0517 100644
--- a/README_zh.md
+++ b/README_zh.md
@@ -1,5 +1,5 @@
<h1 align="center" style="border-bottom: none;">📦⚡️ Casbin Gateway</h1>
-<h3 align="center">一个开源网关,管理你机器上的 AI 编程 Agent 与 Web 流量,由 Go 和 React 开发。</h3>
+<h3 align="center">一个开源网关,管理你机器上的 AI 编程 Agent,由 Go 和 React 开发。</h3>
<p align="center">
<a href="https://github.com/apache/casbin-gateway/actions/workflows/golangci-lint.yml">
<img alt="Lint" src="https://github.com/apache/casbin-gateway/actions/workflows/golangci-lint.yml/badge.svg">
@@ -87,7 +87,6 @@ Gateway 会在自己的窗口里打开 —— 不用登录:它只服务本机
| **Skills, MCP & Prompts** | 所有 Agent 的所有技能、MCP 服务器和提示词文件汇总在一张表里。可以给一个或多个 Agent 添加 MCP 服务器,编辑某个 Agent 每次会话前读到的提示词,也可以打开、删除,或复制到另一个 Agent。 | 无 |
| **Providers** | 挡在模型厂商前面的统一入口。API Key 由 Gateway 持有,Agent 拿不到;也可以转发 Agent 自己的登录,什么都不持有。 | 一个厂商的 API Key,或者什么都不用 |
| **LLM Records** | Agent 转发的每一次请求:完整的 system prompt、每一条消息和工具调用、模型可用的每个工具的 schema,以及 token 数和费用。 | 一个 Provider,以及 `llmRecordMode` —— 见[记录提示词](#记录提示词) |
-| **Advanced → Sites** | 反向代理 WAF:按站点的路由、规则、证书和统计。 | 打开代理 —— 见[开启 WAF 反向代理](#开启-waf-反向代理) |
Agent 是通过读取 **Gateway 所在机器**的用户账户、home 目录和安装路径发现的,所以要在你想观察的那台机器上运行它。
@@ -138,9 +137,9 @@ Gateway 默认只监听 `127.0.0.1`,因为有两样东西对能连上这个端
### 在 Docker 或 Podman 里运行
-**容器看不到你机器上的 Agent。** Agent 是靠读取 Gateway 所在机器的用户主目录和安装路径发现的,而在容器里那是容器自己的文件系统。所以 **Agents**、**Skills, MCP & Prompts** 和 Agent 监控在容器里一直是空的,页面会直接说明这一点,而不是让人以为什么都没装。不依赖宿主机的部分照常可用:**Providers**、**LLM Records** 和 WAF 反向代理。
+**容器看不到你机器上的 Agent。** Agent 是靠读取 Gateway 所在机器的用户主目录和安装路径发现的,而在容器里那是容器自己的文件系统。所以 **Agents**、**Skills, MCP & Prompts** 和 Agent 监控在容器里一直是空的,页面会直接说明这一点,而不是让人以为什么都没装。不依赖宿主机的部分照常可用:**Providers** 和 **LLM Records**。
-因此,想监控哪台机器上的 Agent,就在那台机器上跑上面的一键安装;只把 Gateway 当作模型入口或别的机器的反向代理时,才用容器部署。
+因此,想监控哪台机器上的 Agent,就在那台机器上跑上面的一键安装;只把 Gateway 当作别的机器的模型入口时,才用容器部署。
我们没有发布镜像,compose 文件会用本仓库的源码构建一个,所以先把仓库 clone 下来,在仓库根目录执行:
@@ -156,15 +155,6 @@ podman compose up -d
两种方式下管理界面都在 http://localhost:17000,SQLite 数据库存在一个命名卷里,`down` 之后依然保留;`conf/app.conf` 从仓库挂载进去,首次启动前可以先改它播下的那份初始配置,不用重新构建镜像。
-想在容器里用 WAF 反向代理,在 **设置** 页面里打开反向代理,并在 `docker-compose.yml` 里 `17000:17000` 旁边补上它的端口:
-
-```yaml
- ports:
- - "17000:17000"
- - "8080:80"
- - "8443:443"
-```
-
## 配置
所有配置都是可选的。设置在 Web UI 的 **设置** 页面里修改,保存在数据库中,既不用手工改文件,也不用重启。可执行文件旁边的 `conf/app.conf` 只在第一次启动时播下这些值,每一项在文件里都有说明;一步安装装出来的单个可执行文件旁边没有这个文件,播的是编进二进制里的那一份。第一次启动之后再改这个文件不会有任何效果,只有在数据库打开之前就要读的那几项例外:`httpport`、`driverName`、`dataSourceName`、`dbName` 和 `redisEndpoint`。真正常被改动的是这些:
@@ -174,8 +164,6 @@ podman compose up -d
| `httpport` | `17000` | Web UI 和 REST API 的端口 |
| `httpaddr` | `127.0.0.1` | Web UI 监听的网卡 —— 见[让其他机器也能访问](#让其他机器也能访问) |
| `driverName` / `dataSourceName` | `sqlite` / `./data/casbin-gateway.db` | 数据存放位置 |
-| `gatewayEnabled` | `false` | 打开反向代理 WAF |
-| `gatewayHttpPort` / `gatewayHttpsPort` | `80` / `443` | 代理监听的端口 |
| `llmRecordMode` | `full` | 每次转发的 LLM 请求保留多少内容 —— 包含提示词正文,见[记录提示词](#记录提示词) |
| `apiKeyEncryptionKey` | 空 | 加密存储 Provider 的 API Key(AES-256-GCM) |
| `casdoorEndpoint` | 空 | 把登录切换到 [Casdoor](https://casdoor.org) SSO |
@@ -189,17 +177,13 @@ Gateway 启动时会打印它实际在做什么,所以可以直接看结果而
| Management UI | http://localhost:17000 (this machine only) |
| Settings | Settings page, seeded from conf/app.conf |
| Web UI files | web/build |
-| Reverse proxy | enabled |
-| Gateway HTTP | :8080 |
-| Gateway HTTPS | :8443 |
| Database | sqlite, file "./data/casbin-gateway.db" (connected) |
| Sign-in | built-in user table, Casdoor is not configured |
| Relay auth | this machine only, no token needed |
-| App dir | ./data/apps |
+---------------------------------------------------------------------+
```
-还占着这些端口的上一个 Gateway 会先被停掉,所以重启不用等它。被别的程序占着的端口则留给它:Gateway 会指出是哪个进程占着并停止启动,而不是抢过端口,也不会半配置地跑起来。
+还占着这个端口的上一个 Gateway 会先被停掉,所以重启不用等它。被别的程序占着的端口则留给它:Gateway 会指出是哪个进程占着并停止启动,而不是抢过端口,也不会半配置地跑起来。
### 记录提示词
@@ -219,23 +203,9 @@ llmRecordMaxPayloadBytes = 1048576
每条记录旁边的费用用的是内置的官方标价,而厂商会调价、经销商也不按它来。把 `llmPricingFile` 指向你自己的费率 JSON 文件即可修正。
-### 开启 WAF 反向代理
-
-反向代理默认关闭,所以安装 Gateway 不会占用 80 和 443 端口。要使用它:
-
-1. **Advanced → Sites → Add**。**Domain** 填客户端会使用的主机名(`test.example.com`),**Host** 和 **Port** 填流量的去向(`127.0.0.1` 和 `8000`),**Mode** 选 `HTTP` —— 默认的 `HTTPS Only` 会在请求到达后端之前把明文 HTTP 重定向走。
-2. 打开 Sites 页面顶部的 **反向代理** 开关。它立即生效,重启后依然保持。Linux 和 macOS 上 80/443 端口需要 root,所以第一次尝试可以在 **设置** 页面里把网关 HTTP 端口改成 `8080`。
-3. 在后端端口上起点什么,例如 `python -m http.server 8000`,然后用 `Host` 头请求这个站点 —— 网关就是按它路由的,所以不需要 DNS 或 `hosts` 记录:
-
-```bash
-curl -H "Host: test.example.com" http://127.0.0.1:8080/
-```
-
-你应该会拿到后端的响应。返回 `site not found for host` 说明请求到达了 Gateway,但没有站点匹配这个 `Host` 值。
-
### 接入 Casdoor
-[Casdoor](https://casdoor.org) 是可选的,接管成员管理。在一个 Casdoor 实例里为 Gateway 创建组织和应用,然后在 **设置 → 登录** 里填好那五项。只要设置了 `casdoorEndpoint`,登录就会跳转到 Casdoor,同时还会启用 [OAuth 登录](https://casdoor.org/docs/provider/oauth/overview)、健康检查告警、`CAPTCHA` 规则动作、按站点的 SSO 以及云端文件存储。
+[Casdoor](https://casdoor.org) 是可选的,接管成员管理。在一个 Casdoor 实例里为 Gateway 创建组织和应用,然后在 **设置 → 登录** 里填好那五项。只要设置了 `casdoorEndpoint`,登录就会跳转到 Casdoor,同时还会启用 [OAuth 登录](https://casdoor.org/docs/provider/oauth/overview)。
## 开发
@@ -277,7 +247,7 @@ dbName = casbin_gateway
### 构建单文件二进制
-Gateway 平时会从磁盘读三样东西:`conf/app.conf`、`web/build` 里编译好的 UI,以及 IP 地理位置库 `ip/17monipdb.dat`。`embed` 构建标签会把这三样都打进可执行文件,安装脚本发布的就是这种产物:
+Gateway 平时会从磁盘读两样东西:`conf/app.conf` 和 `web/build` 里编译好的 UI。`embed` 构建标签会把这两样都打进可执行文件,安装脚本发布的就是这种产物:
```bash
cd web && yarn install && yarn build
@@ -295,13 +265,12 @@ go build -tags embed -o casbin-gateway .
| --- | --- |
| `conf/app.conf` | 工作目录下、或可执行文件旁边的 `conf/app.conf` |
| `web/build` | 工作目录下的 `web/build/index.html`,此后整个 UI 都从那里提供 |
-| `ip/17monipdb.dat` | 工作目录下的 `ip/17monipdb.dat` |
启动摘要会报告每一项实际来自哪里。
### 数据存放位置
-自包含说的是启动,不代表运行时只读。运行中的 Gateway 会相对于工作目录写入 `./data`(SQLite 数据库、部署的应用、Agent 的 patch 状态)、`./logs` 和 `./tmp` —— 这也是为什么安装出来的 `casbin-gateway` 命令是一个总在安装目录里启动它的包装脚本。直接在别处运行可执行文件,会在那里得到第二个空的安装。
+自包含说的是启动,不代表运行时只读。运行中的 Gateway 会相对于工作目录写入 `./data`(SQLite 数据库和 Agent 的 patch 状态)、`./logs` 和 `./tmp` —— 这也是为什么安装出来的 `casbin-gateway` 命令是一个总在安装目录里启动它的包装脚本。直接在别处运行可执行文件,会在那里得到第二个空的安装。
## 架构
diff --git a/auth/auth.go b/auth/auth.go
index 22ddcab..1d3f04d 100644
--- a/auth/auth.go
+++ b/auth/auth.go
@@ -26,13 +26,8 @@ import (
// Type aliases — re-export all SDK types used across the codebase so that
// other packages only need to import this package, not casdoorsdk directly.
type (
- Application = casdoorsdk.Application
- Cert = casdoorsdk.Cert
- Claims = casdoorsdk.Claims
- Client = casdoorsdk.Client
- Provider = casdoorsdk.Provider
- Resource = casdoorsdk.Resource
- User = casdoorsdk.User
+ Claims = casdoorsdk.Claims
+ User = casdoorsdk.User
)
// InitConfig initialises the identity-provider SDK client.
@@ -40,14 +35,6 @@ func InitConfig(endpoint, clientId, clientSecret, jwtPublicKey, organization, ap
casdoorsdk.InitConfig(endpoint, clientId, clientSecret, jwtPublicKey, organization, application)
}
-func NewClient(endpoint, clientId, clientSecret, certificate, organization, application string) *Client {
- return casdoorsdk.NewClient(endpoint, clientId, clientSecret, certificate, organization, application)
-}
-
-func GetUrl(action string, params map[string]string) string {
- return casdoorsdk.GetUrl(action, params)
-}
-
func GetOAuthToken(code, state string) (*oauth2.Token, error) {
return casdoorsdk.GetOAuthToken(code, state)
}
@@ -55,39 +42,3 @@ func GetOAuthToken(code, state string) (*oauth2.Token, error) {
func ParseJwtToken(token string) (*Claims, error) {
return casdoorsdk.ParseJwtToken(token)
}
-
-func GetUser(name string) (*User, error) {
- return casdoorsdk.GetUser(name)
-}
-
-func GetCerts() ([]*Cert, error) {
- return casdoorsdk.GetCerts()
-}
-
-func GetOrganizationApplications() ([]*Application, error) {
- return casdoorsdk.GetOrganizationApplications()
-}
-
-func GetProviders() ([]*Provider, error) {
- return casdoorsdk.GetProviders()
-}
-
-func SendEmailByProvider(title, content, sender, provider string, receivers ...string) error {
- return casdoorsdk.SendEmailByProvider(title, content, sender, provider, receivers...)
-}
-
-func SendSmsByProvider(content, provider string, receivers ...string) error {
- return casdoorsdk.SendSmsByProvider(content, provider, receivers...)
-}
-
-func GetResources(owner, application, field, value, sortField, sortOrder string) ([]*Resource, error) {
- return casdoorsdk.GetResources(owner, application, field, value, sortField, sortOrder)
-}
-
-func UploadResource(user, tag, parent, fullFilePath string, fileBytes []byte) (string, string, error) {
- return casdoorsdk.UploadResource(user, tag, parent, fullFilePath, fileBytes)
-}
-
-func DeleteResource(resource *Resource) (bool, error) {
- return casdoorsdk.DeleteResource(resource)
-}
diff --git a/certificate/account.go b/certificate/account.go
deleted file mode 100644
index 68f6b1b..0000000
--- a/certificate/account.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package certificate
-
-import (
- "crypto"
-
- "github.com/apache/casbin-gateway/proxy"
- "github.com/casbin/lego/v4/acme"
- "github.com/casbin/lego/v4/certcrypto"
- "github.com/casbin/lego/v4/lego"
- "github.com/casbin/lego/v4/registration"
-)
-
-type Account struct {
- Email string
- Registration *registration.Resource
- key crypto.PrivateKey
-}
-
-/** Implementation of the registration.User interface **/
-
-// GetEmail returns the email address for the account.
-func (a *Account) GetEmail() string {
- return a.Email
-}
-
-// GetPrivateKey returns the private RSA account key.
-func (a *Account) GetPrivateKey() crypto.PrivateKey {
- return a.key
-}
-
-// GetRegistration returns the server registration.
-func (a *Account) GetRegistration() *registration.Resource {
- return a.Registration
-}
-
-func getLegoClientAndAccount(email string, privateKey string, devMode bool) (*lego.Client, *Account) {
- account := &Account{
- Email: email,
- key: decodeEccKey(privateKey),
- }
-
- config := lego.NewConfig(account)
- if devMode {
- config.CADirURL = lego.LEDirectoryStaging
- } else {
- config.CADirURL = lego.LEDirectoryProduction
- }
-
- config.Certificate.KeyType = certcrypto.RSA2048
- config.HTTPClient = proxy.ProxyHttpClient
-
- client, err := lego.NewClient(config)
- if err != nil {
- panic(err)
- }
-
- return client, account
-}
-
-// GetAcmeClient Incoming an email ,a privatekey and a Boolean value that controls the opening of the test environment
-// When this function is started for the first time, it will initialize the account-related configuration,
-// After initializing the configuration, It will try to obtain an account based on the private key,
-// if it fails, it will create an account based on the private key.
-// This account will be used during the running of the program
-func GetAcmeClient(email string, privateKey string, devMode bool) *lego.Client {
- // Create a user. New accounts need an email and private key to start.
- client, account := getLegoClientAndAccount(email, privateKey, devMode)
-
- // try to obtain an account based on the private key
- var err error
- account.Registration, err = client.Registration.ResolveAccountByKey()
- if err != nil {
- acmeError, ok := err.(*acme.ProblemDetails)
- if !ok {
- panic(err)
- }
-
- if acmeError.Type != "urn:ietf:params:acme:error:accountDoesNotExist" {
- panic(acmeError)
- }
-
- // Failed to get account, so create an account based on the private key.
- var err error
- account.Registration, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
- if err != nil {
- panic(err)
- }
- }
-
- return client
-}
diff --git a/certificate/account_test.go b/certificate/account_test.go
deleted file mode 100644
index 706bcc7..0000000
--- a/certificate/account_test.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package certificate
-
-import (
- "testing"
-
- "github.com/apache/casbin-gateway/proxy"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego"
-)
-
-func TestGetClient(t *testing.T) {
- err := beego.LoadAppConfig("ini", "../conf/app.conf")
- if err != nil {
- panic(err)
- }
-
- proxy.InitHttpClient()
-
- eccKey := util.ReadStringFromPath("acme_account.key")
- println(eccKey)
-
- client := GetAcmeClient("acme2@casbin.org", eccKey, false)
- pem, key := ObtainCertificateAli(client, "casbin.com", accessKeyId, accessKeySecret)
- println(pem)
- println()
- println(key)
-}
diff --git a/certificate/conf.go b/certificate/conf.go
deleted file mode 100644
index 32e07a2..0000000
--- a/certificate/conf.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package certificate
-
-var accessKeyId = ""
-var accessKeySecret = ""
diff --git a/certificate/dns.go b/certificate/dns.go
deleted file mode 100644
index 8fd7e19..0000000
--- a/certificate/dns.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package certificate
-
-import (
- "fmt"
- "time"
-
- "github.com/casbin/lego/v4/certificate"
- "github.com/casbin/lego/v4/challenge/dns01"
- "github.com/casbin/lego/v4/cmd"
- "github.com/casbin/lego/v4/lego"
- "github.com/casbin/lego/v4/providers/dns/alidns"
- "github.com/casbin/lego/v4/providers/dns/godaddy"
-)
-
-type AliConf struct {
- Domains []string // The domain names for which you want to apply for a certificate
- AccessKey string // Aliyun account's AccessKey, if this is not empty, Secret is required.
- Secret string
- RAMRole string // Use Ramrole to control aliyun account
- SecurityToken string // Optional
- Path string // The path to store cert file
- Timeout int // Maximum waiting time for certificate application, in minutes
-}
-
-type GodaddyConf struct {
- Domains []string // The domain names for which you want to apply for a certificate
- APIKey string // GoDaddy account's API Key
- APISecret string
- Path string // The path to store cert file
- Timeout int // Maximum waiting time for certificate application, in minutes
-}
-
-// getCert Verify domain ownership, then obtain a certificate, and finally store it locally.
-// Need to pass in an AliConf struct, some parameters are required, other parameters can be left blank
-func getAliCert(client *lego.Client, conf AliConf) (string, string) {
- if conf.Timeout <= 0 {
- conf.Timeout = 3
- }
-
- config := alidns.NewDefaultConfig()
- config.PropagationTimeout = time.Duration(conf.Timeout) * time.Minute
- config.APIKey = conf.AccessKey
- config.SecretKey = conf.Secret
- config.RAMRole = conf.RAMRole
- config.SecurityToken = conf.SecurityToken
-
- dnsProvider, err := alidns.NewDNSProvider(config)
- if err != nil {
- panic(err)
- }
-
- // Choose a local DNS service provider to increase the authentication speed
- servers := []string{"223.5.5.5:53"}
- err = client.Challenge.SetDNS01Provider(dnsProvider, dns01.CondOption(len(servers) > 0, dns01.AddRecursiveNameservers(dns01.ParseNameservers(servers))), dns01.DisableCompletePropagationRequirement())
- if err != nil {
- panic(err)
- }
-
- // Obtain the certificate
- request := certificate.ObtainRequest{
- Domains: conf.Domains,
- Bundle: true,
- }
- cert, err := client.Certificate.Obtain(request)
- if err != nil {
- panic(err)
- }
-
- return string(cert.Certificate), string(cert.PrivateKey)
-}
-
-func getGoDaddyCert(client *lego.Client, conf GodaddyConf) (string, string) {
- if conf.Timeout <= 0 {
- conf.Timeout = 3
- }
-
- config := godaddy.NewDefaultConfig()
- config.PropagationTimeout = time.Duration(conf.Timeout) * time.Minute
- config.PollingInterval = time.Duration(conf.Timeout) * time.Minute / 9
- config.APIKey = conf.APIKey
- config.APISecret = conf.APISecret
-
- dnsProvider, err := godaddy.NewDNSProvider(config)
- if err != nil {
- panic(err)
- }
-
- // Choose a local DNS service provider to increase the authentication speed
- servers := []string{"223.5.5.5:53"}
- err = client.Challenge.SetDNS01Provider(dnsProvider, dns01.CondOption(len(servers) > 0, dns01.AddRecursiveNameservers(dns01.ParseNameservers(servers))), dns01.DisableCompletePropagationRequirement())
- if err != nil {
- panic(err)
- }
-
- // Obtain the certificate
- request := certificate.ObtainRequest{
- Domains: conf.Domains,
- Bundle: true,
- }
- cert, err := client.Certificate.Obtain(request)
- if err != nil {
- panic(err)
- }
-
- return string(cert.Certificate), string(cert.PrivateKey)
-}
-
-func ObtainCertificateAli(client *lego.Client, domain string, accessKey string, accessSecret string) (string, string) {
- conf := AliConf{
- Domains: []string{fmt.Sprintf("*.%s", domain), domain},
- AccessKey: accessKey,
- Secret: accessSecret,
- RAMRole: "",
- SecurityToken: "",
- Path: "",
- Timeout: 3,
- }
- return getAliCert(client, conf)
-}
-
-func ObtainCertificateGoDaddy(client *lego.Client, domain string, accessKey string, accessSecret string) (string, string) {
- conf := GodaddyConf{
- Domains: []string{fmt.Sprintf("*.%s", domain), domain},
- APIKey: accessKey,
- APISecret: accessSecret,
- Path: "",
- Timeout: 3,
- }
- return getGoDaddyCert(client, conf)
-}
-
-func SaveCert(path, filename string, cert *certificate.Resource) {
- // Store the certificate file locally
- certsStorage := cmd.NewCertificatesStorageLib(path, filename, true)
- certsStorage.CreateRootFolder()
- certsStorage.SaveResource(cert)
-}
diff --git a/certificate/ecc.go b/certificate/ecc.go
deleted file mode 100644
index 09de6e4..0000000
--- a/certificate/ecc.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package certificate
-
-import (
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rand"
- "crypto/x509"
- "encoding/pem"
-)
-
-// generateEccKey generates a public and private key pair.(NIST P-256)
-func generateEccKey() *ecdsa.PrivateKey {
- privateKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
- return privateKey
-}
-
-// encodeEccKey Return the input private key object as string type private key
-func encodeEccKey(privateKey *ecdsa.PrivateKey) string {
- x509Encoded, err := x509.MarshalECPrivateKey(privateKey)
- if err != nil {
- panic(err)
- }
-
- pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: x509Encoded})
- return string(pemEncoded)
-}
-
-// decodeEccKey Return the entered private key string as a private key object that can be used
-func decodeEccKey(pemEncoded string) *ecdsa.PrivateKey {
- block, _ := pem.Decode([]byte(pemEncoded))
- x509Encoded := block.Bytes
- privateKey, err := x509.ParseECPrivateKey(x509Encoded)
- if err != nil {
- panic(err)
- }
-
- return privateKey
-}
diff --git a/certificate/ecc_test.go b/certificate/ecc_test.go
deleted file mode 100644
index e3b4664..0000000
--- a/certificate/ecc_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2021 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package certificate
-
-import (
- "testing"
-
- "github.com/apache/casbin-gateway/util"
-)
-
-func TestGenerateEccKey(t *testing.T) {
- eccKey := generateEccKey()
- eccKeyStr := encodeEccKey(eccKey)
- println(eccKeyStr)
- util.WriteStringToPath(eccKeyStr, "acme_account.key")
-}
diff --git a/conf/app.conf b/conf/app.conf
index 3ece953..9397a23 100644
--- a/conf/app.conf
+++ b/conf/app.conf
@@ -40,25 +40,13 @@ redisEndpoint =
; database: losing it makes already-encrypted keys unreadable.
apiKeyEncryptionKey =
-; The reverse-proxy gateway, i.e. the WAF itself. It is off by default because
-; ports 80 and 443 usually belong to something else on the host, and binding
-; them needs root on Linux and macOS. Sites and rules can still be configured
-; while it is off, but nothing is proxied until it is turned on. A previous
-; Gateway still holding one of the two ports below is stopped on startup; a port
-; held by anything else is left to it and the proxy reports the conflict instead.
-gatewayEnabled = false
-gatewayHttpPort = 80
-gatewayHttpsPort = 443
-
; Optional SOCKS5 proxy ("host:port") for outbound traffic such as update
-; downloads and ACME.
+; downloads.
httpProxy = ""
; Casdoor is optional. Leave "casdoorEndpoint" empty to sign in against Gateway's
; own user table instead, with the built-in "admin" account (password "123").
-; Filling in all five values below switches sign-in over to Casdoor SSO and
-; enables the Casdoor-backed features: site SSO, CAPTCHA rules, alert providers
-; and the resource storage provider.
+; Filling in all five values below switches sign-in over to Casdoor SSO.
casdoorEndpoint =
; casdoorEndpoint = https://door.casdoor.com
clientId =
@@ -69,34 +57,6 @@ casdoorApplication =
; Demo mode makes the REST API read-only: only sign-in and sign-out may write.
isDemoMode = false
-; Parent directory of the application source trees that Gateway deploys and
-; restarts. Only used by the "run" feature; a relative path is resolved against
-; the working directory.
-appDir = "./data/apps"
-
-; Optional Alibaba Cloud RDS credentials, used to provision a database for a
-; newly deployed application. Leave empty to skip cloud database provisioning.
-dbRegionId = ""
-dbAccessKeyId = ""
-dbAccessKeySecret = ""
-dbInstanceId = ""
-dbHost = ""
-dbUser = ""
-dbPass = ""
-
-; Prefixes prepended to the Casdoor client ID and secret that are written into a
-; deployed application's own app.conf.
-clientIdPrefix = ""
-clientSecretPrefix = ""
-; Default language written into a deployed application's own app.conf.
-language = "en"
-; Optional JSON object renaming deployed applications, e.g. {"casdoor": "cc"}.
-appMap =
-
-; ACME account used to issue Let's Encrypt certificates for sites.
-acmeEmail = ""
-acmePrivateKey = ""
-
; Agent patch manifests, config backups, ingest tokens, and file-tail cursors.
; Agent activity records themselves are held only in memory.
agentPatchStateDir = "./data/agent-patches"
diff --git a/conf/conf.go b/conf/conf.go
index c7defb4..356e67e 100644
--- a/conf/conf.go
+++ b/conf/conf.go
@@ -27,9 +27,6 @@ import (
"github.com/beego/beego"
)
-//go:embed waf.conf
-var WafConf string
-
func init() {
ApplyEnvOverrides()
}
@@ -167,23 +164,6 @@ func GetRelayToken() string {
return strings.Trim(GetConfigString("relayToken"), `"' `)
}
-// IsGatewayEnabled reports whether the reverse-proxy gateway should bind the
-// gateway ports. It defaults to false: taking over ports 80 and 443 is opt-in,
-// because those usually belong to something else on the host.
-func IsGatewayEnabled() bool {
- return strings.EqualFold(strings.Trim(GetConfigString("gatewayEnabled"), `"' `), "true")
-}
-
-// GetGatewayHttpPort is the plain-HTTP port of the reverse-proxy gateway.
-func GetGatewayHttpPort() int {
- return GetConfigIntDefault("gatewayHttpPort", 80)
-}
-
-// GetGatewayHttpsPort is the HTTPS port of the reverse-proxy gateway.
-func GetGatewayHttpsPort() int {
- return GetConfigIntDefault("gatewayHttpsPort", 443)
-}
-
func GetConfigInt64(key string) (int64, error) {
value := GetConfigString(key)
num, err := strconv.ParseInt(value, 10, 64)
diff --git a/conf/waf.conf b/conf/waf.conf
deleted file mode 100644
index 0882815..0000000
--- a/conf/waf.conf
+++ /dev/null
@@ -1,246 +0,0 @@
-# -- Rule engine initialization ----------------------------------------------
-
-# Enable Coraza, attaching it to every transaction. Use detection
-# only to start with, because that minimises the chances of post-installation
-# disruption.
-#
-SecRuleEngine DetectionOnly
-
-
-# -- Request body handling ---------------------------------------------------
-
-# Allow Coraza to access request bodies. If you don't, Coraza
-# won't be able to see any POST parameters, which opens a large security
-# hole for attackers to exploit.
-#
-SecRequestBodyAccess On
-
-# Enable XML request body parser.
-# Initiate XML Processor in case of xml content-type
-#
-SecRule REQUEST_HEADERS:Content-Type "^(?:application(?:/soap\+|/)|text/)xml" \
- "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
-
-# Enable JSON request body parser.
-# Initiate JSON Processor in case of JSON content-type; change accordingly
-# if your application does not use 'application/json'
-#
-SecRule REQUEST_HEADERS:Content-Type "^application/json" \
- "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
-
-# Sample rule to enable JSON request body parser for more subtypes.
-# Uncomment or adapt this rule if you want to engage the JSON
-# Processor for "+json" subtypes
-#
-#SecRule REQUEST_HEADERS:Content-Type "^application/[a-z0-9.-]+[+]json" \
-# "id:'200006',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
-
-# Maximum request body size we will accept for buffering. If you support
-# file uploads then the value given on the first line has to be as large
-# as the largest file you are willing to accept. The second value refers
-# to the size of data, with files excluded. You want to keep that value as
-# low as practical.
-#
-SecRequestBodyLimit 13107200
-
-SecRequestBodyInMemoryLimit 131072
-
-# SecRequestBodyNoFilesLimit is currently not supported by Coraza
-# SecRequestBodyNoFilesLimit 131072
-
-# What to do if the request body size is above our configured limit.
-# Keep in mind that this setting will automatically be set to ProcessPartial
-# when SecRuleEngine is set to DetectionOnly mode in order to minimize
-# disruptions when initially deploying Coraza.
-#
-SecRequestBodyLimitAction Reject
-
-# Verify that we've correctly processed the request body.
-# As a rule of thumb, when failing to process a request body
-# you should reject the request (when deployed in blocking mode)
-# or log a high-severity alert (when deployed in detection-only mode).
-#
-SecRule REQBODY_ERROR "!@eq 0" \
-"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"
-
-# By default be strict with what we accept in the multipart/form-data
-# request body. If the rule below proves to be too strict for your
-# environment consider changing it to detection-only. You are encouraged
-# _not_ to remove it altogether.
-#
-SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
-"id:'200003',phase:2,t:none,log,deny,status:400, \
-msg:'Multipart request body failed strict validation: \
-PE %{REQBODY_PROCESSOR_ERROR}, \
-BQ %{MULTIPART_BOUNDARY_QUOTED}, \
-BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
-DB %{MULTIPART_DATA_BEFORE}, \
-DA %{MULTIPART_DATA_AFTER}, \
-HF %{MULTIPART_HEADER_FOLDING}, \
-LF %{MULTIPART_LF_LINE}, \
-SM %{MULTIPART_MISSING_SEMICOLON}, \
-IQ %{MULTIPART_INVALID_QUOTING}, \
-IP %{MULTIPART_INVALID_PART}, \
-IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
-FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"
-
-# Did we see anything that might be a boundary?
-#
-# Here is a short description about the Coraza Multipart parser: the
-# parser returns with value 0, if all "boundary-like" line matches with
-# the boundary string which given in MIME header. In any other cases it returns
-# with different value, eg. 1 or 2.
-#
-# The RFC 1341 descript the multipart content-type and its syntax must contains
-# only three mandatory lines (above the content):
-# * Content-Type: multipart/mixed; boundary=BOUNDARY_STRING
-# * --BOUNDARY_STRING
-# * --BOUNDARY_STRING--
-#
-# First line indicates, that this is a multipart content, second shows that
-# here starts a part of the multipart content, third shows the end of content.
-#
-# If there are any other lines, which starts with "--", then it should be
-# another boundary id - or not.
-#
-# After 3.0.3, there are two kinds of types of boundary errors: strict and permissive.
-#
-# If multipart content contains the three necessary lines with correct order, but
-# there are one or more lines with "--", then parser returns with value 2 (non-zero).
-#
-# If some of the necessary lines (usually the start or end) misses, or the order
-# is wrong, then parser returns with value 1 (also a non-zero).
-#
-# You can choose, which one is what you need. The example below contains the
-# 'strict' mode, which means if there are any lines with start of "--", then
-# Coraza blocked the content. But the next, commented example contains
-# the 'permissive' mode, then you check only if the necessary lines exists in
-# correct order. Whit this, you can enable to upload PEM files (eg "----BEGIN.."),
-# or other text files, which contains eg. HTTP headers.
-#
-# The difference is only the operator - in strict mode (first) the content blocked
-# in case of any non-zero value. In permissive mode (second, commented) the
-# content blocked only if the value is explicit 1. If it 0 or 2, the content will
-# allowed.
-#
-
-#
-# See #1747 and #1924 for further information on the possible values for
-# MULTIPART_UNMATCHED_BOUNDARY.
-#
-SecRule MULTIPART_UNMATCHED_BOUNDARY "@eq 1" \
- "id:'200004',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
-
-# Some internal errors will set flags in TX and we will need to look for these.
-# All of these are prefixed with "MSC_". The following flags currently exist:
-#
-# COR_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded.
-#
-SecRule TX:/^COR_/ "!@streq 0" \
- "id:'200005',phase:2,t:none,deny,msg:'Coraza internal error flagged: %{MATCHED_VAR_NAME}'"
-
-
-# -- Response body handling --------------------------------------------------
-
-# Allow Coraza to access response bodies.
-# You should have this directive enabled in order to identify errors
-# and data leakage issues.
-#
-# Do keep in mind that enabling this directive does increases both
-# memory consumption and response latency.
-#
-SecResponseBodyAccess On
-
-# Which response MIME types do you want to inspect? You should adjust the
-# configuration below to catch documents but avoid static files
-# (e.g., images and archives).
-#
-SecResponseBodyMimeType text/plain text/html text/xml
-
-# Buffer response bodies of up to 512 KB in length.
-SecResponseBodyLimit 524288
-
-# What happens when we encounter a response body larger than the configured
-# limit? By default, we process what we have and let the rest through.
-# That's somewhat less secure, but does not break any legitimate pages.
-#
-SecResponseBodyLimitAction ProcessPartial
-
-
-# -- Filesystem configuration ------------------------------------------------
-
-# The location where Coraza will keep its persistent data. This default setting
-# is chosen due to all systems have /tmp available however, it
-# too should be updated to a place that other users can't access.
-#
-SecDataDir /tmp/
-
-
-# -- File uploads handling configuration -------------------------------------
-
-# The location where Coraza stores intercepted uploaded files. This
-# location must be private to Coraza. You don't want other users on
-# the server to access the files, do you?
-#
-#SecUploadDir /opt/coraza/var/upload/
-
-# By default, only keep the files that were determined to be unusual
-# in some way (by an external inspection script). For this to work you
-# will also need at least one file inspection rule.
-#
-#SecUploadKeepFiles RelevantOnly
-
-# Uploaded files are by default created with permissions that do not allow
-# any other user to access them. You may need to relax that if you want to
-# interface Coraza to an external program (e.g., an anti-virus).
-#
-#SecUploadFileMode 0600
-
-
-# -- Debug log configuration -------------------------------------------------
-
-# Default debug log path
-# Debug levels:
-# 0: No logging (least verbose)
-# 1: Error
-# 2: Warn
-# 3: Info
-# 4-8: Debug
-# 9: Trace (most verbose)
-# Most logging has not been implemented because it will be replaced with
-# advanced rule profiling options
-#SecDebugLog /opt/coraza/var/log/debug.log
-#SecDebugLogLevel 3
-
-
-# -- Audit log configuration -------------------------------------------------
-
-# Log the transactions that are marked by a rule, as well as those that
-# trigger a server error (determined by a 5xx or 4xx, excluding 404,
-# level response status codes).
-#
-SecAuditEngine RelevantOnly
-SecAuditLogRelevantStatus "^(?:(5|4)(0|1)[0-9])$"
-
-# Log everything we know about a transaction.
-SecAuditLogParts ABIJDEFHZ
-
-# Use a single file for logging. This is much easier to look at, but
-# assumes that you will use the audit log only occasionally.
-#
-SecAuditLogType Serial
-
-
-# -- Miscellaneous -----------------------------------------------------------
-
-# Use the most commonly used application/x-www-form-urlencoded parameter
-# separator. There's probably only one application somewhere that uses
-# something else so don't expect to change this value.
-#
-SecArgumentSeparator &
-
-# Settle on version 0 (zero) cookies, as that is what most applications
-# use. Using an incorrect cookie version may open your installation to
-# evasion attacks (against the rules that examine named cookies).
-#
-SecCookieFormat 0
\ No newline at end of file
diff --git a/controllers/application.go b/controllers/application.go
deleted file mode 100644
index 928dc05..0000000
--- a/controllers/application.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/conf"
-)
-
-func (c *ApiController) GetApplications() {
- // Casdoor applications are only used to put a site behind Casdoor SSO.
- // With no Casdoor configured there are none to choose from.
- if !conf.IsCasdoorAvailable() {
- c.ResponseOk([]*auth.Application{})
- return
- }
-
- applications, err := auth.GetOrganizationApplications()
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(applications)
-}
diff --git a/controllers/casdoor_provider.go b/controllers/casdoor_provider.go
deleted file mode 100644
index 02fcdce..0000000
--- a/controllers/casdoor_provider.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/conf"
-)
-
-func (c *ApiController) GetCasdoorProviders() {
- // Providers live in Casdoor. Without it, the site alert provider picker
- // simply has nothing to offer instead of failing the whole page.
- if !conf.IsCasdoorAvailable() {
- c.ResponseOk([]*auth.Provider{})
- return
- }
-
- providers, err := auth.GetProviders()
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(providers)
-}
diff --git a/controllers/cert.go b/controllers/cert.go
deleted file mode 100644
index cad8c03..0000000
--- a/controllers/cert.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "encoding/json"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego/utils/pagination"
-)
-
-func (c *ApiController) GetGlobalCerts() {
- if c.RequireSignedIn() {
- return
- }
-
- certs, err := object.GetGlobalCerts()
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedCerts(certs))
-}
-
-func (c *ApiController) GetCerts() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- if owner == "admin" {
- owner = ""
- }
-
- limit := c.Input().Get("pageSize")
- page := c.Input().Get("p")
- field := c.Input().Get("field")
- value := c.Input().Get("value")
- sortField := c.Input().Get("sortField")
- sortOrder := c.Input().Get("sortOrder")
-
- if limit == "" || page == "" {
- certs, err := object.GetCerts(owner)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedCerts(certs))
- } else {
- limit := util.ParseInt(limit)
- count, err := object.GetCertCount(owner, field, value)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- paginator := pagination.SetPaginator(c.Ctx, limit, count)
- certs, err := object.GetPaginationCerts(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedCerts(certs), paginator.Nums())
- }
-}
-
-func (c *ApiController) GetCert() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
- cert, err := object.GetCert(id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedCert(cert))
-}
-
-func (c *ApiController) UpdateCert() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
-
- var cert object.Cert
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &cert)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.UpdateCert(id, &cert))
- c.ServeJSON()
-}
-
-func (c *ApiController) AddCert() {
- if c.RequireSignedIn() {
- return
- }
-
- var cert object.Cert
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &cert)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.AddCert(&cert))
- c.ServeJSON()
-}
-
-func (c *ApiController) DeleteCert() {
- if c.RequireSignedIn() {
- return
- }
-
- var cert object.Cert
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &cert)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.DeleteCert(&cert))
- c.ServeJSON()
-}
-
-func (c *ApiController) UpdateCertDomainExpire() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
- cert, err := object.GetCert(id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- domainExpireTime, err := object.GetDomainExpireTime(cert.Name)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- if domainExpireTime == "" {
- c.ResponseError("Domain expire time is empty")
- return
- }
- cert.DomainExpireTime = domainExpireTime
-
- c.Data["json"] = wrapActionResponse(object.UpdateCert(id, cert))
- c.ServeJSON()
-}
diff --git a/controllers/metric.go b/controllers/metric.go
deleted file mode 100644
index 6833e44..0000000
--- a/controllers/metric.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "errors"
- "time"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
-)
-
-func (c *ApiController) GetMetricsOverTime() {
- if c.RequireSignedIn() {
- return
- }
- rangeType := c.Input().Get("rangeType")
- count := util.ParseInt(c.Input().Get("count"))
- granularity := c.Input().Get("granularity")
- timeType := granularity2TimeType(granularity)
- startTime := time.Now().Add(time.Duration(-count) * rangeType2Duration(rangeType))
- metrics, err := object.GetMetricsOverTime(startTime, timeType)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- var total int64
- for _, metric := range *metrics {
- total += metric.Count
- }
- c.ResponseOk(metrics, total)
-}
-
-func granularity2TimeType(rangeType string) string {
- switch rangeType {
- case "hour":
- return "hour"
- case "day":
- return "day"
- case "week":
- return "day"
- case "month":
- return "month"
- case "year":
- return "month"
- default:
- return "month"
- }
-}
-
-func (c *ApiController) GetMetrics() {
- if c.RequireSignedIn() {
- return
- }
-
- dtoType := c.Input().Get("type")
- dataType, err := type2DataType(dtoType)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- rangeType := c.Input().Get("rangeType")
- count := util.ParseInt(c.Input().Get("count"))
- top, err := util.ParseIntWithError(c.Input().Get("top"))
- // if top is not set or invalid, set it to the maximum value
- if err != nil || top <= 0 {
- top = int(^uint(0) >> 1)
- }
- startTime := time.Now().Add(time.Duration(-count) * rangeType2Duration(rangeType))
- metrics, err := object.GetMetrics(dataType, startTime, top)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- var total int64
- for _, metric := range *metrics {
- total += metric.Count
- }
- c.ResponseOk(metrics, total)
-}
-
-func rangeType2Duration(rangeType string) time.Duration {
- switch rangeType {
- case "hour":
- return time.Hour
- case "day":
- return 24 * time.Hour
- case "week":
- return 7 * 24 * time.Hour
- case "month":
- return 30 * 24 * time.Hour
- case "year":
- return 365 * 24 * time.Hour
- default:
- return time.Hour
- }
-}
-
-func type2DataType(dataType string) (string, error) {
- switch dataType {
- case "site":
- return "host", nil
- case "path":
- return "path", nil
- case "ip":
- return "client_ip", nil
- case "userAgent":
- return "user_agent", nil
- default:
- return "", errors.New("invalid data type")
- }
-}
diff --git a/controllers/node.go b/controllers/node.go
deleted file mode 100644
index e57b6dc..0000000
--- a/controllers/node.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2025 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "encoding/json"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego/utils/pagination"
-)
-
-func (c *ApiController) GetGlobalNodes() {
- if c.RequireSignedIn() {
- return
- }
-
- nodes, err := object.GetGlobalNodes()
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(nodes)
-}
-
-func (c *ApiController) GetNodes() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- if owner == "admin" {
- owner = ""
- }
-
- limit := c.Input().Get("pageSize")
- page := c.Input().Get("p")
- field := c.Input().Get("field")
- value := c.Input().Get("value")
- sortField := c.Input().Get("sortField")
- sortOrder := c.Input().Get("sortOrder")
-
- if limit == "" || page == "" {
- nodes, err := object.GetNodes(owner)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- c.ResponseOk(nodes)
- return
- }
-
- limitInt := util.ParseInt(limit)
- count, err := object.GetNodeCount(owner, field, value)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- paginator := pagination.SetPaginator(c.Ctx, limitInt, count)
- nodes, err := object.GetPaginationNodes(owner, paginator.Offset(), limitInt, field, value, sortField, sortOrder)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(nodes, paginator.Nums())
-}
-
-func (c *ApiController) GetNode() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
-
- node, err := object.GetNode(id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(node)
-}
-
-func (c *ApiController) UpdateNode() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
-
- var node object.Node
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &node)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.UpdateNode(id, &node))
- c.ServeJSON()
-}
-
-func (c *ApiController) AddNode() {
- if c.RequireSignedIn() {
- return
- }
-
- var node object.Node
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &node)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.AddNode(&node))
- c.ServeJSON()
-}
-
-func (c *ApiController) DeleteNode() {
- if c.RequireSignedIn() {
- return
- }
-
- var node object.Node
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &node)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.DeleteNode(&node))
- c.ServeJSON()
-}
diff --git a/controllers/record.go b/controllers/record.go
deleted file mode 100644
index ab56ffe..0000000
--- a/controllers/record.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "encoding/json"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego/utils/pagination"
-)
-
-func (c *ApiController) GetRecords() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- if owner == "admin" {
- owner = ""
- }
- limit := c.Input().Get("pageSize")
- page := c.Input().Get("p")
- field := c.Input().Get("field")
- value := c.Input().Get("value")
- sortField := c.Input().Get("sortField")
- sortOrder := c.Input().Get("sortOrder")
-
- if limit == "" || page == "" {
- records, err := object.GetRecords(owner)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- // object.GetMaskedSites(sites, util.GetHostname())
- c.ResponseOk(records)
- } else {
- limit := util.ParseInt(limit)
- count, err := object.GetRecordCount(owner, field, value)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- paginator := pagination.SetPaginator(c.Ctx, limit, count)
- records, err := object.GetPaginationRecords(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(records, paginator.Nums())
- }
-}
-
-func (c *ApiController) DeleteRecord() {
- if c.RequireSignedIn() {
- return
- }
-
- var record object.Record
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &record)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.DeleteRecord(&record))
- c.ServeJSON()
-}
-
-func (c *ApiController) UpdateRecord() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- id := c.Input().Get("id")
-
- var record object.Record
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &record)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.UpdateRecord(owner, id, &record))
- c.ServeJSON()
-}
-
-func (c *ApiController) GetRecord() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- id := c.Input().Get("id")
- record, err := object.GetRecord(owner, id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(record)
-}
-
-func (c *ApiController) AddRecord() {
- if c.RequireSignedIn() {
- return
- }
-
- var record object.Record
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &record)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.AddRecord(&record))
- c.ServeJSON()
-}
diff --git a/controllers/rule.go b/controllers/rule.go
deleted file mode 100644
index 30ae9c0..0000000
--- a/controllers/rule.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "encoding/json"
- "errors"
- "net"
- "strings"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego/utils/pagination"
- "github.com/hsluoyz/modsecurity-go/seclang/parser"
-)
-
-func (c *ApiController) GetRules() {
- if c.RequireSignedIn() {
- return
- }
- owner := c.Input().Get("owner")
- if owner == "admin" {
- owner = ""
- }
- limit := c.Input().Get("pageSize")
- page := c.Input().Get("p")
- field := c.Input().Get("field")
- value := c.Input().Get("value")
- sortField := c.Input().Get("sortField")
- sortOrder := c.Input().Get("sortOrder")
-
- if limit == "" || page == "" {
- rules, err := object.GetRules(owner)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(rules)
- } else {
- limit := util.ParseInt(limit)
- count, err := object.GetRuleCount(owner, field, value)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- paginator := pagination.SetPaginator(c.Ctx, limit, count)
- rules, err := object.GetPaginationRules(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(rules, paginator.Nums())
- }
-}
-
-func (c *ApiController) GetRule() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
- rule, err := object.GetRule(id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(rule)
-}
-
-func (c *ApiController) AddRule() {
- if c.RequireSignedIn() {
- return
- }
-
- currentTime := util.GetCurrentTime()
- rule := object.Rule{
- CreatedTime: currentTime,
- UpdatedTime: currentTime,
- }
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &rule)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- err = checkExpressions(rule.Expressions, rule.Type)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- c.Data["json"] = wrapActionResponse(object.AddRule(&rule))
- c.ServeJSON()
-}
-
-func (c *ApiController) UpdateRule() {
- if c.RequireSignedIn() {
- return
- }
-
- var rule object.Rule
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &rule)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- err = checkExpressions(rule.Expressions, rule.Type)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- id := c.Input().Get("id")
- c.Data["json"] = wrapActionResponse(object.UpdateRule(id, &rule))
- c.ServeJSON()
-}
-
-func (c *ApiController) DeleteRule() {
- if c.RequireSignedIn() {
- return
- }
-
- var rule object.Rule
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &rule)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.DeleteRule(&rule))
- c.ServeJSON()
-}
-
-func checkExpressions(expressions []*object.Expression, ruleType string) error {
- values := make([]string, len(expressions))
- for i, expression := range expressions {
- values[i] = expression.Value
- }
- switch ruleType {
- case "WAF":
- return checkWafRule(values)
- case "IP":
- return checkIpRule(values)
- case "IP Rate Limiting":
- return checkIpRateRule(expressions)
- case "Compound":
- return checkCompoundRules(values)
- }
- return nil
-}
-
-func checkWafRule(rules []string) error {
- for _, rule := range rules {
- scanner := parser.NewSecLangScannerFromString(rule)
- _, err := scanner.AllDirective()
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-func checkIpRule(ipLists []string) error {
- for _, ipList := range ipLists {
- for _, ip := range strings.Split(ipList, ",") {
- _, _, err := net.ParseCIDR(ip)
- if net.ParseIP(ip) == nil && err != nil {
- return errors.New("Invalid IP address: " + ip)
- }
- }
- }
- return nil
-}
-
-func checkIpRateRule(expressions []*object.Expression) error {
- if len(expressions) != 1 {
- return errors.New("IP Rate Limiting rule must have exactly one expression")
- }
- expression := expressions[0]
- _, err := util.ParseIntWithError(expression.Operator)
- if err != nil {
- return err
- }
- _, err = util.ParseIntWithError(expression.Value)
- if err != nil {
- return err
- }
- return nil
-}
-
-func checkCompoundRules(rules []string) error {
- _, err := object.GetRulesByRuleIds(rules)
- if err != nil {
- return err
- }
- return nil
-}
diff --git a/controllers/setting.go b/controllers/setting.go
index 62f7961..fd97713 100644
--- a/controllers/setting.go
+++ b/controllers/setting.go
@@ -17,7 +17,6 @@ package controllers
import (
"encoding/json"
"fmt"
- "strings"
"time"
"github.com/apache/casbin-gateway/agentmonitor"
@@ -25,8 +24,6 @@ import (
"github.com/apache/casbin-gateway/conf"
"github.com/apache/casbin-gateway/object"
"github.com/apache/casbin-gateway/proxy"
- "github.com/apache/casbin-gateway/run"
- "github.com/apache/casbin-gateway/service"
)
func (c *ApiController) GetSetting() {
@@ -100,23 +97,6 @@ func validateSetting(setting *object.Setting) error {
return fmt.Errorf("llmRecordMode must be one of \"off\", \"metadata\" or \"full\"")
}
- for _, port := range []int{setting.GatewayHttpPort, setting.GatewayHttpsPort} {
- if port < 1 || port > 65535 {
- return fmt.Errorf("the gateway ports must be between 1 and 65535")
- }
- }
- if setting.GatewayHttpPort == setting.GatewayHttpsPort {
- return fmt.Errorf("the two gateway ports must differ")
- }
-
- // run.InitAppMap() panics on a malformed value, so it is rejected here
- // rather than taking the process down after it has been stored.
- if appMap := strings.TrimSpace(setting.AppMap); appMap != "" {
- if err := json.Unmarshal([]byte(appMap), &map[string]string{}); err != nil {
- return fmt.Errorf("appMap must be a JSON object, e.g. {\"casdoor\": \"cc\"}: %s", err.Error())
- }
- }
-
return nil
}
@@ -126,7 +106,6 @@ func validateSetting(setting *object.Setting) error {
func applySetting(previous *object.Setting, setting *object.Setting) error {
casdoor.InitCasdoorConfig()
proxy.InitHttpClient()
- run.InitAppMap()
object.ReloadLlmPrices()
agentmonitor.Configure(
conf.GetAgentPatchStateDir(),
@@ -145,24 +124,5 @@ func applySetting(previous *object.Setting, setting *object.Setting) error {
object.StartLlmRecordWriter()
}
- return applyGatewaySetting(previous, setting)
-}
-
-func applyGatewaySetting(previous *object.Setting, setting *object.Setting) error {
- if !setting.GatewayEnabled {
- service.StopGateway()
- return nil
- }
-
- portsChanged := previous.GatewayHttpPort != setting.GatewayHttpPort ||
- previous.GatewayHttpsPort != setting.GatewayHttpsPort
- if portsChanged && service.IsGatewayRunning() {
- service.StopGateway()
- }
-
- if err := service.StartGateway(); err != nil {
- return fmt.Errorf("the reverse proxy could not start: %s", err.Error())
- }
-
return nil
}
diff --git a/controllers/site.go b/controllers/site.go
deleted file mode 100644
index 81e70bc..0000000
--- a/controllers/site.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package controllers
-
-import (
- "encoding/json"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego/utils/pagination"
-)
-
-func (c *ApiController) GetGlobalSites() {
- if c.RequireSignedIn() {
- return
- }
-
- sites, err := object.GetGlobalSites()
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedSites(sites, util.GetHostname()))
-}
-
-func (c *ApiController) GetSites() {
- if c.RequireSignedIn() {
- return
- }
-
- owner := c.Input().Get("owner")
- if owner == "admin" {
- owner = ""
- }
-
- limit := c.Input().Get("pageSize")
- page := c.Input().Get("p")
- field := c.Input().Get("field")
- value := c.Input().Get("value")
- sortField := c.Input().Get("sortField")
- sortOrder := c.Input().Get("sortOrder")
-
- if limit == "" || page == "" {
- sites, err := object.GetSites(owner)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
- c.ResponseOk(object.GetMaskedSites(sites, util.GetHostname()))
- return
- }
-
- limitInt := util.ParseInt(limit)
- count, err := object.GetSiteCount(owner, field, value)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- paginator := pagination.SetPaginator(c.Ctx, limitInt, count)
- sites, err := object.GetPaginationSites(owner, paginator.Offset(), limitInt, field, value, sortField, sortOrder)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedSites(sites, util.GetHostname()), paginator.Nums())
-}
-
-func (c *ApiController) GetSite() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
-
- site, err := object.GetSite(id)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.ResponseOk(object.GetMaskedSite(site, util.GetHostname()))
-}
-
-func (c *ApiController) UpdateSite() {
- if c.RequireSignedIn() {
- return
- }
-
- id := c.Input().Get("id")
-
- var site object.Site
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &site)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.UpdateSite(id, &site))
- c.ServeJSON()
-}
-
-func (c *ApiController) AddSite() {
- if c.RequireSignedIn() {
- return
- }
-
- var site object.Site
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &site)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.AddSite(&site))
- c.ServeJSON()
-}
-
-func (c *ApiController) DeleteSite() {
- if c.RequireSignedIn() {
- return
- }
-
- var site object.Site
- err := json.Unmarshal(c.Ctx.Input.RequestBody, &site)
- if err != nil {
- c.ResponseError(err.Error())
- return
- }
-
- c.Data["json"] = wrapActionResponse(object.DeleteSite(&site))
- c.ServeJSON()
-}
diff --git a/controllers/system.go b/controllers/system.go
index e4621f4..61051d8 100644
--- a/controllers/system.go
+++ b/controllers/system.go
@@ -16,26 +16,8 @@ package controllers
import (
"github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/service"
)
-// GetGatewayStatus tells the web UI whether the reverse-proxy gateway is
-// actually running. Without it, a Gateway whose reverse proxy is off accepts
-// every site and rule and silently proxies nothing.
-func (c *ApiController) GetGatewayStatus() {
- if c.RequireSignedIn() {
- return
- }
-
- c.ResponseOk(map[string]interface{}{
- "gatewayEnabled": conf.IsGatewayEnabled(),
- "gatewayRunning": service.IsGatewayRunning(),
- "gatewayError": service.GatewayError(),
- "httpPort": conf.GetGatewayHttpPort(),
- "httpsPort": conf.GetGatewayHttpsPort(),
- })
-}
-
// GetRelayToken hands the web UI the token an agent has to send to the relay,
// so the snippets it shows can be pasted as they are.
func (c *ApiController) GetRelayToken() {
diff --git a/embed.go b/embed.go
index 624d3b3..ead0f23 100644
--- a/embed.go
+++ b/embed.go
@@ -49,14 +49,11 @@ var embeddedAppConf string
//go:embed web/build
var embeddedWeb embed.FS
-//go:embed ip/17monipdb.dat
-var embeddedIpDb []byte
-
func init() {
webFS, err := fs.Sub(embeddedWeb, "web/build")
if err != nil {
panic(err)
}
- embedsupport.Setup(embeddedAppConf, webFS, embeddedIpDb)
+ embedsupport.Setup(embeddedAppConf, webFS)
}
diff --git a/embedsupport/setup.go b/embedsupport/setup.go
index 3760ca1..d9f73dd 100644
--- a/embedsupport/setup.go
+++ b/embedsupport/setup.go
@@ -13,10 +13,10 @@
// limitations under the License.
// Package embedsupport wires up the assets that are baked into the binary when
-// it is built with -tags embed: conf/app.conf, the compiled web UI in
-// web/build, and the IP location database. Those are every file Gateway needs
-// to find on disk at startup, so embedding them turns it into a single
-// executable that runs with nothing next to it.
+// it is built with -tags embed: conf/app.conf and the compiled web UI in
+// web/build. Those are every file Gateway needs to find on disk at startup, so
+// embedding them turns it into a single executable that runs with nothing next
+// to it.
//
// The embedded copies are a fallback, never an override: whenever the matching
// file exists on disk it wins, so an operator can drop a conf/app.conf beside
@@ -28,18 +28,13 @@ package embedsupport
import "io/fs"
-var (
- webFS fs.FS
- ipDb []byte
-)
+var webFS fs.FS
// Setup must be called before any config value is read or any request is
-// served. appConf is the contents of the embedded conf/app.conf, web is the
-// embedded web/build tree, and ipDb is the embedded IP location database; each
-// of them may be empty or nil.
-func Setup(appConf string, web fs.FS, ipDatabase []byte) {
+// served. appConf is the contents of the embedded conf/app.conf and web is the
+// embedded web/build tree; either of them may be empty or nil.
+func Setup(appConf string, web fs.FS) {
webFS = web
- ipDb = ipDatabase
setupConf(appConf)
}
@@ -49,7 +44,3 @@ func WebFS() fs.FS { return webFS }
// HasWeb reports whether a compiled web UI is embedded in this binary.
func HasWeb() bool { return webFS != nil }
-
-// IpDb returns the embedded IP location database, or nil when this binary
-// carries none.
-func IpDb() []byte { return ipDb }
diff --git a/go.mod b/go.mod
index b27972b..dfb6e57 100644
--- a/go.mod
+++ b/go.mod
@@ -3,108 +3,70 @@ module github.com/apache/casbin-gateway
go 1.20
require (
+ github.com/BurntSushi/toml v0.3.1
github.com/Masterminds/squirrel v1.5.4
- github.com/aliyun/alibaba-cloud-sdk-go v1.61.1183
github.com/beego/beego v1.12.12
- github.com/casbin/lego/v4 v4.5.4
github.com/casdoor/casdoor-go-sdk v0.52.0
- github.com/corazawaf/coraza/v3 v3.1.0
github.com/denisenkom/go-mssqldb v0.10.0
- github.com/go-git/go-git/v5 v5.9.0
github.com/go-mysql-org/go-mysql v1.7.0
github.com/go-sql-driver/mysql v1.6.0
github.com/google/uuid v1.6.0
- github.com/hsluoyz/modsecurity-go v0.0.7
github.com/lib/pq v1.10.2
- github.com/likexian/whois v1.15.1
- github.com/likexian/whois-parser v1.24.9
github.com/siddontang/go-log v0.0.0-20190221022429-1e957dd83bed
github.com/xorm-io/core v0.7.4
github.com/xorm-io/xorm v1.1.6
golang.org/x/crypto v0.19.0
- golang.org/x/net v0.21.0
golang.org/x/oauth2 v0.13.0
golang.org/x/sys v0.17.0
- golang.org/x/text v0.14.0
- golang.org/x/time v0.3.0
gopkg.in/yaml.v3 v3.0.1
modernc.org/sqlite v1.18.1
)
require (
- dario.cat/mergo v1.0.0 // indirect
- github.com/BurntSushi/toml v0.3.1 // indirect
- github.com/Microsoft/go-winio v0.6.1 // indirect
- github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
- github.com/acomagu/bufpipe v1.0.4 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/cenkalti/backoff/v4 v4.1.1 // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
- github.com/cloudflare/circl v1.3.3 // indirect
- github.com/corazawaf/libinjection-go v0.1.3 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
- github.com/cyphar/filepath-securejoin v0.2.4 // indirect
- github.com/emirpasic/gods v1.18.1 // indirect
- github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
- github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
github.com/gomodule/redigo v2.0.0+incompatible // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
- github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
- github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
- github.com/kevinburke/ssh_config v1.2.0 // indirect
+ github.com/kr/pretty v0.3.1 // indirect
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
- github.com/likexian/gokit v0.25.13 // indirect
- github.com/magefile/mage v1.15.0 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
- github.com/miekg/dns v1.1.57 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
- github.com/petar-dambovaliev/aho-corasick v0.0.0-20230725210150-fb29fc3c913e // indirect
+ github.com/onsi/gomega v1.27.10 // indirect
github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 // indirect
github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7 // indirect
github.com/pingcap/tidb/parser v0.0.0-20221126021158-6b02a5d8ba7d // indirect
- github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/prometheus/client_golang v1.7.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.10.0 // indirect
github.com/prometheus/procfs v0.1.3 // indirect
- github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
- github.com/russross/blackfriday/v2 v2.0.1 // indirect
- github.com/sergi/go-diff v1.1.0 // indirect
+ github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
- github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect
- github.com/skeema/knownhosts v1.2.0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
- github.com/tidwall/gjson v1.17.0 // indirect
- github.com/tidwall/match v1.1.1 // indirect
- github.com/tidwall/pretty v1.2.1 // indirect
- github.com/urfave/cli v1.22.5 // indirect
- github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xorm-io/builder v0.3.13 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.18.1 // indirect
golang.org/x/mod v0.14.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
golang.org/x/sync v0.6.0 // indirect
+ golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.15.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.31.0 // indirect
- gopkg.in/ini.v1 v1.62.0 // indirect
+ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
- gopkg.in/square/go-jose.v2 v2.6.0 // indirect
- gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
lukechampine.com/uint128 v1.1.1 // indirect
modernc.org/cc/v3 v3.36.0 // indirect
@@ -115,5 +77,4 @@ require (
modernc.org/opt v0.1.1 // indirect
modernc.org/strutil v1.1.1 // indirect
modernc.org/token v1.0.0 // indirect
- rsc.io/binaryregexp v0.2.0 // indirect
)
diff --git a/go.sum b/go.sum
index 1716cad..1f61bc1 100644
--- a/go.sum
+++ b/go.sum
@@ -1,643 +1,16 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
-cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
-cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
-cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
-cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
-cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
-cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
-cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
-cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
-cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
-cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
-cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
-cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
-cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
-cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
-cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
-cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
-cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
-cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
-cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
-cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
-cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
-cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
-cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
-cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM=
-cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ=
-cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
-cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
-cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
-cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ=
-cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k=
-cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw=
-cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
-cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
-cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M=
-cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE=
-cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE=
-cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
-cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
-cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8=
-cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
-cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
-cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8=
-cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY=
-cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM=
-cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc=
-cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU=
-cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI=
-cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8=
-cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
-cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
-cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84=
-cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A=
-cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E=
-cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
-cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
-cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY=
-cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k=
-cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
-cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
-cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
-cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
-cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI=
-cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ=
-cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI=
-cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08=
-cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
-cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
-cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
-cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
-cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
-cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo=
-cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg=
-cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw=
-cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
-cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
-cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
-cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
-cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
-cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
-cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
-cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
-cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
-cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
-cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU=
-cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
-cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
-cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss=
-cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
-cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
-cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g=
-cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
-cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
-cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM=
-cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
-cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
-cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
-cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E=
-cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac=
-cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q=
-cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU=
-cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
-cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
-cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
-cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
-cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss=
-cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc=
-cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
-cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
-cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
-cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
-cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q=
-cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
-cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
-cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8=
-cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
-cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
-cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE=
-cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU=
-cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
-cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
-cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M=
-cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg=
-cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s=
-cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
-cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
-cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
-cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
-cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
-cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
-cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
-cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y=
-cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs=
-cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
-cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
-cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
-cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
-cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
-cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
-cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
-cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
-cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
-cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
-cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
-cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
-cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
-cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
-cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI=
-cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
-cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
-cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
-cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
-cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
-cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
-cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
-cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
-cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
-cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
-cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
-cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
-cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
-cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
-cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
-cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
-cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s=
-cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
-cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
-cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
-cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
-cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
-cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M=
-cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0=
-cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8=
-cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
-cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
-cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE=
-cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
-cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
-cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
-cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA=
-cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE=
-cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
-cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
-cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8=
-cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
-cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
-cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM=
-cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
-cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
-cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ=
-cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs=
-cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
-cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
-cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4=
-cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
-cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
-cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
-cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c=
-cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
-cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
-cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
-cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
-cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs=
-cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww=
-cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
-cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
-cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI=
-cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ=
-cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
-cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
-cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
-cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
-cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
-cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM=
-cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4=
-cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE=
-cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
-cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
-cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4=
-cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
-cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
-cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
-cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
-cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM=
-cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs=
-cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
-cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
-cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE=
-cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
-cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
-cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc=
-cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY=
-cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
-cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
-cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
-cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M=
-cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
-cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
-cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw=
-cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY=
-cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
-cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
-cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
-cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
-cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
-cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
-cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
-cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
-cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
-cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw=
-cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA=
-cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c=
-cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
-cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
-cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
-cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
-cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
-cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
-cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
-cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg=
-cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
-cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
-cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw=
-cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
-cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
-cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E=
-cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw=
-cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
-cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
-cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y=
-cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
-cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
-cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
-cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo=
-cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
-cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
-cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
-cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
-cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
-cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
-cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
-cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
-cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
-cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
-cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
-cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
-cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo=
-cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74=
-cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
-cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
-cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4=
-cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
-cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
-cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o=
-cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE=
-cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
-cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
-cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
-cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg=
-cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
-cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
-cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
-cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
-cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
-cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
-cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
-cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY=
-cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
-cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
-cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo=
-cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
-cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M=
-cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
-cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
-cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
-cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
-cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
-cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
-cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
-cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw=
-cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY=
-cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
-cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
-cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I=
-cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
-cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
-cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
-cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
-cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM=
-cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
-cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
-cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
-cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
-cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo=
-cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
-cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
-cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
-cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
-cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
-cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
-cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
-cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
-cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E=
-cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM=
-cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
-cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
-cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY=
-cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
-cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
-cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k=
-cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU=
-cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
-cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
-cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
-cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
-cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE=
-cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ=
-cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
-cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
-cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI=
-cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
-cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
-cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ=
-cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
-cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
-cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc=
-cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
-cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
-cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
-cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
-cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw=
-cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
-cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
-cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
-cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
-cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs=
-cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
-cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
-cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk=
-cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
-cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
-cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw=
-cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc=
-cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
-cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
-cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg=
-cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
-cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
-cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8=
-cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4=
-cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
-cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k=
-cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM=
-cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
-cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
-cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
-cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
-cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
-cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
-cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA=
-cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c=
-cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
-cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
-cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac=
-cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
-cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
-cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
-cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
-cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ=
-cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
-cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
-cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
-cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
-cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ=
-cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
-cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
-cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
-cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
-cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
-cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
-cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
-cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
-cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
-cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
-cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
-cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
-cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14=
-cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
-cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
-cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM=
-cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg=
-cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
-cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
-cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
-cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
-cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc=
-cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc=
-cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
-cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
-cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
-cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU=
-cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
-cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
-cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
-cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
-cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
-cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8=
-cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0=
-cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
-cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
-cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
-cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
-cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0=
-cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag=
-cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
-cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
-cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA=
-cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc=
-cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk=
-cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
-cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
-cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
-cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
-cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY=
-cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s=
-cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
-cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
-cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc=
-cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4=
-cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
-cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
-cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec=
-cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA=
-cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
-cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
-cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A=
-cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
-cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
-cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
-cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
-cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
-cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
-cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
-cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0=
-cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
-cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
-cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
-cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
-cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
-cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
-cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
-cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
-cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
-cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw=
-cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
-cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
-cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
-cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
-cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c=
-cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
-cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
-cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc=
-cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
-cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
-cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM=
-cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
-cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
-cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
-cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
-cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
-cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
-cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
-cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
-cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
-cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
-cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
-cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg=
-cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk=
-cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
-cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
-cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
-cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
-cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
-cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
-cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU=
-cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
-cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
-cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
-cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
-cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
-cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY=
-cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0=
-cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
-cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
-cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc=
-cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY=
-cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
-cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8=
-cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY=
-cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
-cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
-cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes=
-cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
-cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
-cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
-cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
-cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg=
-cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
-cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
-cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng=
-cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
-cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
-cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
-cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
-cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
-dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
-dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
-git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
-github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
-github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
-github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg=
-github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
-github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
-github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
-github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
-github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
-github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
-github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
-github.com/aliyun/alibaba-cloud-sdk-go v1.61.1183 h1:dkj8/dxOQ4L1XpwCzRLqukvUBbxuNdz3FeyvHFnRjmo=
-github.com/aliyun/alibaba-cloud-sdk-go v1.61.1183/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
-github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
-github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
-github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/anuraaga/go-modsecurity v0.0.0-20220824035035-b9a4099778df/go.mod h1:7jguE759ADzy2EkxGRXigiC0ER1Yq2IFk2qNtwgzc7U=
-github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0=
-github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI=
-github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/beego/beego v1.12.12 h1:ARY1sNVSS23N0mEQIhSqRDTyyDlx95JY0V3GogBbZbQ=
github.com/beego/beego v1.12.12/go.mod h1:QURFL1HldOcCZAxnc1cZ7wrplsYR5dKPHFjmk6WkLAs=
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
@@ -648,60 +21,18 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
-github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
-github.com/casbin/lego/v4 v4.5.4 h1:WdVEj1A5KmKZheNuFNLF/5+UUkpXLt9mEOrLX3E81Vo=
-github.com/casbin/lego/v4 v4.5.4/go.mod h1:JjTyJgN5pyrDPcg3+aAM1NtFQIXl8zDgsoSS1TnVpJ8=
github.com/casdoor/casdoor-go-sdk v0.52.0 h1:UKcZfczO3U5H7md6bTtI6zIJzeorBrbg/WE8Q4qsczE=
github.com/casdoor/casdoor-go-sdk v0.52.0/go.mod h1:cMnkCQJgMYpgAlgEx8reSt1AVaDIQLcJ1zk5pzBaz+4=
-github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
-github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
-github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
-github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/corazawaf/coraza/v3 v3.1.0 h1:CB6YxNXdbZjUJS/0FVFoFvS8eOVFbIvlNuHNC5dh88c=
-github.com/corazawaf/coraza/v3 v3.1.0/go.mod h1:S0bhYQfTu1Ew3YKdI37X1WWu6t4En4Tvw28aKyQFJaU=
-github.com/corazawaf/libinjection-go v0.1.3 h1:PUplAYho1BBl0tIVbhDsNRuVGIeUYSiCEc9oQpb2rJU=
-github.com/corazawaf/libinjection-go v0.1.3/go.mod h1:OP4TM7xdJ2skyXqNX1AN1wN5nNZEmJNuWbNPOItn7aw=
github.com/couchbase/go-couchbase v0.0.0-20201216133707-c04035124b17/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
github.com/couchbase/gomemcached v0.1.2-0.20201224031647-c432ccf49f32/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
github.com/couchbase/goutils v0.0.0-20210118111533-e33d3ffb5401/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
-github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
@@ -711,255 +42,73 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/denisenkom/go-mssqldb v0.10.0 h1:QykgLZBorFE95+gO3u9esLd0BmbvpWp0/waNNZfHBM8=
github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
-github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
-github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
-github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
-github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
-github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
-github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
-github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
-github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
-github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
-github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
-github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI=
-github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
-github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
-github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
-github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
-github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
-github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
-github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
-github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
-github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
-github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
-github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
-github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
-github.com/go-git/go-git/v5 v5.9.0 h1:cD9SFA7sHVRdJ7AYck1ZaAa/yeuBvGPxwXDL8cxrObY=
-github.com/go-git/go-git/v5 v5.9.0/go.mod h1:RKIqga24sWdMGZF+1Ekv9kylsDz6LzdTSI2s/OsZWE0=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
-github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-mysql-org/go-mysql v1.7.0 h1:qE5FTRb3ZeTQmlk3pjE+/m2ravGxxRDrVDTyDe9tvqI=
github.com/go-mysql-org/go-mysql v1.7.0/go.mod h1:9cRWLtuXNKhamUPMkrDVzBhaomGvqLRLtBiyjvjc4pk=
-github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
-github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
-github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
-github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
-github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
-github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
-github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM=
-github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
-github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
-github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
-github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
-github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
-github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
-github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
-github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
-github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
-github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
-github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
-github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
-github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
-github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
-github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw=
-github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI=
-github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
-github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/hsluoyz/modsecurity-go v0.0.7 h1:W5ChaDrm4kM/UhHxoD2zyxQ+6s5kSj6cVftDFgdFzBM=
-github.com/hsluoyz/modsecurity-go v0.0.7/go.mod h1:hi81ySzwvlQFd5pip9c3uwXHDAW9ayxwLbt8ufxRkdY=
-github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmoiron/sqlx v1.3.3/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
-github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
-github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
-github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
-github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -976,37 +125,13 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
-github.com/likexian/gokit v0.25.13 h1:p2Uw3+6fGG53CwdU2Dz0T6bOycdb2+bAFAa3ymwWVkM=
-github.com/likexian/gokit v0.25.13/go.mod h1:qQhEWFBEfqLCO3/vOEo2EDKd+EycekVtUK4tex+l2H4=
-github.com/likexian/whois v1.15.1 h1:6vTMI8n9s1eJdmcO4R9h1x99aQWIZZX1CD3am68gApU=
-github.com/likexian/whois v1.15.1/go.mod h1:/nxmQ6YXvLz+qTxC/QFtEJNAt0zLuRxJrKiWpBJX8X0=
-github.com/likexian/whois-parser v1.24.9 h1:BT6fzO3lj3F07yzVv0YXoaj+K4Ush0/cF+Yp6tvJJgk=
-github.com/likexian/whois-parser v1.24.9/go.mod h1:b6STMHHDaSKbd4PzGrP50wWE5NzeBUETa/hT9gI0G9I=
-github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
-github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
-github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
-github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
-github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
-github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
-github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
-github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mccutchen/go-httpbin/v2 v2.13.2/go.mod h1:f4DUXYlU6yH0V81O4lJIwqpmYdTXXmYwzxMnYEimFPk=
-github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
-github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
-github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
-github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
-github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
-github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -1015,57 +140,16 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU=
-github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
-github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0=
-github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo=
-github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw=
-github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo=
-github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc=
-github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk=
-github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo=
-github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts=
-github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
-github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0=
-github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
-github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc=
-github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM=
-github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg=
-github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM=
-github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM=
-github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw=
-github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw=
-github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ=
-github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
-github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4=
-github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/petar-dambovaliev/aho-corasick v0.0.0-20230725210150-fb29fc3c913e h1:POJco99aNgosh92lGqmx7L1ei+kCymivB/419SD15PQ=
-github.com/petar-dambovaliev/aho-corasick v0.0.0-20230725210150-fb29fc3c913e/go.mod h1:EHPiTAKtiFmrMldLUNswFwfZ2eJIYBHktdaUTZxYWRw=
github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
-github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
-github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
-github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
-github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
@@ -1075,15 +159,11 @@ github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7 h1:k2BbABz9+TNpYRwsCCF
github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM=
github.com/pingcap/tidb/parser v0.0.0-20221126021158-6b02a5d8ba7d h1:1DyyRrgYeNjqPkgjrdEsaIbX+kHpuTTk5ZOCtrcRFcQ=
github.com/pingcap/tidb/parser v0.0.0-20221126021158-6b02a5d8ba7d/go.mod h1:ElJiub4lRy6UZDb+0JHDkGEdr6aOli+ykhyej7VCLoI=
-github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
-github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -1092,11 +172,8 @@ github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R
github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
-github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
@@ -1104,29 +181,15 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2 h1:dq90+d51/hQRaHEqRAsQ1rE/pC1GUS4sc2rCbbFsAIY=
-github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
-github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
-github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo=
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
-github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM=
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
@@ -1137,83 +200,31 @@ github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKz
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM=
-github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w=
-github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
-github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
-github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
-github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
-github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
-github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
-github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
-github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
-github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
-github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
-github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU=
-github.com/timtadh/lexmachine v0.2.2/go.mod h1:GBJvD5OAfRn/gnp92zb9KTgHLB7akKyxmVivoYCcjQI=
github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
-github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
-github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
-github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
-github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xorm-io/builder v0.3.13 h1:J4oZxt4Gjgm/Si9iKazfzYwHB/ijEOD9EHInyjOSX+M=
github.com/xorm-io/builder v0.3.13/go.mod h1:24o5riRwzre2WvjmN+LM4YpUtJg7W8MdvJ8H57rvrJA=
github.com/xorm-io/core v0.7.4 h1:qIznlqqmYNEb03ewzRXCrNkbbxpkgc/44nVF8yoFV7Y=
github.com/xorm-io/core v0.7.4/go.mod h1:GueyhafDnkB0KK0fXX/dEhr/P1EAGW0GLmoNDUEE1Mo=
github.com/xorm-io/xorm v1.1.6 h1:s4fDpUXJx8Zr/PBovXNaadn+v1P3h/U3iV4OxAkWS8s=
github.com/xorm-io/xorm v1.1.6/go.mod h1:7nsSUdmgLIcqHSSaKOzbVQiZtzIzbpGf1GGSYp6DD70=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
-github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
-github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
-go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
@@ -1226,746 +237,87 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4=
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
-golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
-golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
-golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
-golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
-golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
-golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
-golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
-golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
-golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
-golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
-golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
-golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
-golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
-golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
-golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY=
golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
-golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
-golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
-golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww=
-golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
-golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
-golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
-golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
-golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
-golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
-golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
-golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
-golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8=
golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
-gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
-gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
-gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
-gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
-google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
-google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
-google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
-google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
-google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
-google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
-google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
-google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
-google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
-google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
-google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
-google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
-google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
-google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
-google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
-google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
-google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
-google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
-google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=
-google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
-google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
-google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=
-google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
-google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=
-google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
-google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
-google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=
-google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
-google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
-google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY=
-google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
-google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
-google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg=
-google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E=
-google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
-google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4=
-google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
-google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
-google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
-google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
-google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
-google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=
-google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=
-google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
-google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
-google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=
-google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
-google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
-google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=
-google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
-google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
-google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
-google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
-google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
-google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
-google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA=
-google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
-google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw=
-google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA=
-google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
-google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
-google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
-google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
-google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
-google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak=
-google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY=
-google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64=
-google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8=
-google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
-google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
-google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
-google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
-google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
-google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
-google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
-google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
-google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
-google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -1975,61 +327,35 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
-gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
-lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
-lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/cc/v3 v3.31.5-0.20210308123301-7a3e9dab9009/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878=
modernc.org/cc/v3 v3.36.0 h1:0kmRkTmqNidmu3c7BNDSdVHCxXCkWLmWmCIVX4LUboo=
modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
-modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
-modernc.org/cc/v3 v3.36.3 h1:uISP3F66UlixxWEcKuIWERa4TwrZENHSL8tWxZz8bHg=
-modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
modernc.org/ccgo/v3 v3.9.0/go.mod h1:nQbgkn8mwzPdp4mm6BT6+p85ugQ7FrGgIcYaE7nSrpY=
-modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
modernc.org/ccgo/v3 v3.16.8 h1:G0QNlTqI5uVgczBWfGKs7B++EPwCfXPWGD2MdeKloDs=
modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
-modernc.org/ccgo/v3 v3.16.9 h1:AXquSwg7GuMk11pIdw7fmO1Y/ybgazVkMhsZWCV0mHM=
-modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo=
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8=
@@ -2046,26 +372,16 @@ modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
modernc.org/libc v1.16.19 h1:S8flPn5ZeXx6iw/8yNa986hwTQDrY8RXU7tObZuAozo=
modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
-modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0=
-modernc.org/libc v1.17.1 h1:Q8/Cpi36V/QBfuQaFVeisEBs3WqoGAJprZzmf7TfEYI=
-modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s=
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8=
modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
-modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc=
modernc.org/memory v1.1.1 h1:bDOL0DIDLQv7bWhP3gMvIrnoFw+Eo6F7a2QK9HPDiFU=
modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
-modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
-modernc.org/memory v1.2.1 h1:dkRh86wgmq/bJu2cAS2oqBCz/KsMZU7TUM4CibQ7eBs=
-modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
-modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
-modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/parser v1.0.0/go.mod h1:H20AntYJ2cHHL6MHthJ8LZzXCdDCHMWt1KZXtIMjejA=
modernc.org/parser v1.0.2/go.mod h1:TXNq3HABP3HMaqLK7brD1fLA/LfN0KS6JxZn71QdDqs=
modernc.org/scanner v1.0.1/go.mod h1:OIzD2ZtjYk6yTuyqZr57FmifbM9fIH74SumloSsajuE=
@@ -2077,20 +393,11 @@ modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs
modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs=
modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
-modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
-modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
modernc.org/tcl v1.5.0/go.mod h1:gb57hj4pO8fRrK54zveIfFXBaMHK3SKJNWcmRw1cRzc=
modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao=
-modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/y v1.0.1/go.mod h1:Ho86I+LVHEI+LYXoUKlmOMAM1JTXOCfj8qi1T8PsClE=
modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM=
-modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
-rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/ip/17monipdb.dat b/ip/17monipdb.dat
deleted file mode 100644
index 3ea1398..0000000
Binary files a/ip/17monipdb.dat and /dev/null differ
diff --git a/ip/ip.go b/ip/ip.go
deleted file mode 100644
index 137c9bc..0000000
--- a/ip/ip.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package ip
-
-import (
- "fmt"
-
- "github.com/apache/casbin-gateway/embedsupport"
- "github.com/apache/casbin-gateway/util"
-)
-
-// ipDbPath is where the IP location database lives in the source tree.
-const ipDbPath = "ip/17monipdb.dat"
-
-// InitIpDb loads the IP location database used to tell abroad traffic apart
-// from Chinese traffic. The file on disk is used when it is there; a binary
-// built with -tags embed falls back to the copy baked into it.
-func InitIpDb() {
- if util.FileExist(ipDbPath) {
- err := Init(ipDbPath)
- if err != nil {
- panic(err)
- }
-
- return
- }
-
- data := embedsupport.IpDb()
- if len(data) == 0 {
- panic(fmt.Errorf("the IP location database \"%s\" is missing", ipDbPath))
- }
-
- InitWithData(data)
-}
-
-func IsAbroadIp(ip string) bool {
- // If it's an intranet IP, it's not abroad
- if util.IsIntranetIp(ip) {
- return false
- }
-
- info, err := Find(ip)
- if err != nil {
- fmt.Printf("error: ip = %s, error = %s\n", ip, err.Error())
- return false
- }
-
- return info.Country != "中国"
-}
diff --git a/ip/ip17mon.go b/ip/ip17mon.go
deleted file mode 100644
index 7405f33..0000000
--- a/ip/ip17mon.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2022 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package ip
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "io/ioutil"
- "net"
-)
-
-const Null = "N/A"
-
-var (
- ErrInvalidIp = errors.New("invalid ip format")
- std *Locator
-)
-
-// Init default locator with dataFile
-func Init(dataFile string) (err error) {
- if std != nil {
- return
- }
- std, err = NewLocator(dataFile)
- return
-}
-
-// Init default locator with data
-func InitWithData(data []byte) {
- if std != nil {
- return
- }
- std = NewLocatorWithData(data)
- return
-}
-
-// Find locationInfo by ip string
-// It will return err when ipstr is not a valid format
-func Find(ipstr string) (*LocationInfo, error) {
- return std.Find(ipstr)
-}
-
-// Find locationInfo by uint32
-func FindByUint(ip uint32) *LocationInfo {
- return std.FindByUint(ip)
-}
-
-//-----------------------------------------------------------------------------
-
-// New locator with dataFile
-func NewLocator(dataFile string) (loc *Locator, err error) {
- data, err := ioutil.ReadFile(dataFile)
- if err != nil {
- return
- }
- loc = NewLocatorWithData(data)
- return
-}
-
-// New locator with data
-func NewLocatorWithData(data []byte) (loc *Locator) {
- loc = new(Locator)
- loc.init(data)
- return
-}
-
-type Locator struct {
- textData []byte
- indexData1 []uint32
- indexData2 []int
- indexData3 []int
- index []int
-}
-
-type LocationInfo struct {
- Country string
- Region string
- City string
- Isp string
-}
-
-// Find locationInfo by ip string
-// It will return err when ipstr is not a valid format
-func (loc *Locator) Find(ipstr string) (info *LocationInfo, err error) {
- ip := net.ParseIP(ipstr).To4()
- if ip == nil || ip.To4() == nil {
- err = ErrInvalidIp
- return
- }
- info = loc.FindByUint(binary.BigEndian.Uint32([]byte(ip)))
- return
-}
-
-// Find locationInfo by uint32
-func (loc *Locator) FindByUint(ip uint32) (info *LocationInfo) {
- end := len(loc.indexData1) - 1
- if ip>>24 != 0xff {
- end = loc.index[(ip>>24)+1]
- }
- idx := loc.findIndexOffset(ip, loc.index[ip>>24], end)
- off := loc.indexData2[idx]
- return newLocationInfo(loc.textData[off : off+loc.indexData3[idx]])
-}
-
-// binary search
-func (loc *Locator) findIndexOffset(ip uint32, start, end int) int {
- for start < end {
- mid := (start + end) / 2
- if ip > loc.indexData1[mid] {
- start = mid + 1
- } else {
- end = mid
- }
- }
-
- if loc.indexData1[end] >= ip {
- return end
- }
-
- return start
-}
-
-func (loc *Locator) init(data []byte) {
- textoff := int(binary.BigEndian.Uint32(data[:4]))
-
- loc.textData = data[textoff-1024:]
-
- loc.index = make([]int, 256)
- for i := 0; i < 256; i++ {
- off := 4 + i*4
- loc.index[i] = int(binary.LittleEndian.Uint32(data[off : off+4]))
- }
-
- nidx := (textoff - 4 - 1024 - 1024) / 8
-
- loc.indexData1 = make([]uint32, nidx)
- loc.indexData2 = make([]int, nidx)
- loc.indexData3 = make([]int, nidx)
-
- for i := 0; i < nidx; i++ {
- off := 4 + 1024 + i*8
- loc.indexData1[i] = binary.BigEndian.Uint32(data[off : off+4])
- loc.indexData2[i] = int(uint32(data[off+4]) | uint32(data[off+5])<<8 | uint32(data[off+6])<<16)
- loc.indexData3[i] = int(data[off+7])
- }
- return
-}
-
-func newLocationInfo(str []byte) *LocationInfo {
-
- var info *LocationInfo
-
- fields := bytes.Split(str, []byte("\t"))
- switch len(fields) {
- case 4:
- // free version
- info = &LocationInfo{
- Country: string(fields[0]),
- Region: string(fields[1]),
- City: string(fields[2]),
- }
- case 5:
- // pay version
- info = &LocationInfo{
- Country: string(fields[0]),
- Region: string(fields[1]),
- City: string(fields[2]),
- Isp: string(fields[4]),
- }
- default:
- panic("unexpected ip info:" + string(str))
- }
-
- if len(info.Country) == 0 {
- info.Country = Null
- }
- if len(info.Region) == 0 {
- info.Region = Null
- }
- if len(info.City) == 0 {
- info.City = Null
- }
- if len(info.Isp) == 0 {
- info.Isp = Null
- }
- return info
-}
diff --git a/main.go b/main.go
index 72cd03b..080a8ad 100644
--- a/main.go
+++ b/main.go
@@ -25,12 +25,10 @@ import (
"github.com/apache/casbin-gateway/agentpatch"
"github.com/apache/casbin-gateway/casdoor"
"github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/ip"
"github.com/apache/casbin-gateway/mcpserver"
"github.com/apache/casbin-gateway/object"
"github.com/apache/casbin-gateway/proxy"
"github.com/apache/casbin-gateway/routers"
- "github.com/apache/casbin-gateway/run"
"github.com/apache/casbin-gateway/service"
"github.com/apache/casbin-gateway/util"
"github.com/apache/casbin-gateway/version"
@@ -77,12 +75,6 @@ func main() {
casdoor.InitCasdoorConfig()
object.InitUsers()
proxy.InitHttpClient()
- ip.InitIpDb()
- object.InitSiteMap()
- object.InitRuleMap()
- run.InitAppMap()
- run.InitRdsClient()
- object.StartMonitorSitesLoop()
agentmonitor.Configure(
conf.GetAgentPatchStateDir(),
@@ -135,46 +127,28 @@ func main() {
port := conf.GetHttpPort()
addr := conf.GetHttpAddr()
- // A previous Gateway still holding one of these ports would keep this one
- // from starting, so it is stopped first. The gateway ports come before the
- // management port because service.Start() binds them first.
- stopPorts := []int{}
- if conf.IsGatewayEnabled() {
- stopPorts = append(stopPorts, conf.GetGatewayHttpPort(), conf.GetGatewayHttpsPort())
- }
- stopPorts = append(stopPorts, port)
- for _, stopPort := range stopPorts {
- err := util.StopOldInstance(stopPort)
- if err == nil {
- continue
- }
-
- // A port held by something that is not Gateway stays with it. Saying so
- // here would only precede the bind below, which reports the same
- // conflict along with the remedy for that particular port.
+ // A previous Gateway still holding the management port would keep this one
+ // from starting, so it is stopped first.
+ err := util.StopOldInstance(port)
+ if err != nil {
+ // A port held by something that is not Gateway stays with it; the bind
+ // below reports the conflict in full, so a failed kill only needs a note.
var foreign *util.ForeignPortError
- if errors.As(err, &foreign) {
- continue
+ if !errors.As(err, &foreign) {
+ fmt.Printf("Casbin Gateway: could not free port %d: %v\n", port, err)
}
-
- // The bind below reports the conflict in full, so a failed kill only
- // needs a note here and never stops the startup by itself.
- fmt.Printf("Casbin Gateway: could not free port %d: %v\n", stopPort, err)
}
service.PrintStartupSummary()
// beego.Run() binds the management port itself and reports a conflict as a
- // stack trace, so the port is probed here first to explain it in one line,
- // and before the gateway below binds anything. The gap between probe and
- // bind is unavoidable but harmless: losing the race just puts us back to
- // beego's own error.
+ // stack trace, so the port is probed here first to explain it in one line.
+ // The gap between probe and bind is unavoidable but harmless: losing the
+ // race just puts us back to beego's own error.
if err := util.CheckPortAvailableOn(addr, port); err != nil {
util.FatalListenError(port, `change "httpport" in conf/app.conf`, err)
}
- service.Start()
-
// The agent endpoint of a sandboxed agent names this host's own address, and
// the configuration naming it outlives this process.
if err := service.SyncLanAccess(); err != nil {
diff --git a/object/cert.go b/object/cert.go
deleted file mode 100644
index a118e68..0000000
--- a/object/cert.go
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "time"
-
- "github.com/apache/casbin-gateway/certificate"
- "github.com/apache/casbin-gateway/util"
- "github.com/xorm-io/core"
-)
-
-type Cert struct {
- Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
- Name string `xorm:"varchar(100) notnull pk" json:"name"`
- CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
- DisplayName string `xorm:"varchar(100)" json:"displayName"`
-
- Type string `xorm:"varchar(100)" json:"type"`
- CryptoAlgorithm string `xorm:"varchar(100)" json:"cryptoAlgorithm"`
- ExpireTime string `xorm:"varchar(100)" json:"expireTime"`
- DomainExpireTime string `xorm:"varchar(100)" json:"domainExpireTime"`
-
- Provider string `xorm:"varchar(100)" json:"provider"`
- Account string `xorm:"varchar(100)" json:"account"`
- AccessKey string `xorm:"varchar(100)" json:"accessKey"`
- AccessSecret string `xorm:"varchar(100)" json:"accessSecret"`
-
- Certificate string `xorm:"mediumtext" json:"certificate"`
- PrivateKey string `xorm:"mediumtext" json:"privateKey"`
-}
-
-func GetGlobalCerts() ([]*Cert, error) {
- certs := []*Cert{}
- err := ormer.Engine.Asc("owner").Desc("created_time").Find(&certs)
- return certs, err
-}
-
-func GetCerts(owner string) ([]*Cert, error) {
- certs := []*Cert{}
- err := ormer.Engine.Desc("created_time").Find(&certs, &Cert{Owner: owner})
- if err != nil {
- return nil, err
- }
-
- for _, cert := range certs {
- if cert.Certificate != "" && cert.ExpireTime == "" {
- cert.ExpireTime, err = getCertExpireTime(cert.Certificate)
- if err != nil {
- return nil, err
- }
-
- _, err = UpdateCert(cert.GetId(), cert)
- if err != nil {
- return nil, err
- }
- }
- }
-
- return certs, nil
-}
-
-func getCert(owner string, name string) (*Cert, error) {
- cert := Cert{Owner: owner, Name: name}
- existed, err := ormer.Engine.Get(&cert)
- if err != nil {
- return nil, err
- }
-
- if existed {
- return &cert, nil
- } else {
- return nil, nil
- }
-}
-
-func GetCert(id string) (*Cert, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- return getCert(owner, name)
-}
-
-func GetMaskedCert(cert *Cert) *Cert {
- if cert == nil {
- return nil
- }
-
- if cert.AccessSecret != "" {
- cert.AccessSecret = "***"
- }
-
- return cert
-}
-
-func GetMaskedCerts(certs []*Cert) []*Cert {
- for _, cert := range certs {
- cert = GetMaskedCert(cert)
- }
- return certs
-}
-
-func UpdateCert(id string, cert *Cert) (bool, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- if c, err := getCert(owner, name); err != nil || c == nil {
- return false, err
- }
-
- if cert.Certificate != "" {
- expireTime, err := getCertExpireTime(cert.Certificate)
- if err != nil {
- return false, err
- }
-
- cert.ExpireTime = expireTime
- } else {
- cert.ExpireTime = ""
- }
-
- _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(cert)
- if err != nil {
- return false, err
- }
-
- return true, nil
-}
-
-func AddCert(cert *Cert) (bool, error) {
- affected, err := ormer.Engine.Insert(cert)
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func DeleteCert(cert *Cert) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{cert.Owner, cert.Name}).Delete(&Cert{})
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func (cert *Cert) GetId() string {
- return fmt.Sprintf("%s/%s", cert.Owner, cert.Name)
-}
-
-func RenewCert(cert *Cert) (bool, error) {
- useProxy := true
- if cert.Provider == "GoDaddy" {
- useProxy = true
- }
-
- client, err := GetAcmeClient(useProxy)
- if err != nil {
- return false, err
- }
-
- var certStr, privateKey string
- if cert.Provider == "Aliyun" {
- certStr, privateKey = certificate.ObtainCertificateAli(client, cert.Name, cert.AccessKey, cert.AccessSecret)
- } else if cert.Provider == "GoDaddy" {
- certStr, privateKey = certificate.ObtainCertificateGoDaddy(client, cert.Name, cert.AccessKey, cert.AccessSecret)
- } else {
- return false, fmt.Errorf("unknown provider: %s", cert.Provider)
- }
-
- expireTime, err := getCertExpireTime(certStr)
- if err != nil {
- return false, err
- }
-
- cert.ExpireTime = expireTime
- cert.Certificate = certStr
- cert.PrivateKey = privateKey
-
- return UpdateCert(cert.GetId(), cert)
-}
-
-func (cert *Cert) isCertNearExpire() (bool, error) {
- if cert.ExpireTime == "" {
- return true, nil
- }
-
- expireTime, err := time.Parse(time.RFC3339, cert.ExpireTime)
- if err != nil {
- return false, err
- }
-
- now := time.Now()
- duration := expireTime.Sub(now)
- res := duration <= 7*24*time.Hour
-
- return res, nil
-}
-
-func GetCertCount(owner, field, value string) (int64, error) {
- session := GetSession(owner, -1, -1, field, value, "", "")
- return session.Count(&Cert{})
-}
-
-func GetPaginationCerts(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Cert, error) {
- certs := []*Cert{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Where("owner = ? or owner = ?", "admin", owner).Find(&certs)
- if err != nil {
- return certs, err
- }
-
- return certs, nil
-}
diff --git a/object/cert_test.go b/object/cert_test.go
deleted file mode 100644
index f63b813..0000000
--- a/object/cert_test.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package object
-
-import (
- "fmt"
- "testing"
-
- "github.com/apache/casbin-gateway/casdoor"
- "github.com/apache/casbin-gateway/proxy"
- "github.com/apache/casbin-gateway/util"
-)
-
-func TestGetCertExpireTime(t *testing.T) {
- InitConfig()
-
- cert, err := getCert("admin", "casbin.com")
- if err != nil {
- panic(err)
- }
-
- expireTime, err := getCertExpireTime(cert.Certificate)
- if err != nil {
- panic(err)
- }
-
- println(expireTime)
-}
-
-func TestRenewCert(t *testing.T) {
- InitConfig()
- proxy.InitHttpClient()
-
- cert, err := GetCert("admin/cert")
- if err != nil {
- panic(err)
- }
-
- res, err := RenewCert(cert)
- if err != nil {
- panic(err)
- }
-
- fmt.Printf("Renewed cert: [%s] to [%s], res = %v\n", cert.Name, cert.ExpireTime, res)
-}
-
-func TestRenewAllCerts(t *testing.T) {
- InitConfig()
- proxy.InitHttpClient()
-
- certs, err := GetCerts("admin")
- if err != nil {
- panic(err)
- }
-
- filteredCerts := []*Cert{}
- for _, cert := range certs {
- if cert.Owner != "admin" || cert.Provider == "" {
- continue
- }
-
- if cert.Provider == "GoDaddy" {
- continue
- }
-
- var nearExpire bool
- nearExpire, err = cert.isCertNearExpire()
- if err != nil {
- panic(err)
- }
- if !nearExpire {
- continue
- }
-
- filteredCerts = append(filteredCerts, cert)
- }
-
- for i, cert := range filteredCerts {
- if cert.Owner != "admin" || cert.Provider == "" {
- continue
- }
-
- if cert.Provider == "GoDaddy" {
- continue
- }
-
- var nearExpire bool
- nearExpire, err = cert.isCertNearExpire()
- if err != nil {
- panic(err)
- }
- if !nearExpire {
- continue
- }
-
- var res bool
- res, err = RenewCert(cert)
- if err != nil {
- panic(err)
- }
-
- fmt.Printf("[%d/%d] Renewed cert: [%s] to [%s], res = %v\n", i+1, len(filteredCerts), cert.Name, cert.ExpireTime, res)
- }
-}
-
-func TestApplyAllCerts(t *testing.T) {
- InitConfig()
-
- baseDir := "F:/github_repos/nginx/conf/ssl"
- certs, err := GetCerts("admin")
- if err != nil {
- panic(err)
- }
-
- for _, cert := range certs {
- if cert.Certificate == "" || cert.PrivateKey == "" {
- continue
- }
-
- util.WriteStringToPath(cert.Certificate, fmt.Sprintf("%s/%s.pem", baseDir, cert.Name))
- util.WriteStringToPath(cert.PrivateKey, fmt.Sprintf("%s/%s.key", baseDir, cert.Name))
- }
-}
-
-func TestCheckCerts(t *testing.T) {
- InitConfig()
- casdoor.InitCasdoorConfig()
- proxy.InitHttpClient()
-
- var err error
- certMap, err = getCertMap()
- if err != nil {
- panic(err)
- }
-
- site, err := getSite("admin", "test-site")
- if err != nil {
- panic(err)
- }
- if site == nil {
- panic("site should not be nil")
- }
-
- err = site.checkCerts()
- if err != nil {
- panic(err)
- }
-}
diff --git a/object/cert_util.go b/object/cert_util.go
deleted file mode 100644
index a43dffc..0000000
--- a/object/cert_util.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "crypto/x509"
- "encoding/pem"
- "errors"
- "fmt"
- "time"
-)
-
-func getCertExpireTime(s string) (string, error) {
- block, _ := pem.Decode([]byte(s))
- if block == nil {
- return "", errors.New("getCertExpireTime() error, block should not be nil")
- } else if block.Type != "CERTIFICATE" {
- return "", errors.New(fmt.Sprintf("getCertExpireTime() error, block.Type should be \"CERTIFICATE\" instead of %s", block.Type))
- }
-
- certificate, err := x509.ParseCertificate(block.Bytes)
- if err != nil {
- return "", err
- }
-
- t := certificate.NotAfter
- return t.Local().Format(time.RFC3339), nil
-}
diff --git a/object/cert_whois.go b/object/cert_whois.go
deleted file mode 100644
index 85c678a..0000000
--- a/object/cert_whois.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "strings"
- "time"
-
- "github.com/likexian/whois"
- whoisparser "github.com/likexian/whois-parser"
-)
-
-func getDomainExpireTime(domainName string) (string, error) {
- domainName, err := getBaseDomain(domainName)
- if err != nil {
- return "", err
- }
-
- server := ""
- if strings.HasSuffix(domainName, ".com") || strings.HasSuffix(domainName, ".net") {
- server = "whois.verisign-grs.com"
- } else if strings.HasSuffix(domainName, ".org") {
- server = "whois.pir.org"
- } else if strings.HasSuffix(domainName, ".io") {
- server = "whois.nic.io"
- } else if strings.HasSuffix(domainName, ".co") {
- server = "whois.nic.co"
- } else if strings.HasSuffix(domainName, ".cn") {
- server = "whois.cnnic.cn"
- } else if strings.HasSuffix(domainName, ".run") {
- server = "whois.nic.run"
- } else {
- server = "grs-whois.hichina.com" // com, net, cc, tv
- //return "", fmt.Errorf("unsupported suffix for domain: %s", domainName)
- }
-
- client := whois.NewClient()
-
- data, err := client.Whois(domainName, server)
- if err != nil {
- if !strings.HasSuffix(domainName, ".run") || data == "" {
- return "", err
- }
- }
-
- whoisInfo, err := whoisparser.Parse(data)
- if err != nil {
- return "", err
- }
-
- res := whoisInfo.Domain.ExpirationDateInTime.Local().Format(time.RFC3339)
- return res, nil
-}
-
-func GetDomainExpireTime(domainName string) (string, error) {
- return getDomainExpireTime(domainName)
-}
diff --git a/object/cert_whois_test.go b/object/cert_whois_test.go
deleted file mode 100644
index 734254f..0000000
--- a/object/cert_whois_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package object
-
-import (
- "fmt"
- "testing"
-)
-
-func TestUpdateDomainExpireTime(t *testing.T) {
- InitConfig()
-
- certs, err := GetCerts("admin")
- if err != nil {
- panic(err)
- }
-
- for i, cert := range certs {
- certExpireTime, err := getDomainExpireTime(cert.Name)
- if err != nil {
- panic(err)
- }
-
- if cert.DomainExpireTime == certExpireTime {
- continue
- }
-
- cert.DomainExpireTime = certExpireTime
-
- res, err := UpdateCert(cert.GetId(), cert)
- if err != nil {
- panic(err)
- }
-
- fmt.Printf("[%d/%d] Refreshed cert [%s]'s domain expire time: [%s], res = %v\n", i+1, len(certs), cert.Name, cert.DomainExpireTime, res)
- }
-}
diff --git a/object/node.go b/object/node.go
deleted file mode 100644
index 23da514..0000000
--- a/object/node.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2025 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "time"
-
- "github.com/apache/casbin-gateway/util"
- "github.com/xorm-io/core"
-)
-
-type Node struct {
- Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
- Name string `xorm:"varchar(100) notnull pk" json:"name"`
- CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
- DisplayName string `xorm:"varchar(100)" json:"displayName"`
-
- Tag string `xorm:"varchar(100)" json:"tag"`
- ClientIp string `xorm:"varchar(100)" json:"clientIp"`
- UpgradeMode string `xorm:"varchar(100)" json:"upgradeMode"`
-}
-
-func GetGlobalNodes() ([]*Node, error) {
- nodes := []*Node{}
- err := ormer.Engine.Asc("owner").Desc("created_time").Find(&nodes)
- return nodes, err
-}
-
-func GetNodes(owner string) ([]*Node, error) {
- nodes := []*Node{}
- err := ormer.Engine.Asc("tag").Desc("created_time").Find(&nodes, &Node{Owner: owner})
- if err != nil {
- return nil, err
- }
-
- return nodes, nil
-}
-
-func getNode(owner string, name string) (*Node, error) {
- node := Node{Owner: owner, Name: name}
- existed, err := ormer.Engine.Get(&node)
- if err != nil {
- return nil, err
- }
-
- if existed {
- return &node, nil
- }
- return nil, nil
-}
-
-func GetNode(id string) (*Node, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- return getNode(owner, name)
-}
-
-func UpdateNode(id string, node *Node) (bool, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- if n, err := getNode(owner, name); err != nil {
- return false, err
- } else if n == nil {
- return false, nil
- }
-
- _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(node)
- if err != nil {
- return false, err
- }
-
- return true, nil
-}
-
-func AddNode(node *Node) (bool, error) {
- affected, err := ormer.Engine.Insert(node)
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func DeleteNode(node *Node) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{node.Owner, node.Name}).Delete(&Node{})
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func (node *Node) GetId() string {
- return fmt.Sprintf("%s/%s", node.Owner, node.Name)
-}
-
-func GetNodeCount(owner, field, value string) (int64, error) {
- session := GetSession(owner, -1, -1, field, value, "", "")
- return session.Count(&Node{})
-}
-
-func GetPaginationNodes(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Node, error) {
- nodes := []*Node{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Where("owner = ? or owner = ?", "admin", owner).Find(&nodes)
- if err != nil {
- return nodes, err
- }
-
- return nodes, nil
-}
-
-// ShouldAllowUpgrade checks if upgrade is allowed based on node's upgrade mode
-func (node *Node) ShouldAllowUpgrade() bool {
- if node.UpgradeMode == "" || node.UpgradeMode == "At Any Time" {
- return true
- }
-
- if node.UpgradeMode == "No Upgrade" {
- return false
- }
-
- if node.UpgradeMode == "Half A Hour" {
- // Check if current time is in the 23:00-23:30 GMT+8 window
- // GMT+8 is 8 hours ahead of UTC
- location := time.FixedZone("GMT+8", 8*60*60)
- now := time.Now().In(location)
-
- hour := now.Hour()
- minute := now.Minute()
-
- // Allow upgrade if time is between 23:00 and 23:30
- if hour == 23 && minute < 30 {
- return true
- }
- return false
- }
-
- // Default to allowing upgrade for unknown modes
- return true
-}
diff --git a/object/ormer.go b/object/ormer.go
index 02c4f06..633fbd1 100644
--- a/object/ormer.go
+++ b/object/ormer.go
@@ -246,13 +246,8 @@ func (a *Ormer) createTable() {
showSql := conf.GetConfigBool("showSql")
a.Engine.ShowSQL(showSql)
- err := a.Engine.Sync2(new(Node))
- if err != nil {
- panic(err)
- }
-
// The settings the web UI can change, held in one built-in row.
- err = a.Engine.Sync2(new(Setting))
+ err := a.Engine.Sync2(new(Setting))
if err != nil {
panic(err)
}
@@ -263,26 +258,6 @@ func (a *Ormer) createTable() {
panic(err)
}
- err = a.Engine.Sync2(new(Site))
- if err != nil {
- panic(err)
- }
-
- err = a.Engine.Sync2(new(Cert))
- if err != nil {
- panic(err)
- }
-
- err = a.Engine.Sync2(new(Record))
- if err != nil {
- panic(err)
- }
-
- err = a.Engine.Sync2(new(Rule))
- if err != nil {
- panic(err)
- }
-
// Register Provider table for LLM gateway milestone 1.1.
err = a.Engine.Sync2(new(Provider))
if err != nil {
diff --git a/object/record.go b/object/record.go
deleted file mode 100644
index 1f7ba58..0000000
--- a/object/record.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "strconv"
- "time"
-
- "github.com/apache/casbin-gateway/util"
- "github.com/xorm-io/core"
-)
-
-type Record struct {
- Id int64 `xorm:"int notnull pk autoincr" json:"id"`
- Owner string `xorm:"varchar(100) notnull" json:"owner"`
- CreatedTime string `xorm:"varchar(100) notnull" json:"createdTime"`
-
- Method string `xorm:"varchar(100)" json:"method"`
- Host string `xorm:"varchar(100)" json:"host"`
- Path string `xorm:"varchar(100)" json:"path"`
- ClientIp string `xorm:"varchar(100)" json:"clientIp"`
- UserAgent string `xorm:"varchar(512)" json:"userAgent"`
-}
-
-func GetRecords(owner string) ([]*Record, error) {
- records := []*Record{}
- err := ormer.Engine.Asc("id").Asc("host").Find(&records, &Record{Owner: owner})
- if err != nil {
- return nil, err
- }
-
- return records, nil
-}
-
-func AddRecord(record *Record) (bool, error) {
- affected, err := ormer.Engine.Insert(record)
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func DeleteRecord(record *Record) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{record.Id}).Delete(&Record{})
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func UpdateRecord(owner string, id string, record *Record) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{record.Id}).AllCols().Update(record)
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func GetRecord(owner string, id string) (*Record, error) {
- idNum, err := strconv.Atoi(id)
- if err != nil {
- return nil, err
- }
-
- record, err := getRecord(owner, int64(idNum))
- if err != nil {
- return nil, err
- }
-
- return record, nil
-}
-
-func getRecord(owner string, id int64) (*Record, error) {
- record := Record{Owner: owner, Id: id}
- existed, err := ormer.Engine.Get(&record)
- if err != nil {
- return nil, err
- }
-
- if existed {
- return &record, nil
- }
- return nil, nil
-}
-
-type DataCount struct {
- Data string `json:"data"`
- Count int64 `json:"count"`
-}
-
-func GetMetrics(dataType string, startAt time.Time, top int) (*[]DataCount, error) {
- var dataCounts []DataCount
- err := ormer.Engine.Table("record").
- Where("created_time > ?", util.FormatTime(startAt)).
- Select(dataType + " as data, COUNT(*) as count").
- GroupBy(dataType).
- Desc("count").
- Limit(top).
- Find(&dataCounts)
- if err != nil {
- return nil, err
- }
- return &dataCounts, nil
-}
-
-func GetMetricsOverTime(startAt time.Time, timeType string) (*[]DataCount, error) {
- var dataCounts []DataCount
- createdTime := getCreatedTimeBucket(ormer.driverName, timeType)
- err := ormer.Engine.Table("record").
- Where("created_time > ?", util.FormatTime(startAt)).
- GroupBy(createdTime).
- Select(createdTime + " as data, COUNT(*) as count").
- Asc("data").
- Find(&dataCounts)
- if err != nil {
- return nil, err
- }
- return &dataCounts, nil
-}
-
-func getCreatedTimeBucket(driverName string, timeType string) string {
- length := 13
- switch timeType {
- case "day":
- length = 10
- case "month":
- length = 7
- }
-
- substr := "SUBSTR"
- if driverName == "mssql" {
- substr = "SUBSTRING"
- }
-
- return fmt.Sprintf("REPLACE(%s(created_time, 1, %d), 'T', ' ')", substr, length)
-}
-
-func GetRecordCount(owner, field, value string) (int64, error) {
- session := GetSession(owner, -1, -1, field, value, "", "")
- return session.Count(&Record{})
-}
-
-func GetPaginationRecords(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Record, error) {
- records := []*Record{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Where("owner = ? or owner = ?", "admin", owner).Find(&records)
- if err != nil {
- return records, err
- }
-
- return records, nil
-}
diff --git a/object/rule.go b/object/rule.go
deleted file mode 100644
index b0fff5e..0000000
--- a/object/rule.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
-
- "github.com/apache/casbin-gateway/util"
- "github.com/xorm-io/core"
-)
-
-type Expression struct {
- Name string `json:"name"`
- Operator string `json:"operator"`
- Value string `json:"value"`
-}
-
-type Rule struct {
- Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
- Name string `xorm:"varchar(100) notnull pk" json:"name"`
- CreatedTime string `xorm:"varchar(100) notnull" json:"createdTime"`
- UpdatedTime string `xorm:"varchar(100) notnull" json:"updatedTime"`
-
- Type string `xorm:"varchar(100) notnull" json:"type"`
- Expressions []*Expression `xorm:"mediumtext" json:"expressions"`
- Action string `xorm:"varchar(100) notnull" json:"action"`
- StatusCode int `xorm:"int notnull" json:"statusCode"`
- Reason string `xorm:"varchar(100) notnull" json:"reason"`
- IsVerbose bool `xorm:"bool" json:"isVerbose"`
-}
-
-func GetGlobalRules() ([]*Rule, error) {
- rules := []*Rule{}
- err := ormer.Engine.Asc("owner").Desc("created_time").Find(&rules)
- return rules, err
-}
-
-func GetRules(owner string) ([]*Rule, error) {
- rules := []*Rule{}
- err := ormer.Engine.Desc("updated_time").Find(&rules, &Rule{Owner: owner})
- return rules, err
-}
-
-func getRule(owner string, name string) (*Rule, error) {
- rule := Rule{Owner: owner, Name: name}
- existed, err := ormer.Engine.Get(&rule)
- if err != nil {
- return nil, err
- }
- if existed {
- return &rule, nil
- } else {
- return nil, nil
- }
-}
-
-func GetRule(id string) (*Rule, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- return getRule(owner, name)
-}
-
-func UpdateRule(id string, rule *Rule) (bool, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- if s, err := getRule(owner, name); err != nil {
- return false, err
- } else if s == nil {
- return false, nil
- }
- rule.UpdatedTime = util.GetCurrentTime()
- _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(rule)
- if err != nil {
- return false, err
- }
- err = refreshRuleMap()
- if err != nil {
- return false, err
- }
- return true, nil
-}
-
-func AddRule(rule *Rule) (bool, error) {
- affected, err := ormer.Engine.Insert(rule)
- if err != nil {
- return false, err
- }
- if affected != 0 {
- err = refreshRuleMap()
- if err != nil {
- return false, err
- }
- }
- return affected != 0, nil
-}
-
-func DeleteRule(rule *Rule) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{rule.Owner, rule.Name}).Delete(&Rule{})
- if err != nil {
- return false, err
- }
-
- return affected != 0, nil
-}
-
-func (rule *Rule) GetId() string {
- return fmt.Sprintf("%s/%s", rule.Owner, rule.Name)
-}
-
-func GetRuleCount(owner, field, value string) (int64, error) {
- session := GetSession(owner, -1, -1, field, value, "", "")
- return session.Count(&Rule{})
-}
-
-func GetPaginationRules(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Rule, error) {
- rules := []*Rule{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Where("owner = ? or owner = ?", "admin", owner).Find(&rules)
- if err != nil {
- return rules, err
- }
-
- return rules, nil
-}
diff --git a/object/rule_cache.go b/object/rule_cache.go
deleted file mode 100644
index b36d8b9..0000000
--- a/object/rule_cache.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
-
- "github.com/apache/casbin-gateway/util"
-)
-
-var ruleMap = map[string]*Rule{}
-
-func InitRuleMap() {
- err := refreshRuleMap()
- if err != nil {
- panic(err)
- }
-}
-
-func refreshRuleMap() error {
- newRuleMap := map[string]*Rule{}
- rules, err := GetGlobalRules()
- if err != nil {
- return err
- }
-
- for _, rule := range rules {
- newRuleMap[util.GetIdFromOwnerAndName(rule.Owner, rule.Name)] = rule
- }
-
- ruleMap = newRuleMap
- return nil
-}
-
-func GetRulesByRuleIds(ids []string) ([]*Rule, error) {
- var res []*Rule
- for _, id := range ids {
- rule, ok := ruleMap[id]
- if !ok {
- return nil, fmt.Errorf("rule: %s not found", id)
- }
- res = append(res, rule)
- }
- return res, nil
-}
diff --git a/object/setting.go b/object/setting.go
index 0d79005..3df85a4 100644
--- a/object/setting.go
+++ b/object/setting.go
@@ -33,10 +33,6 @@ type Setting struct {
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"`
- GatewayEnabled bool `xorm:"bool" json:"gatewayEnabled"`
- GatewayHttpPort int `xorm:"int" json:"gatewayHttpPort"`
- GatewayHttpsPort int `xorm:"int" json:"gatewayHttpsPort"`
-
LlmRecordMode string `xorm:"varchar(100)" json:"llmRecordMode"`
LlmRecordQueueCapacity int `xorm:"int" json:"llmRecordQueueCapacity"`
LlmRecordRetentionDays int `xorm:"int" json:"llmRecordRetentionDays"`
@@ -59,22 +55,7 @@ type Setting struct {
// first start; clearing it on the Settings page issues a new one.
RelayToken string `xorm:"varchar(200)" json:"relayToken"`
- HttpProxy string `xorm:"varchar(200)" json:"httpProxy"`
- AcmeEmail string `xorm:"varchar(200)" json:"acmeEmail"`
- AcmePrivateKey string `xorm:"mediumtext" json:"acmePrivateKey"`
-
- AppDir string `xorm:"varchar(500)" json:"appDir"`
- Language string `xorm:"varchar(100)" json:"language"`
- AppMap string `xorm:"varchar(1000)" json:"appMap"`
- ClientIdPrefix string `xorm:"varchar(100)" json:"clientIdPrefix"`
- ClientSecretPrefix string `xorm:"varchar(100)" json:"clientSecretPrefix"`
- DbRegionId string `xorm:"varchar(100)" json:"dbRegionId"`
- DbAccessKeyId string `xorm:"varchar(200)" json:"dbAccessKeyId"`
- DbAccessKeySecret string `xorm:"varchar(200)" json:"dbAccessKeySecret"`
- DbInstanceId string `xorm:"varchar(100)" json:"dbInstanceId"`
- DbHost string `xorm:"varchar(200)" json:"dbHost"`
- DbUser string `xorm:"varchar(100)" json:"dbUser"`
- DbPass string `xorm:"varchar(200)" json:"dbPass"`
+ HttpProxy string `xorm:"varchar(200)" json:"httpProxy"`
}
// SyncSettingToConf makes the row the answer conf.GetConfigString() gives, so
@@ -85,10 +66,6 @@ type Setting struct {
// take the Settings page that turns it off down with it.
func SyncSettingToConf(setting *Setting) {
conf.SetSettingOverrides(map[string]string{
- "gatewayEnabled": strconv.FormatBool(setting.GatewayEnabled),
- "gatewayHttpPort": strconv.Itoa(setting.GatewayHttpPort),
- "gatewayHttpsPort": strconv.Itoa(setting.GatewayHttpsPort),
-
"llmRecordMode": setting.LlmRecordMode,
"llmRecordQueueCapacity": strconv.Itoa(setting.LlmRecordQueueCapacity),
"llmRecordRetentionDays": strconv.Itoa(setting.LlmRecordRetentionDays),
@@ -109,22 +86,7 @@ func SyncSettingToConf(setting *Setting) {
"apiKeyEncryptionKey": setting.ApiKeyEncryptionKey,
"relayToken": setting.RelayToken,
- "httpProxy": setting.HttpProxy,
- "acmeEmail": setting.AcmeEmail,
- "acmePrivateKey": setting.AcmePrivateKey,
-
- "appDir": setting.AppDir,
- "language": setting.Language,
- "appMap": setting.AppMap,
- "clientIdPrefix": setting.ClientIdPrefix,
- "clientSecretPrefix": setting.ClientSecretPrefix,
- "dbRegionId": setting.DbRegionId,
- "dbAccessKeyId": setting.DbAccessKeyId,
- "dbAccessKeySecret": setting.DbAccessKeySecret,
- "dbInstanceId": setting.DbInstanceId,
- "dbHost": setting.DbHost,
- "dbUser": setting.DbUser,
- "dbPass": setting.DbPass,
+ "httpProxy": setting.HttpProxy,
})
}
@@ -220,10 +182,6 @@ func newSettingFromConf() *Setting {
CreatedTime: util.GetCurrentTime(),
DisplayName: "Built-in Setting",
- GatewayEnabled: conf.IsGatewayEnabled(),
- GatewayHttpPort: conf.GetGatewayHttpPort(),
- GatewayHttpsPort: conf.GetGatewayHttpsPort(),
-
LlmRecordMode: conf.GetLlmRecordMode(),
LlmRecordQueueCapacity: conf.GetLlmRecordQueueCapacity(),
LlmRecordRetentionDays: conf.GetLlmRecordRetentionDays(),
@@ -244,21 +202,6 @@ func newSettingFromConf() *Setting {
ApiKeyEncryptionKey: conf.GetConfigStringUnquoted("apiKeyEncryptionKey"),
RelayToken: newRelayToken(),
- HttpProxy: conf.GetConfigStringUnquoted("httpProxy"),
- AcmeEmail: conf.GetConfigStringUnquoted("acmeEmail"),
- AcmePrivateKey: conf.GetConfigStringUnquoted("acmePrivateKey"),
-
- AppDir: conf.GetConfigStringUnquoted("appDir"),
- Language: conf.GetConfigStringUnquoted("language"),
- AppMap: conf.GetConfigStringUnquoted("appMap"),
- ClientIdPrefix: conf.GetConfigStringUnquoted("clientIdPrefix"),
- ClientSecretPrefix: conf.GetConfigStringUnquoted("clientSecretPrefix"),
- DbRegionId: conf.GetConfigStringUnquoted("dbRegionId"),
- DbAccessKeyId: conf.GetConfigStringUnquoted("dbAccessKeyId"),
- DbAccessKeySecret: conf.GetConfigStringUnquoted("dbAccessKeySecret"),
- DbInstanceId: conf.GetConfigStringUnquoted("dbInstanceId"),
- DbHost: conf.GetConfigStringUnquoted("dbHost"),
- DbUser: conf.GetConfigStringUnquoted("dbUser"),
- DbPass: conf.GetConfigStringUnquoted("dbPass"),
+ HttpProxy: conf.GetConfigStringUnquoted("httpProxy"),
}
}
diff --git a/object/site.go b/object/site.go
deleted file mode 100644
index 792769c..0000000
--- a/object/site.go
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "math/rand"
- "strings"
- "time"
-
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/run"
- "github.com/apache/casbin-gateway/util"
- "github.com/xorm-io/core"
-)
-
-type NodeItem struct {
- Name string `json:"name"`
- Version string `json:"version"`
- Diff string `json:"diff"`
- Pid int `json:"pid"`
- Status string `json:"status"`
- Message string `json:"message"`
- Provider string `json:"provider"`
-}
-
-type Site struct {
- Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
- Name string `xorm:"varchar(100) notnull pk" json:"name"`
- CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
- UpdatedTime string `xorm:"varchar(100)" json:"updatedTime"`
- DisplayName string `xorm:"varchar(100)" json:"displayName"`
-
- Tag string `xorm:"varchar(100)" json:"tag"`
- Domain string `xorm:"varchar(100)" json:"domain"`
- OtherDomains []string `xorm:"varchar(500)" json:"otherDomains"`
- NeedRedirect bool `json:"needRedirect"`
- DisableVerbose bool `json:"disableVerbose"`
- Rules []string `xorm:"varchar(500)" json:"rules"`
- EnableAlert bool `json:"enableAlert"`
- AlertInterval int `json:"alertInterval"`
- AlertTryTimes int `json:"alertTryTimes"`
- AlertProviders []string `xorm:"varchar(500)" json:"alertProviders"`
- Challenges []string `xorm:"mediumtext" json:"challenges"`
- Host string `xorm:"varchar(100)" json:"host"`
- Port int `json:"port"`
- Hosts []string `xorm:"varchar(1000)" json:"hosts"`
- SslMode string `xorm:"varchar(100)" json:"sslMode"`
- SslCert string `xorm:"-" json:"sslCert"`
- PublicIp string `xorm:"varchar(100)" json:"publicIp"`
- Node string `xorm:"varchar(100)" json:"node"`
- IsSelf bool `json:"isSelf"`
- Status string `xorm:"varchar(100)" json:"status"`
- Nodes []*NodeItem `xorm:"mediumtext" json:"nodes"`
-
- CasdoorApplication string `xorm:"varchar(100)" json:"casdoorApplication"`
- ApplicationObj *auth.Application `xorm:"-" json:"applicationObj"`
-}
-
-func GetGlobalSites() ([]*Site, error) {
- sites := []*Site{}
- err := ormer.Engine.Desc("created_time").Find(&sites)
- if err != nil {
- return nil, err
- }
-
- return sites, nil
-}
-
-func GetSites(owner string) ([]*Site, error) {
- sites := []*Site{}
- err := ormer.Engine.Asc("tag").Asc("port").Desc("created_time").Find(&sites, &Site{Owner: owner})
- if err != nil {
- return nil, err
- }
-
- for _, site := range sites {
- err = site.populateCert()
- if err != nil {
- return nil, err
- }
- }
-
- return sites, nil
-}
-
-func getSite(owner string, name string) (*Site, error) {
- site := Site{Owner: owner, Name: name}
- existed, err := ormer.Engine.Get(&site)
- if err != nil {
- return nil, err
- }
-
- if existed {
- return &site, nil
- }
- return nil, nil
-}
-
-func GetSite(id string) (*Site, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- site, err := getSite(owner, name)
- if err != nil {
- return nil, err
- }
-
- if site != nil {
- err = site.populateCert()
- if err != nil {
- return nil, err
- }
- }
-
- return site, nil
-}
-
-func GetMaskedSite(site *Site, node string) *Site {
- if site == nil {
- return nil
- }
-
- if site.PublicIp == "(empty)" {
- site.PublicIp = ""
- }
-
- site.IsSelf = false
- if site.Node == node {
- site.IsSelf = true
- }
-
- return site
-}
-
-func GetMaskedSites(sites []*Site, node string) []*Site {
- for _, site := range sites {
- site = GetMaskedSite(site, node)
- }
- return sites
-}
-
-func UpdateSite(id string, site *Site) (bool, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- if s, err := getSite(owner, name); err != nil {
- return false, err
- } else if s == nil {
- return false, nil
- }
-
- site.UpdatedTime = util.GetCurrentTime()
-
- _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(site)
- if err != nil {
- return false, err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return false, err
- }
-
- err = site.checkNodes()
- if err != nil {
- return false, err
- }
-
- return true, nil
-}
-
-func UpdateSiteNoRefresh(id string, site *Site) (bool, error) {
- owner, name := util.GetOwnerAndNameFromId(id)
- if s, err := getSite(owner, name); err != nil {
- return false, err
- } else if s == nil {
- return false, nil
- }
-
- _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(site)
- if err != nil {
- return false, err
- }
-
- return true, nil
-}
-
-func AddSite(site *Site) (bool, error) {
- affected, err := ormer.Engine.Insert(site)
- if err != nil {
- return false, err
- }
-
- if affected != 0 {
- err = refreshSiteMap()
- if err != nil {
- return false, err
- }
- }
-
- return affected != 0, nil
-}
-
-func DeleteSite(site *Site) (bool, error) {
- affected, err := ormer.Engine.ID(core.PK{site.Owner, site.Name}).Delete(&Site{})
- if err != nil {
- return false, err
- }
-
- if affected != 0 {
- err = refreshSiteMap()
- if err != nil {
- return false, err
- }
- }
-
- return affected != 0, nil
-}
-
-func (site *Site) GetId() string {
- return fmt.Sprintf("%s/%s", site.Owner, site.Name)
-}
-
-func (site *Site) GetChallengeMap() map[string]string {
- m := map[string]string{}
- for _, challenge := range site.Challenges {
- tokens := strings.Split(challenge, ":")
- m[tokens[0]] = tokens[1]
- }
- return m
-}
-
-func (site *Site) GetHost() string {
- if len(site.Hosts) != 0 {
- rand.Seed(time.Now().UnixNano())
- return site.Hosts[rand.Intn(len(site.Hosts))]
- }
-
- if site.Host != "" {
- return site.Host
- }
-
- if site.Port == 0 {
- return ""
- }
-
- res := fmt.Sprintf("http://localhost:%d", site.Port)
- return res
-}
-
-func addErrorToMsg(msg string, function string, err error) string {
- fmt.Printf("%s(): %s\n", function, err.Error())
- if msg == "" {
- return fmt.Sprintf("%s(): %s", function, err.Error())
- } else {
- return fmt.Sprintf("%s || %s(): %s", msg, function, err.Error())
- }
-}
-
-func (site *Site) checkNodes() error {
- if site.Status == "Inactive" {
- return nil
- }
-
- hostname := util.GetHostname()
- for i, node := range site.Nodes {
- if node.Name != hostname {
- continue
- }
-
- if site.GetHost() == "" {
- continue
- }
-
- ok, msg := pingUrl(site.GetHost())
- status := "Running"
- if !ok {
- msg = ""
- if node.Pid > 0 {
- var err error
- ok, err = run.IsProcessActive(node.Pid)
- if err != nil {
- msg = addErrorToMsg(msg, "IsProcessActive", err)
- }
- }
- // Also check if the process exists (it may be starting/compiling)
- if !ok {
- var err error
- ok, err = run.IsSiteProcessActive(site.Name)
- if err != nil {
- msg = addErrorToMsg(msg, "IsSiteProcessActive", err)
- }
- }
- }
- if !ok {
- status = "Stopped"
- }
-
- diff := ""
- if i != 0 {
- diff = site.Nodes[0].Diff
- }
-
- orgName := ""
- if len(site.Challenges) > 0 && strings.HasPrefix(site.Challenges[0], "cbc") {
- orgName = site.Challenges[0]
- }
-
- // Check if upgrade is allowed based on node's upgrade mode
- shouldUpgrade := true
- nodeObj, err := getNode("admin", site.Node)
- if err != nil {
- msg = addErrorToMsg(msg, "GetNode", err)
- } else if nodeObj != nil {
- shouldUpgrade = nodeObj.ShouldAllowUpgrade()
- }
-
- pid, err := run.CreateRepo(site.Name, !ok, diff, node.Provider, orgName, shouldUpgrade)
- if err != nil {
- msg = addErrorToMsg(msg, "CreateRepo", err)
- }
-
- if pid == 0 {
- pid = node.Pid
- }
-
- version, err := getSiteVersion(site.Name)
- if err != nil {
- msg = addErrorToMsg(msg, "getSiteVersion", err)
- }
-
- path := run.GetRepoPath(site.Name)
- newDiff, err := run.GitDiff(path)
- if err != nil {
- msg = addErrorToMsg(msg, "GitDiff", err)
- }
-
- if node.Status != status || node.Message != msg || node.Version != version || node.Diff != newDiff || node.Pid != pid {
- site.Nodes[i].Version = version
- site.Nodes[i].Diff = newDiff
- site.Nodes[i].Pid = pid
- site.Nodes[i].Status = status
- site.Nodes[i].Message = msg
- _, err = UpdateSite(site.GetId(), site)
- if err != nil {
- return err
- }
- }
- }
-
- return nil
-}
-
-func GetSiteCount(owner, field, value string) (int64, error) {
- session := GetSession(owner, -1, -1, field, value, "", "")
- return session.Count(&Site{})
-}
-
-func GetPaginationSites(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Site, error) {
- sites := []*Site{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Where("owner = ? or owner = ?", "admin", owner).Find(&sites)
- if err != nil {
- return sites, err
- }
-
- return sites, nil
-}
diff --git a/object/site_cache.go b/object/site_cache.go
deleted file mode 100644
index e536d05..0000000
--- a/object/site_cache.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "strings"
-
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/conf"
-)
-
-var siteMap = map[string]*Site{}
-var certMap = map[string]*Cert{}
-var healthCheckNeededDomains []string
-
-func InitSiteMap() {
- err := refreshSiteMap()
- if err != nil {
- panic(err)
- }
-}
-
-func getCasdoorCertMap() (map[string]*auth.Cert, error) {
- certs, err := auth.GetCerts()
- if err != nil {
- return nil, fmt.Errorf("auth.GetCerts() error: %s", err.Error())
- }
-
- res := map[string]*auth.Cert{}
- for _, cert := range certs {
- res[cert.Name] = cert
- }
- return res, nil
-}
-
-func getCasdoorApplicationMap() (map[string]*auth.Application, error) {
- // Sites are only bound to a Casdoor application when Casdoor is configured.
- if !conf.IsCasdoorAvailable() {
- return nil, nil
- }
-
- casdoorCertMap, err := getCasdoorCertMap()
- if err != nil {
- return nil, err
- }
-
- applications, err := auth.GetOrganizationApplications()
- if err != nil {
- return nil, fmt.Errorf("auth.GetOrganizationApplications() error: %s", err.Error())
- }
-
- res := map[string]*auth.Application{}
- for _, application := range applications {
- if application.Cert != "" {
- if cert, ok := casdoorCertMap[application.Cert]; ok {
- application.CertObj = cert
- }
- }
-
- res[application.Name] = application
- }
- return res, nil
-}
-
-func refreshSiteMap() error {
- applicationMap, err := getCasdoorApplicationMap()
- if err != nil {
- fmt.Println(err)
- }
-
- newSiteMap := map[string]*Site{}
- newHealthCheckNeededDomains := make([]string, 0)
- sites, err := GetGlobalSites()
- if err != nil {
- return err
- }
-
- certMap, err = getCertMap()
- if err != nil {
- return err
- }
-
- for _, site := range sites {
- if applicationMap != nil {
- if site.CasdoorApplication != "" && site.ApplicationObj == nil {
- if v, ok2 := applicationMap[site.CasdoorApplication]; ok2 {
- site.ApplicationObj = v
- }
- }
- }
-
- if site.Domain != "" && site.PublicIp == "" {
- go func(site *Site) {
- site.PublicIp = resolveDomainToIp(site.Domain)
- _, err = UpdateSiteNoRefresh(site.GetId(), site)
- if err != nil {
- fmt.Printf("UpdateSiteNoRefresh() error: %v\n", err)
- }
- }(site)
- }
-
- newSiteMap[strings.ToLower(site.Domain)] = site
- if !shouldStopHealthCheck(site) {
- newHealthCheckNeededDomains = append(newHealthCheckNeededDomains, strings.ToLower(site.Domain))
- }
- for _, domain := range site.OtherDomains {
- if domain != "" {
- newSiteMap[strings.ToLower(domain)] = site
- }
- }
- }
-
- siteMap = newSiteMap
- healthCheckNeededDomains = newHealthCheckNeededDomains
- return nil
-}
-
-func GetSiteByDomain(domain string) *Site {
- if site, ok := siteMap[strings.ToLower(domain)]; ok {
- return site
- } else {
- return nil
- }
-}
diff --git a/object/site_cert.go b/object/site_cert.go
deleted file mode 100644
index d6631cd..0000000
--- a/object/site_cert.go
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "io/ioutil"
- "net/http"
- "strings"
- "time"
-
- "github.com/apache/casbin-gateway/util"
-)
-
-func (site *Site) populateCert() error {
- if site.Domain == "" {
- return nil
- }
-
- cert, err := GetCertByDomain(site.Domain)
- if err != nil {
- return err
- }
- if cert == nil {
- return nil
- }
-
- site.SslCert = cert.Name
- return nil
-}
-
-func checkUrlToken(url string, keyAuth string) (bool, error) {
- client := &http.Client{
- CheckRedirect: func(req *http.Request, via []*http.Request) error {
- return http.ErrUseLastResponse
- },
- }
-
- resp, err := client.Get(url)
- if err != nil {
- return false, err
- }
- defer resp.Body.Close()
-
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return false, err
- }
-
- if strings.TrimSpace(string(body)) == keyAuth {
- return true, nil
- }
-
- return false, fmt.Errorf("checkUrlToken() error, response mismatch: expected %q, got %q", keyAuth, body)
-}
-
-func (site *Site) preCheckCertForDomain(domain string) (bool, error) {
- token, keyAuth, err := util.GenerateTwoUniqueRandomStrings()
- if err != nil {
- return false, err
- }
-
- site.Challenges = []string{fmt.Sprintf("%s:%s", token, keyAuth)}
-
- _, err = UpdateSiteNoRefresh(site.GetId(), site)
- if err != nil {
- return false, err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return false, err
- }
-
- url := fmt.Sprintf("http://%s/.well-known/acme-challenge/%s", domain, token)
- var ok bool
- for i := 0; i < 10; i++ {
- fmt.Printf("checkUrlToken(): try time: %d\n", i+1)
- ok, err = checkUrlToken(url, keyAuth)
- if err != nil {
- fmt.Printf("preCheckCertForDomain() error: %v\n", err)
- time.Sleep(time.Second)
- }
- if ok {
- fmt.Printf("checkUrlToken(): try time: %d, succeed!\n", i+1)
- break
- }
- }
-
- site.Challenges = []string{}
- _, err = UpdateSiteNoRefresh(site.GetId(), site)
- if err != nil {
- return false, err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return false, err
- }
-
- return ok, nil
-}
-
-func (site *Site) updateCertForDomain(domain string) error {
- ok, err := site.preCheckCertForDomain(domain)
- if err != nil {
- return err
- }
- if !ok {
- fmt.Printf("preCheckCertForDomain(): not ok for domain: %s\n", domain)
- return nil
- }
-
- certificate, privateKey, err := getHttp01Cert(site.GetId(), domain)
- if err != nil {
- return err
- }
-
- expireTime, err := getCertExpireTime(certificate)
- if err != nil {
- fmt.Printf("getCertExpireTime() error: %v\n", err)
- }
-
- domainExpireTime, err := getDomainExpireTime(domain)
- if err != nil {
- fmt.Printf("getDomainExpireTime() error: %v\n", err)
- }
-
- cert := Cert{
- Owner: site.Owner,
- Name: domain,
- CreatedTime: util.GetCurrentTime(),
- DisplayName: domain,
- Type: "SSL",
- CryptoAlgorithm: "RSA",
- ExpireTime: expireTime,
- DomainExpireTime: domainExpireTime,
- Provider: "",
- Account: "",
- AccessKey: "",
- AccessSecret: "",
- Certificate: certificate,
- PrivateKey: privateKey,
- }
-
- _, err = DeleteCert(&cert)
- if err != nil {
- return err
- }
-
- _, err = AddCert(&cert)
- if err != nil {
- return err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func (site *Site) checkCerts() error {
- hostname := util.GetHostname()
- if len(site.Nodes) != 0 {
- if site.Nodes[0].Name != hostname {
- return nil
- }
- } else {
- nodeName := getNodeNameFromTag(site.Tag)
- if nodeName != hostname {
- return nil
- }
- }
-
- domains := []string{}
- if site.Domain != "" {
- domains = append(domains, site.Domain)
- }
-
- for _, domain := range site.OtherDomains {
- domains = append(domains, domain)
- }
-
- for _, domain := range domains {
- if site.Owner == "admin" || strings.HasSuffix(domain, ".casdoor.com") {
- continue
- }
-
- cert, err := GetCertByDomain(domain)
- if err != nil {
- return err
- }
-
- if cert != nil {
- var nearExpire bool
- nearExpire, err = cert.isCertNearExpire()
- if err != nil {
- return err
- }
-
- if !nearExpire {
- continue
- }
- }
-
- err = site.updateCertForDomain(domain)
- if err != nil {
- return err
- }
- }
-
- return nil
-}
diff --git a/object/site_cert_account.go b/object/site_cert_account.go
deleted file mode 100644
index a5125a7..0000000
--- a/object/site_cert_account.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "crypto"
- "fmt"
- "net/http"
-
- "github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/proxy"
- "github.com/casbin/lego/v4/acme"
- "github.com/casbin/lego/v4/certcrypto"
- "github.com/casbin/lego/v4/lego"
- "github.com/casbin/lego/v4/registration"
-)
-
-type Account struct {
- Email string
- Registration *registration.Resource
- key crypto.PrivateKey
-}
-
-// GetEmail returns the email address for the account.
-func (a *Account) GetEmail() string {
- return a.Email
-}
-
-// GetPrivateKey returns the private RSA account key.
-func (a *Account) GetPrivateKey() crypto.PrivateKey {
- return a.key
-}
-
-// GetRegistration returns the server registration.
-func (a *Account) GetRegistration() *registration.Resource {
- return a.Registration
-}
-
-func getLegoClientAndAccount(email string, privateKey string, devMode bool, useProxy bool) (*lego.Client, *Account, error) {
- eccKey, err := decodeEccKey(privateKey)
- if err != nil {
- return nil, nil, err
- }
-
- account := &Account{
- Email: email,
- key: eccKey,
- }
-
- config := lego.NewConfig(account)
- if devMode {
- config.CADirURL = lego.LEDirectoryStaging
- } else {
- config.CADirURL = lego.LEDirectoryProduction
- }
-
- config.Certificate.KeyType = certcrypto.RSA2048
-
- if useProxy {
- config.HTTPClient = proxy.ProxyHttpClient
- } else {
- config.HTTPClient = http.DefaultClient
- }
-
- client, err := lego.NewClient(config)
- if err != nil {
- return nil, nil, err
- }
-
- return client, account, nil
-}
-
-func getAcmeClient(email string, privateKey string, devMode bool, useProxy bool) (*lego.Client, error) {
- // Create a user. New accounts need an email and private key to start.
- client, account, err := getLegoClientAndAccount(email, privateKey, devMode, useProxy)
- if err != nil {
- return nil, err
- }
-
- // try to obtain an account based on the private key
- account.Registration, err = client.Registration.ResolveAccountByKey()
- if err != nil {
- acmeError, ok := err.(*acme.ProblemDetails)
- if !ok {
- return nil, err
- }
-
- if acmeError.Type != "urn:ietf:params:acme:error:accountDoesNotExist" {
- panic(acmeError)
- }
-
- // Failed to get account, so create an account based on the private key.
- account.Registration, err = client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
- if err != nil {
- return nil, err
- }
- }
-
- return client, nil
-}
-
-func GetAcmeClient(useProxy bool) (*lego.Client, error) {
- acmeEmail := conf.GetConfigStringUnquoted("acmeEmail")
- acmePrivateKey := conf.GetConfigStringUnquoted("acmePrivateKey")
- if acmeEmail == "" {
- return nil, fmt.Errorf("acmeEmail should not be empty")
- }
- if acmePrivateKey == "" {
- return nil, fmt.Errorf("acmePrivateKey should not be empty")
- }
-
- return getAcmeClient(acmeEmail, acmePrivateKey, false, useProxy)
-}
diff --git a/object/site_cert_ecc.go b/object/site_cert_ecc.go
deleted file mode 100644
index 8c48d17..0000000
--- a/object/site_cert_ecc.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "crypto/ecdsa"
- "crypto/elliptic"
- "crypto/rand"
- "crypto/x509"
- "encoding/pem"
- "fmt"
- "strings"
-)
-
-// generateEccKey generates a public and private key pair.(NIST P-256)
-func generateEccKey() *ecdsa.PrivateKey {
- privateKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
- return privateKey
-}
-
-// encodeEccKey Return the input private key object as string type private key
-func encodeEccKey(privateKey *ecdsa.PrivateKey) string {
- x509Encoded, err := x509.MarshalECPrivateKey(privateKey)
- if err != nil {
- panic(err)
- }
-
- pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: x509Encoded})
- return string(pemEncoded)
-}
-
-// decodeEccKey Return the entered private key string as a private key object that can be used
-func decodeEccKey(pemEncoded string) (*ecdsa.PrivateKey, error) {
- pemEncoded = strings.ReplaceAll(pemEncoded, "\\n", "\n")
- block, _ := pem.Decode([]byte(pemEncoded))
- if block == nil {
- return nil, fmt.Errorf("decodeEccKey() error, block should not be nil")
- }
-
- x509Encoded := block.Bytes
- privateKey, err := x509.ParseECPrivateKey(x509Encoded)
- if err != nil {
- return nil, err
- }
-
- return privateKey, nil
-}
diff --git a/object/site_cert_http.go b/object/site_cert_http.go
deleted file mode 100644
index 1a3cb36..0000000
--- a/object/site_cert_http.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
-
- "github.com/casbin/lego/v4/certificate"
-)
-
-type HttpProvider struct {
- siteId string
-}
-
-func (p *HttpProvider) Present(domain string, token string, keyAuth string) error {
- site, err := GetSite(p.siteId)
- if err != nil {
- return err
- }
-
- site.Challenges = []string{fmt.Sprintf("%s:%s", token, keyAuth)}
- _, err = UpdateSiteNoRefresh(site.GetId(), site)
- if err != nil {
- return err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func (p *HttpProvider) CleanUp(domain string, token string, keyAuth string) error {
- site, err := GetSite(p.siteId)
- if err != nil {
- return err
- }
-
- site.Challenges = []string{}
- _, err = UpdateSiteNoRefresh(site.GetId(), site)
- if err != nil {
- return err
- }
-
- err = refreshSiteMap()
- if err != nil {
- return err
- }
-
- return nil
-}
-
-func getHttp01Cert(siteId string, domain string) (string, string, error) {
- client, err := GetAcmeClient(false)
- if err != nil {
- return "", "", err
- }
-
- provider := HttpProvider{siteId: siteId}
- err = client.Challenge.SetHTTP01Provider(&provider)
- if err != nil {
- return "", "", err
- }
-
- request := certificate.ObtainRequest{
- Domains: []string{domain},
- Bundle: true,
- }
-
- resource, err := client.Certificate.Obtain(request)
- if err != nil {
- return "", "", err
- }
-
- return string(resource.Certificate), string(resource.PrivateKey), nil
-}
diff --git a/object/site_test.go b/object/site_test.go
deleted file mode 100644
index 78fb2c9..0000000
--- a/object/site_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package object
-
-import (
- "testing"
-
- "github.com/apache/casbin-gateway/casdoor"
-)
-
-func TestCheckNode(t *testing.T) {
- InitConfig()
- casdoor.InitCasdoorConfig()
-
- site, err := getSite("admin", "casbin-gateway_my")
- if err != nil {
- panic(err)
- }
- if site == nil {
- panic("site should not be nil")
- }
-
- site.Status = "Active"
- err = site.checkNodes()
- if err != nil {
- panic(err)
- }
-
- site, err = getSite("admin", "casbin-gateway_my")
- if err != nil {
- panic(err)
- }
- if site == nil {
- panic("site should not be nil")
- }
-
- site.Status = "Inactive"
-
- _, err = UpdateSite(site.GetId(), site)
- if err != nil {
- panic(err)
- }
-}
diff --git a/object/site_timer.go b/object/site_timer.go
deleted file mode 100644
index 2c4708a..0000000
--- a/object/site_timer.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "sync"
- "time"
-
- "github.com/apache/casbin-gateway/util"
-)
-
-var (
- siteUpdateMap = map[string]string{}
- lock = &sync.Mutex{}
-)
-
-func monitorSiteNodes() error {
- sites, err := GetGlobalSites()
- if err != nil {
- return err
- }
-
- for _, site := range sites {
- //updatedTime, ok := siteUpdateMap[site.GetId()]
- //if ok && updatedTime != "" && updatedTime == site.UpdatedTime {
- // continue
- //}
-
- lock.Lock()
- err = site.checkNodes()
- lock.Unlock()
- if err != nil {
- return err
- }
-
- siteUpdateMap[site.GetId()] = site.UpdatedTime
- }
-
- return err
-}
-
-func monitorSiteCerts() error {
- sites, err := GetGlobalSites()
- if err != nil {
- return err
- }
-
- for _, site := range sites {
- //updatedTime, ok := siteUpdateMap[site.GetId()]
- //if ok && updatedTime != "" && updatedTime == site.UpdatedTime {
- // continue
- //}
-
- lock.Lock()
- err = site.checkCerts()
- lock.Unlock()
- if err != nil {
- return err
- }
-
- siteUpdateMap[site.GetId()] = site.UpdatedTime
- }
-
- return err
-}
-
-func StartMonitorSitesLoop() {
- fmt.Printf("StartMonitorSitesLoop() Start!\n\n")
- go func() {
- defer func() {
- if r := recover(); r != nil {
- fmt.Printf("[%s] Recovered from StartMonitorSitesLoop() panic: %v\n", util.GetCurrentTime(), r)
- StartMonitorSitesLoop()
- }
- }()
-
- for {
- err := refreshSiteMap()
- if err != nil {
- fmt.Println(err)
- continue
- }
-
- err = refreshRuleMap()
- if err != nil {
- fmt.Println(err)
- continue
- }
-
- err = monitorSiteNodes()
- if err != nil {
- fmt.Println(err)
- continue
- }
-
- err = monitorSiteCerts()
- if err != nil {
- fmt.Println(err)
- continue
- }
-
- startHealthCheckLoop()
-
- time.Sleep(5 * time.Second)
- }
- }()
-}
diff --git a/object/site_timer_health.go b/object/site_timer_health.go
deleted file mode 100644
index 8aec491..0000000
--- a/object/site_timer_health.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "strings"
- "time"
-
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/conf"
-)
-
-var healthCheckTryTimesMap = map[string]int{}
-
-func healthCheck(site *Site, domain string) error {
- var isHealth bool
- var pingResponse string
- urlHttps := "https://" + domain
- urlHttp := "http://" + domain
- switch site.SslMode {
- case "HTTPS Only":
- isHealth, pingResponse = pingUrl(urlHttps)
- case "HTTP":
- isHealth, pingResponse = pingUrl(urlHttp)
- case "HTTPS and HTTP":
- isHttpsHealth, httpsPingResponse := pingUrl(urlHttps)
- isHttpHealth, httpPingResponse := pingUrl(urlHttp)
- isHealth = isHttpsHealth || isHttpHealth
- pingResponse = httpsPingResponse + httpPingResponse
- }
-
- if isHealth {
- healthCheckTryTimesMap[domain] = GetSiteByDomain(domain).AlertTryTimes
- return nil
- }
-
- healthCheckTryTimesMap[domain]--
- if healthCheckTryTimesMap[domain] != 0 {
- return nil
- }
-
- pingResponse = fmt.Sprintf("Casbin Gateway health check failed for domain %s, %s", domain, pingResponse)
-
- // Alerts are delivered through Casdoor's email and SMS providers. Without
- // Casdoor there is nowhere to send them, so the check itself still runs but
- // stays silent.
- if !conf.IsCasdoorAvailable() {
- return nil
- }
-
- user, err := auth.GetUser(site.Owner)
- if err != nil {
- return err
- }
- if user == nil {
- return fmt.Errorf("user not found")
- }
- for _, provider := range site.AlertProviders {
- if strings.HasPrefix(provider, "Email/") {
- err := auth.SendEmailByProvider("Casbin Gateway HealthCheck Alert", pingResponse, "Casbin Gateway", provider[6:], user.Email)
- if err != nil {
- fmt.Println(err)
- }
- }
- if strings.HasPrefix(provider, "SMS/") {
- err := auth.SendSmsByProvider(pingResponse, provider[4:], user.Phone)
- if err != nil {
- fmt.Println(err)
- }
- }
- }
- return nil
-}
-
-func startHealthCheckLoop() {
- for _, domain := range healthCheckNeededDomains {
- domain := domain
- if _, ok := healthCheckTryTimesMap[domain]; ok {
- continue
- }
- healthCheckTryTimesMap[domain] = GetSiteByDomain(domain).AlertTryTimes
- go func() {
- for {
- site := GetSiteByDomain(domain)
- if shouldStopHealthCheck(site) {
- delete(healthCheckTryTimesMap, domain)
- return
- }
-
- err := healthCheck(site, domain)
- if err != nil {
- fmt.Println(err)
- }
- time.Sleep(time.Duration(site.AlertInterval) * time.Second)
- }
- }()
- }
-}
-
-func shouldStopHealthCheck(site *Site) bool {
- return site == nil || !site.EnableAlert || site.Domain == "" || site.Status == "Inactive"
-}
diff --git a/object/util.go b/object/util.go
deleted file mode 100644
index 8ab4d24..0000000
--- a/object/util.go
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package object
-
-import (
- "fmt"
- "net"
- "net/http"
- "strings"
- "time"
-
- "github.com/apache/casbin-gateway/run"
- "github.com/apache/casbin-gateway/util"
- "github.com/go-git/go-git/v5"
- "github.com/go-git/go-git/v5/plumbing"
- "github.com/go-git/go-git/v5/plumbing/object"
- "golang.org/x/net/publicsuffix"
-)
-
-func resolveDomainToIp(domain string) string {
- ips, err := net.LookupIP(domain)
- if err != nil {
- if strings.Contains(err.Error(), "no such host") {
- return "(empty)"
- }
-
- fmt.Printf("resolveDomainToIp() error: %s\n", err.Error())
- return err.Error()
- }
-
- for _, ip := range ips {
- if ipv4 := ip.To4(); ipv4 != nil {
- return ipv4.String()
- }
- }
- return "(empty)"
-}
-
-func getBaseDomain(domain string) (string, error) {
- // abc.com -> abc.com
- // abc.com.it -> abc.com.it
- // subdomain.abc.io -> abc.io
- // subdomain.abc.org.us -> abc.org.us
- return publicsuffix.EffectiveTLDPlusOne(domain)
-}
-
-func pingUrl(url string) (bool, string) {
- client := http.Client{
- Timeout: 5 * time.Second,
- }
- resp, err := client.Get(url)
- if err != nil {
- return false, err.Error()
- }
- defer resp.Body.Close()
-
- if resp.StatusCode >= 200 && resp.StatusCode <= 299 {
- return true, ""
- }
- return false, fmt.Sprintf("Status: %s", resp.Status)
-}
-
-type VersionInfo struct {
- Version string `json:"version"`
- CommitId string `json:"commitId"`
- CommitOffset int `json:"commitOffset"`
-}
-
-func getVersionInfo(path string) (*VersionInfo, error) {
- res := &VersionInfo{
- Version: "",
- CommitId: "",
- CommitOffset: -1,
- }
-
- r, err := git.PlainOpen(path)
- if err != nil {
- return res, err
- }
- ref, err := r.Head()
- if err != nil {
- return res, err
- }
- tags, err := r.Tags()
- if err != nil {
- return res, err
- }
- tagMap := make(map[plumbing.Hash]string)
- err = tags.ForEach(func(t *plumbing.Reference) error {
- // This technique should work for both lightweight and annotated tags.
- revHash, err := r.ResolveRevision(plumbing.Revision(t.Name()))
- if err != nil {
- return err
- }
- tagMap[*revHash] = t.Name().Short()
- return nil
- })
- if err != nil {
- return res, err
- }
-
- cIter, err := r.Log(&git.LogOptions{From: ref.Hash()})
-
- commitOffset := 0
- version := ""
- // iterates over the commits
- err = cIter.ForEach(func(c *object.Commit) error {
- tag, ok := tagMap[c.Hash]
- if ok {
- if version == "" {
- version = tag
- }
- }
- if version == "" {
- commitOffset++
- }
- return nil
- })
- if err != nil {
- return res, err
- }
-
- res = &VersionInfo{
- Version: version,
- CommitId: ref.Hash().String(),
- CommitOffset: commitOffset,
- }
- return res, nil
-}
-
-func getSiteVersion(siteName string) (string, error) {
- path := run.GetRepoPath(siteName)
- versionInfo, err := getVersionInfo(path)
- if err != nil {
- return "", err
- }
-
- res := util.StructToJsonNoIndent(versionInfo)
- return res, nil
-}
-
-func getNodeNameFromTag(s string) string {
- tokens := strings.SplitN(s, "-", 2)
- if len(tokens) >= 2 {
- return tokens[1]
- } else {
- return s
- }
-}
-
-func getCertMap() (map[string]*Cert, error) {
- certs, err := GetGlobalCerts()
- if err != nil {
- return nil, err
- }
-
- res := map[string]*Cert{}
- for _, cert := range certs {
- res[cert.Name] = cert
- }
- return res, nil
-}
-
-func GetCertByDomain(domain string) (*Cert, error) {
- if domain == "" {
- return nil, fmt.Errorf("GetCertByDomain() error: domain should not be empty")
- }
-
- cert, ok := certMap[domain]
- if ok {
- return cert, nil
- }
-
- baseDomain, err := getBaseDomain(domain)
- if err != nil {
- return nil, err
- }
-
- cert, ok = certMap[baseDomain]
- if ok {
- return cert, nil
- }
-
- return nil, nil
-}
diff --git a/routers/router.go b/routers/router.go
index 4fea082..390ec28 100644
--- a/routers/router.go
+++ b/routers/router.go
@@ -37,8 +37,6 @@ func initAPI() {
beego.Router("/api/get-signin-options", &controllers.ApiController{}, "GET:GetSigninOptions")
beego.Router("/api/get-account", &controllers.ApiController{}, "GET:GetAccount")
beego.Router("/api/update-account", &controllers.ApiController{}, "POST:UpdateAccount")
- beego.Router("/api/get-casdoor-providers", &controllers.ApiController{}, "GET:GetCasdoorProviders")
- beego.Router("/api/get-gateway-status", &controllers.ApiController{}, "GET:GetGatewayStatus")
beego.Router("/api/get-relay-token", &controllers.ApiController{}, "GET:GetRelayToken")
beego.Router("/api/get-version", &controllers.ApiController{}, "GET:GetVersion")
beego.Router("/api/update-gateway", &controllers.ApiController{}, "POST:UpdateGateway")
@@ -46,29 +44,6 @@ func initAPI() {
beego.Router("/api/get-setting", &controllers.ApiController{}, "GET:GetSetting")
beego.Router("/api/update-setting", &controllers.ApiController{}, "POST:UpdateSetting")
- beego.Router("/api/get-global-nodes", &controllers.ApiController{}, "GET:GetGlobalNodes")
- beego.Router("/api/get-nodes", &controllers.ApiController{}, "GET:GetNodes")
- beego.Router("/api/get-node", &controllers.ApiController{}, "GET:GetNode")
- beego.Router("/api/update-node", &controllers.ApiController{}, "POST:UpdateNode")
- beego.Router("/api/add-node", &controllers.ApiController{}, "POST:AddNode")
- beego.Router("/api/delete-node", &controllers.ApiController{}, "POST:DeleteNode")
-
- beego.Router("/api/get-global-sites", &controllers.ApiController{}, "GET:GetGlobalSites")
- beego.Router("/api/get-sites", &controllers.ApiController{}, "GET:GetSites")
- beego.Router("/api/get-site", &controllers.ApiController{}, "GET:GetSite")
- beego.Router("/api/update-site", &controllers.ApiController{}, "POST:UpdateSite")
- beego.Router("/api/add-site", &controllers.ApiController{}, "POST:AddSite")
- beego.Router("/api/delete-site", &controllers.ApiController{}, "POST:DeleteSite")
-
- beego.Router("/api/get-global-certs", &controllers.ApiController{}, "GET:GetGlobalCerts")
- beego.Router("/api/get-certs", &controllers.ApiController{}, "GET:GetCerts")
- beego.Router("/api/get-cert", &controllers.ApiController{}, "GET:GetCert")
- beego.Router("/api/update-cert", &controllers.ApiController{}, "POST:UpdateCert")
- beego.Router("/api/add-cert", &controllers.ApiController{}, "POST:AddCert")
- beego.Router("/api/delete-cert", &controllers.ApiController{}, "POST:DeleteCert")
- beego.Router("/api/update-cert-domain-expire", &controllers.ApiController{}, "POST:UpdateCertDomainExpire")
-
- beego.Router("/api/get-applications", &controllers.ApiController{}, "GET:GetApplications")
beego.Router("/api/get-agents", &controllers.ApiController{}, "GET:GetAgents")
beego.Router("/api/patch-agent", &controllers.ApiController{}, "POST:PatchAgent")
beego.Router("/api/unpatch-agent", &controllers.ApiController{}, "POST:UnpatchAgent")
@@ -95,21 +70,6 @@ func initAPI() {
beego.Router("/api/restore-agent-provider", &controllers.ApiController{}, "POST:RestoreAgentProvider")
beego.Router("/api/copy-agent-config", &controllers.ApiController{}, "POST:CopyAgentConfig")
- beego.Router("/api/get-records", &controllers.ApiController{}, "GET:GetRecords")
- beego.Router("/api/get-record", &controllers.ApiController{}, "GET:GetRecord")
- beego.Router("/api/delete-record", &controllers.ApiController{}, "POST:DeleteRecord")
- beego.Router("/api/update-record", &controllers.ApiController{}, "POST:UpdateRecord")
- beego.Router("/api/add-record", &controllers.ApiController{}, "POST:AddRecord")
-
- beego.Router("/api/get-metrics", &controllers.ApiController{}, "GET:GetMetrics")
- beego.Router("/api/get-metrics-over-time", &controllers.ApiController{}, "GET:GetMetricsOverTime")
-
- beego.Router("/api/get-rules", &controllers.ApiController{}, "GET:GetRules")
- beego.Router("/api/get-rule", &controllers.ApiController{}, "GET:GetRule")
- beego.Router("/api/add-rule", &controllers.ApiController{}, "POST:AddRule")
- beego.Router("/api/update-rule", &controllers.ApiController{}, "POST:UpdateRule")
- beego.Router("/api/delete-rule", &controllers.ApiController{}, "POST:DeleteRule")
-
// Provider routes for LLM gateway milestone 1.1.
beego.Router("/api/get-providers", &controllers.ApiController{}, "GET:GetProviders")
beego.Router("/api/get-provider", &controllers.ApiController{}, "GET:GetProvider")
diff --git a/rule/rule.go b/rule/rule.go
deleted file mode 100644
index c8c705d..0000000
--- a/rule/rule.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net/http"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
-)
-
-type Rule interface {
- checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error)
-}
-
-type RuleResult struct {
- Action string
- StatusCode int
- Reason string
-}
-
-func CheckRules(ruleIds []string, r *http.Request) (*RuleResult, error) {
- rules, err := object.GetRulesByRuleIds(ruleIds)
- if err != nil {
- return nil, err
- }
- for i, rule := range rules {
- var ruleObj Rule
- switch rule.Type {
- case "User-Agent":
- ruleObj = &UaRule{}
- case "URL Path":
- ruleObj = &UrlPathRule{}
- case "IP":
- ruleObj = &IpRule{}
- case "WAF":
- ruleObj = &WafRule{}
- case "IP Rate Limiting":
- ruleObj = &IpRateRule{
- ruleName: rule.GetId(),
- }
- case "Compound":
- ruleObj = &CompoundRule{}
- default:
- return nil, fmt.Errorf("unknown rule type: %s for rule: %s", rule.Type, rule.GetId())
- }
-
- result, err := ruleObj.checkRule(rule.Expressions, r)
- if err != nil {
- return nil, err
- }
-
- if result != nil {
- // Use rule's action if no action specified by the rule check
- if result.Action == "" {
- result.Action = rule.Action
- }
-
- // Determine status code
- if result.StatusCode == 0 {
- if rule.StatusCode != 0 {
- result.StatusCode = rule.StatusCode
- } else {
- // Set default status codes if not specified
- switch result.Action {
- case "Block":
- result.StatusCode = 403
- case "Drop":
- result.StatusCode = 400
- case "Allow":
- result.StatusCode = 200
- case "CAPTCHA":
- result.StatusCode = 302
- default:
- return nil, fmt.Errorf("unknown rule action: %s for rule: %s", result.Action, rule.GetId())
- }
- }
- }
-
- // Update reason if rule has custom reason
- if result.Action == "Block" || result.Action == "Drop" {
- if rule.IsVerbose {
- // Add verbose debug info with rule name and triggered expression
- result.Reason = util.GenerateVerboseReason(rule.GetId(), result.Reason, rule.Reason)
- } else if rule.Reason != "" {
- result.Reason = rule.Reason
- } else if result.Reason != "" {
- result.Reason = fmt.Sprintf("hit rule %s: %s", ruleIds[i], result.Reason)
- }
- }
-
- return result, nil
- }
- }
-
- // Default action if no rule matched
- return &RuleResult{
- Action: "Allow",
- StatusCode: 200,
- }, nil
-}
diff --git a/rule/rule_compound.go b/rule/rule_compound.go
deleted file mode 100644
index d4ba975..0000000
--- a/rule/rule_compound.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net/http"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
-)
-
-type CompoundRule struct{}
-
-func (r *CompoundRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- operators := util.NewStack()
- res := true
- for _, expression := range expressions {
- isHit := true
- result, err := CheckRules([]string{expression.Value}, req)
- if err != nil {
- return nil, err
- }
- if result == nil || result.Action == "" {
- isHit = false
- }
- switch expression.Operator {
- case "and", "begin":
- res = res && isHit
- case "or":
- operators.Push(res)
- res = isHit
- default:
- return nil, fmt.Errorf("unknown operator: %s", expression.Operator)
- }
- if operators.Size() > 0 {
- last, ok := operators.Pop()
- for ok {
- res = last.(bool) || res
- last, ok = operators.Pop()
- }
- }
- }
- if res {
- return &RuleResult{}, nil
- }
- return nil, nil
-}
diff --git a/rule/rule_ip.go b/rule/rule_ip.go
deleted file mode 100644
index 277262d..0000000
--- a/rule/rule_ip.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net"
- "net/http"
- "strings"
-
- "github.com/apache/casbin-gateway/ip"
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
-)
-
-type IpRule struct{}
-
-func (r *IpRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- clientIp := util.GetClientIp(req)
- netIp, err := parseIp(clientIp)
- if err != nil {
- return nil, err
- }
- for _, expression := range expressions {
- reason := fmt.Sprintf("expression matched: \"%s %s %s\"", clientIp, expression.Operator, expression.Value)
-
- // Handle "is abroad" operator
- if expression.Operator == "is abroad" {
- if ip.IsAbroadIp(clientIp) {
- return &RuleResult{Reason: reason}, nil
- }
- continue
- }
-
- ips := strings.Split(expression.Value, ",")
- for _, ipStr := range ips {
- if strings.Contains(ipStr, "/") {
- _, ipNet, err := net.ParseCIDR(ipStr)
- if err != nil {
- return nil, err
- }
-
- switch expression.Operator {
- case "is in":
- if ipNet.Contains(netIp) {
- return &RuleResult{Reason: reason}, nil
- }
- case "is not in":
- if !ipNet.Contains(netIp) {
- return &RuleResult{Reason: reason}, nil
- }
- default:
- return nil, fmt.Errorf("unknown operator: %s", expression.Operator)
- }
- } else if strings.ContainsAny(ipStr, ".:") {
- switch expression.Operator {
- case "is in":
- if ipStr == clientIp {
- return &RuleResult{Reason: reason}, nil
- }
- case "is not in":
- if ipStr != clientIp {
- return &RuleResult{Reason: reason}, nil
- }
- default:
- return nil, fmt.Errorf("unknown operator: %s", expression.Operator)
- }
- } else {
- return nil, fmt.Errorf("unknown IP or CIDR format: %s", ipStr)
- }
- }
- }
- return nil, nil
-}
-
-func parseIp(ipStr string) (net.IP, error) {
- ip := net.ParseIP(ipStr)
- if ip == nil {
- return nil, fmt.Errorf("unknown IP or CIDR format: %s", ipStr)
- }
- return ip, nil
-}
diff --git a/rule/rule_ip_rate.go b/rule/rule_ip_rate.go
deleted file mode 100644
index 691ee9c..0000000
--- a/rule/rule_ip_rate.go
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "net/http"
- "sync"
- "time"
-
- "github.com/apache/casbin-gateway/object"
- "github.com/apache/casbin-gateway/util"
- "golang.org/x/time/rate"
-)
-
-type IpRateRule struct {
- ruleName string
-}
-
-type IpRateLimiter struct {
- ips map[string]*rate.Limiter
- mu *sync.RWMutex
- r rate.Limit
- b int
-}
-
-var blackList = map[string]map[string]time.Time{}
-
-var ipRateLimiters = map[string]*IpRateLimiter{}
-
-// NewIpRateLimiter .
-func NewIpRateLimiter(r rate.Limit, b int) *IpRateLimiter {
- i := &IpRateLimiter{
- ips: make(map[string]*rate.Limiter),
- mu: &sync.RWMutex{},
- r: r,
- b: b,
- }
-
- return i
-}
-
-// AddIP creates a new rate limiter and adds it to the ips map,
-// using the IP address as the key
-func (i *IpRateLimiter) AddIP(ip string) *rate.Limiter {
- i.mu.Lock()
- defer i.mu.Unlock()
-
- limiter := rate.NewLimiter(i.r, i.b)
-
- i.ips[ip] = limiter
-
- return limiter
-}
-
-// GetLimiter returns the rate limiter for the provided IP address if it exists.
-// Otherwise, calls AddIP to add IP address to the map
-func (i *IpRateLimiter) GetLimiter(ip string) *rate.Limiter {
- i.mu.Lock()
- limiter, exists := i.ips[ip]
-
- if !exists {
- i.mu.Unlock()
- return i.AddIP(ip)
- }
-
- i.mu.Unlock()
-
- return limiter
-}
-
-func (r *IpRateRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- expression := expressions[0] // IpRate rule should have only one expression
- clientIp := util.GetClientIp(req)
-
- // If the client IP is in the blacklist, check the block time
- createAt, ok := blackList[r.ruleName][clientIp]
- if ok {
- blockTime := util.ParseInt(expression.Value)
- if time.Now().Sub(createAt) < time.Duration(blockTime)*time.Second {
- return &RuleResult{
- Action: "Block",
- Reason: "Rate limit exceeded",
- }, nil
- } else {
- delete(blackList, clientIp)
- }
- }
-
- // If the client IP is not in the blacklist, check the rate limit
- ipRateLimiter := ipRateLimiters[r.ruleName]
- parseInt := util.ParseInt(expression.Operator)
- if ipRateLimiter == nil {
- ipRateLimiter = NewIpRateLimiter(rate.Limit(parseInt), parseInt)
- ipRateLimiters[r.ruleName] = ipRateLimiter
- }
-
- // If the rate limit has changed, update the rate limiter
- limiter := ipRateLimiter.GetLimiter(clientIp)
- if ipRateLimiter.r != rate.Limit(parseInt) {
- ipRateLimiter.r = rate.Limit(parseInt)
- ipRateLimiter.b = parseInt
- limiter.SetLimit(ipRateLimiter.r)
- limiter.SetBurst(ipRateLimiter.b)
- err := limiter.Wait(req.Context())
- if err != nil {
- return nil, err
- }
- } else {
- // If the rate limit is exceeded, add the client IP to the blacklist
- allow := limiter.Allow()
- if !allow {
- blackList[r.ruleName] = map[string]time.Time{}
- blackList[r.ruleName][clientIp] = time.Now()
- return &RuleResult{
- Action: "Block",
- Reason: "Rate limit exceeded",
- }, nil
- }
- }
-
- return nil, nil
-}
diff --git a/rule/rule_ip_rate_test.go b/rule/rule_ip_rate_test.go
deleted file mode 100644
index 1878ba3..0000000
--- a/rule/rule_ip_rate_test.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "net/http"
- "testing"
-
- "github.com/apache/casbin-gateway/object"
-)
-
-func TestIpRateRule_checkRule(t *testing.T) {
- type fields struct {
- ruleName string
- }
- type args struct {
- args []struct {
- expressions []*object.Expression
- req *http.Request
- }
- }
-
- tests := []struct {
- name string
- fields fields
- args args
- want []bool
- want1 []string
- want2 []string
- wantErr []bool
- }{
- {
- name: "Test 1",
- fields: fields{
- ruleName: "rule1",
- },
- args: args{
- args: []struct {
- expressions []*object.Expression
- req *http.Request
- }{
- {
- expressions: []*object.Expression{
- {
- Operator: "1",
- Value: "1",
- },
- },
- req: &http.Request{
- RemoteAddr: "127.0.0.1",
- },
- },
- {
- expressions: []*object.Expression{
- {
- Operator: "1",
- Value: "1",
- },
- },
- req: &http.Request{
- RemoteAddr: "127.0.0.1",
- },
- },
- },
- },
- want: []bool{false, true},
- want1: []string{"", "Block"},
- want2: []string{"", "Rate limit exceeded"},
- wantErr: []bool{false, false},
- },
- {
- name: "Test 2",
- fields: fields{
- ruleName: "rule2",
- },
- args: args{
- args: []struct {
- expressions []*object.Expression
- req *http.Request
- }{
- {
- expressions: []*object.Expression{
- {
- Operator: "1",
- Value: "1",
- },
- },
- req: &http.Request{
- RemoteAddr: "127.0.0.1",
- },
- },
- {
- expressions: []*object.Expression{
- {
- Operator: "10",
- Value: "1",
- },
- },
- req: &http.Request{
- RemoteAddr: "127.0.0.1",
- },
- },
- },
- },
- want: []bool{false, false},
- want1: []string{"", ""},
- want2: []string{"", ""},
- wantErr: []bool{false, false},
- },
- }
-
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- r := &IpRateRule{
- ruleName: tt.fields.ruleName,
- }
- for i, arg := range tt.args.args {
- result, err := r.checkRule(arg.expressions, arg.req)
- if (err != nil) != tt.wantErr[i] {
- t.Errorf("checkRule() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- got := result != nil
- got1 := ""
- got2 := ""
- if result != nil {
- got1 = result.Action
- got2 = result.Reason
- }
- if got != tt.want[i] {
- t.Errorf("checkRule() got = %v, want %v", got, tt.want[i])
- }
- if got1 != tt.want1[i] {
- t.Errorf("checkRule() got1 = %v, want %v", got1, tt.want1[i])
- }
- if got2 != tt.want2[i] {
- t.Errorf("checkRule() got2 = %v, want %v", got2, tt.want2[i])
- }
- }
- })
- }
-}
diff --git a/rule/rule_ua.go b/rule/rule_ua.go
deleted file mode 100644
index 7f74d5e..0000000
--- a/rule/rule_ua.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net/http"
- "regexp"
- "strings"
-
- "github.com/apache/casbin-gateway/object"
-)
-
-type UaRule struct{}
-
-func (r *UaRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- userAgent := req.UserAgent()
- for _, expression := range expressions {
- ua := expression.Value
- reason := fmt.Sprintf("expression matched: \"%s %s %s\"", userAgent, expression.Operator, expression.Value)
- switch expression.Operator {
- case "contains":
- if strings.Contains(userAgent, ua) {
- return &RuleResult{Reason: reason}, nil
- }
- case "does not contain":
- if !strings.Contains(userAgent, ua) {
- return &RuleResult{Reason: reason}, nil
- }
- case "equals":
- if userAgent == ua {
- return &RuleResult{Reason: reason}, nil
- }
- case "does not equal":
- if strings.Compare(userAgent, ua) != 0 {
- return &RuleResult{Reason: reason}, nil
- }
- case "match":
- // regex match
- isHit, err := regexp.MatchString(ua, userAgent)
- if err != nil {
- return nil, err
- }
- if isHit {
- return &RuleResult{Reason: reason}, nil
- }
- }
- }
-
- return nil, nil
-}
diff --git a/rule/rule_url_path.go b/rule/rule_url_path.go
deleted file mode 100644
index c0a7ce8..0000000
--- a/rule/rule_url_path.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net/http"
- "regexp"
- "strings"
-
- "github.com/apache/casbin-gateway/object"
-)
-
-type UrlPathRule struct{}
-
-func (r *UrlPathRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- path := req.URL.Path
- for _, expression := range expressions {
- pattern := expression.Value
- reason := fmt.Sprintf("expression matched: \"%s %s %s\"", path, expression.Operator, expression.Value)
- switch expression.Operator {
- case "contains":
- if strings.Contains(path, pattern) {
- return &RuleResult{Reason: reason}, nil
- }
- case "does not contain":
- if !strings.Contains(path, pattern) {
- return &RuleResult{Reason: reason}, nil
- }
- case "equals":
- if path == pattern {
- return &RuleResult{Reason: reason}, nil
- }
- case "does not equal":
- if strings.Compare(path, pattern) != 0 {
- return &RuleResult{Reason: reason}, nil
- }
- case "match":
- isHit, err := regexp.MatchString(pattern, path)
- if err != nil {
- return nil, err
- }
- if isHit {
- return &RuleResult{Reason: reason}, nil
- }
- }
- }
-
- return nil, nil
-}
diff --git a/rule/rule_waf.go b/rule/rule_waf.go
deleted file mode 100644
index 04aefba..0000000
--- a/rule/rule_waf.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2024 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package rule
-
-import (
- "fmt"
- "net/http"
-
- "github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/object"
- "github.com/corazawaf/coraza/v3"
- "github.com/corazawaf/coraza/v3/types"
- "github.com/hsluoyz/modsecurity-go/seclang/parser"
-)
-
-type WafRule struct{}
-
-func (r *WafRule) checkRule(expressions []*object.Expression, req *http.Request) (*RuleResult, error) {
- var ruleStr string
- for _, expression := range expressions {
- ruleStr += expression.Value
- }
- waf, err := coraza.NewWAF(
- coraza.NewWAFConfig().
- WithErrorCallback(logError).
- WithDirectives(conf.WafConf).
- WithDirectives(ruleStr),
- )
- if err != nil {
- return nil, fmt.Errorf("create WAF failed")
- }
- tx := waf.NewTransaction()
- processRequest(tx, req)
- matchedRules := tx.MatchedRules()
- for _, matchedRule := range matchedRules {
- rule := matchedRule.Rule()
- directive, err := parser.NewSecLangScannerFromString(rule.Raw()).AllDirective()
- if err != nil {
- return nil, err
- }
- for _, d := range directive {
- ruleDirective := d.(*parser.RuleDirective)
- for _, action := range ruleDirective.Actions.Action {
- switch action.Tk {
- case parser.TkActionBlock, parser.TkActionDeny:
- return &RuleResult{
- Action: "Block",
- Reason: fmt.Sprintf("blocked by WAF rule: %d", rule.ID()),
- }, nil
- case parser.TkActionAllow:
- return &RuleResult{
- Action: "Allow",
- }, nil
- case parser.TkActionDrop:
- return &RuleResult{
- Action: "Drop",
- Reason: fmt.Sprintf("dropped by WAF rule: %d", rule.ID()),
- }, nil
- default:
- // skip other actions
- continue
- }
- }
- }
- }
- return nil, nil
-}
-
-func processRequest(tx types.Transaction, req *http.Request) {
- // Process URI and method
- tx.ProcessURI(req.URL.String(), req.Method, req.Proto)
-
- // Process request headers
- for key, values := range req.Header {
- for _, value := range values {
- tx.AddRequestHeader(key, value)
- }
- }
- tx.ProcessRequestHeaders()
-
- // Process request body (if any)
- if req.Body != nil {
- _, err := tx.ProcessRequestBody()
- if err != nil {
- return
- }
- }
-}
-
-func logError(error types.MatchedRule) {
- msg := error.ErrorLog()
- fmt.Printf("[WAFlogError][%s] %s\n", error.Rule().Severity(), msg)
-}
diff --git a/run/cdn.go b/run/cdn.go
deleted file mode 100644
index 6cb5997..0000000
--- a/run/cdn.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "bytes"
- "fmt"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/apache/casbin-gateway/storage"
- "github.com/apache/casbin-gateway/util"
-)
-
-func filterFiles(filenames []string, ext string, siteName string) []string {
- res := []string{}
- for _, filename := range filenames {
- if !strings.HasSuffix(filename, ext) {
- continue
- }
-
- if strings.HasPrefix(siteName, "casdoor") {
- if strings.Contains(filename, ".chunk.js") || strings.Contains(filename, ".chunk.css") {
- continue
- }
- }
-
- res = append(res, filename)
- }
- return res
-}
-
-// assetDirs tells where a web build keeps its hashed assets. Create React App
-// splits them into "static/js" and "static/css", Vite puts both in "assets".
-type assetDirs struct {
- root string
- js string
- css string
-}
-
-func getAssetDirs(buildDir string) (*assetDirs, error) {
- if util.FileExist(filepath.Join(buildDir, "static")) {
- return &assetDirs{root: "static", js: "static/js", css: "static/css"}, nil
- }
-
- if util.FileExist(filepath.Join(buildDir, "assets")) {
- return &assetDirs{root: "assets", js: "assets", css: "assets"}, nil
- }
-
- return nil, fmt.Errorf("getAssetDirs() error: no \"static\" or \"assets\" folder in buildDir = %s", buildDir)
-}
-
-func uploadFolder(provider storage.StorageProvider, buildDir string, root string, dir string, ext string, siteName string) (string, error) {
- domainUrl := ""
-
- urlRoot := "/" + root
- dirPath := filepath.Join(buildDir, filepath.FromSlash(dir))
- filenames, err := util.ListFiles(dirPath)
- if err != nil {
- return "", err
- }
-
- filteredFilenames := filterFiles(filenames, ext, siteName)
- for _, filename := range filteredFilenames {
- data, err := os.ReadFile(filepath.Join(dirPath, filename))
- if err != nil {
- return "", err
- }
- fileBuffer := bytes.NewBuffer(data)
-
- objectKey := fmt.Sprintf("%s/%s", dir, filename)
- fileUrl, err := provider.PutObject("Built-in-Untracked", "", objectKey, fileBuffer)
- if err != nil {
- return "", err
- }
-
- index := strings.Index(fileUrl, urlRoot)
- if index == -1 {
- return "", fmt.Errorf("uploadFolder() error, fileUrl should contain \"%s/\", fileUrl = %s", urlRoot, fileUrl)
- }
-
- domainUrl = fileUrl[:index+len(urlRoot)] + "/"
- fmt.Printf("uploadFolder(): [/%s] -> [%s]\n", objectKey, fileUrl)
- }
-
- return domainUrl, nil
-}
-
-func updateHtml(domainUrl string, buildDir string, root string) {
- htmlPath := filepath.Join(buildDir, "index.html")
- html := util.ReadStringFromPath(htmlPath)
-
- html = strings.Replace(html, fmt.Sprintf("\"/%s/", root), fmt.Sprintf("\"%s", domainUrl), -1)
- util.WriteStringToPath(html, htmlPath)
-
- fmt.Printf("updateHtml(): index.html content:\n%s\n%s\n%s\n", strings.Repeat("=", 80), html, strings.Repeat("=", 80))
-}
-
-func gitUploadCdn(providerName string, siteName string) error {
- if providerName == "" {
- return nil
- }
-
- fmt.Printf("gitUploadCdn(): [%s]\n", siteName)
-
- path := GetRepoPath(siteName)
- buildDir := filepath.Join(path, "web/build")
-
- dirs, err := getAssetDirs(buildDir)
- if err != nil {
- return err
- }
-
- provider, err := storage.GetStorageProvider(providerName)
- if err != nil {
- return err
- }
-
- var domainUrl string
- domainUrl, err = uploadFolder(provider, buildDir, dirs.root, dirs.js, "js", siteName)
- if err != nil {
- return err
- }
-
- _, err = uploadFolder(provider, buildDir, dirs.root, dirs.css, "css", siteName)
- if err != nil {
- return err
- }
-
- updateHtml(domainUrl, buildDir, dirs.root)
- return nil
-}
diff --git a/run/database.go b/run/database.go
deleted file mode 100644
index b93d0cb..0000000
--- a/run/database.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2025 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "fmt"
- "strings"
-
- "github.com/apache/casbin-gateway/conf"
- "github.com/xorm-io/xorm"
-)
-
-func gitCreateDatabase(name string) (bool, error) {
- fmt.Printf("gitCreateDatabase(): [%s]\n", name)
- name = strings.Replace(name, "_00", "_", 1)
-
- driverName := "mysql"
- dataSourceName := fmt.Sprintf("root:%s@tcp(localhost:3306)/", conf.GetConfigStringUnquoted("dbPass"))
- engine, err := xorm.NewEngine(driverName, dataSourceName)
- if err != nil {
- return false, err
- }
-
- cmd := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;", name)
- result, err := engine.Exec(cmd)
- if err != nil {
- return false, err
- }
-
- affected, err := result.RowsAffected()
- if err != nil {
- return false, err
- }
-
- engine.Close()
-
- return affected != 0, err
-}
diff --git a/run/database_cloud.go b/run/database_cloud.go
deleted file mode 100644
index dfa50c6..0000000
--- a/run/database_cloud.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2025 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "fmt"
- "strings"
-
- "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
- "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
- "github.com/aliyun/alibaba-cloud-sdk-go/services/rds"
- "github.com/apache/casbin-gateway/conf"
-)
-
-var rdsClient *rds.Client
-
-func InitRdsClient() {
- dbRegionId := conf.GetConfigStringUnquoted("dbRegionId")
- dbAccessKeyId := conf.GetConfigStringUnquoted("dbAccessKeyId")
- dbAccessKeySecret := conf.GetConfigStringUnquoted("dbAccessKeySecret")
-
- if dbRegionId == "" || dbAccessKeyId == "" || dbAccessKeySecret == "" {
- return
- }
-
- config := sdk.NewConfig()
- credential := credentials.NewAccessKeyCredential(dbAccessKeyId, dbAccessKeySecret)
-
- var err error
- rdsClient, err = rds.NewClientWithOptions(dbRegionId, config, credential)
- if err != nil {
- panic(err)
- }
-}
-
-func gitCreateDatabaseCloud(name string) (bool, error) {
- fmt.Printf("gitCreateDatabaseCloud(): [%s]\n", name)
-
- dbInstanceId := conf.GetConfigStringUnquoted("dbInstanceId")
-
- // https://help.aliyun.com/document_detail/26258.htm
- r := rds.CreateCreateDatabaseRequest()
- r.DBInstanceId = dbInstanceId
- r.DBName = name
- r.CharacterSetName = "utf8mb4"
-
- _, err := rdsClient.CreateDatabase(r)
- if err != nil {
- if !strings.Contains(err.Error(), "ErrorCode: InvalidDBName.Duplicate") {
- return false, err
- }
- }
-
- err = addDatabaseUser(name)
- if err != nil {
- return false, err
- }
-
- return true, err
-}
-
-func addDatabaseUser(dbName string) error {
- dbInstanceId := conf.GetConfigStringUnquoted("dbInstanceId")
- dbUser := conf.GetConfigStringUnquoted("dbUser")
-
- // https://help.aliyun.com/document_detail/26266.html
- r := rds.CreateGrantAccountPrivilegeRequest()
- r.DBInstanceId = dbInstanceId
- r.AccountName = dbUser
- r.DBName = dbName
- r.AccountPrivilege = "ReadWrite"
-
- _, err := rdsClient.GrantAccountPrivilege(r)
- if err != nil {
- return err
- }
-
- return nil
-}
diff --git a/run/database_cloud_test.go b/run/database_cloud_test.go
deleted file mode 100644
index 7c30150..0000000
--- a/run/database_cloud_test.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "testing"
-
- "github.com/beego/beego"
-)
-
-func initConfig() {
- err := beego.LoadAppConfig("ini", "../conf/app.conf")
- if err != nil {
- panic(err)
- }
-
- beego.BConfig.WebConfig.Session.SessionOn = true
-}
-
-func TestCreateDatabaseCloud(t *testing.T) {
- initConfig()
- InitRdsClient()
-
- dbName := "casibase_test3"
- _, err := gitCreateDatabaseCloud(dbName)
- if err != nil {
- panic(err)
- }
-}
diff --git a/run/git.go b/run/git.go
deleted file mode 100644
index 2a636cc..0000000
--- a/run/git.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
-)
-
-func gitClone(repoUrl string, path string) error {
- fmt.Printf("gitClone(): [%s]\n", path)
-
- cmd := exec.Command("git", "clone", repoUrl, path)
- return cmd.Run()
-}
-
-func GitDiff(path string) (string, error) {
- cmd := exec.Command("git", "diff")
- cmd.Dir = path
-
- var out bytes.Buffer
- cmd.Stdout = &out
-
- err := cmd.Run()
- if err != nil {
- return "", err
- }
-
- return out.String(), nil
-}
-
-func gitApply(path string, patch string) error {
- fmt.Printf("gitApply(): [%s]\n", path)
-
- tmpFile, err := ioutil.TempFile("", "patch")
- if err != nil {
- return err
- }
- defer os.Remove(tmpFile.Name())
-
- _, err = tmpFile.WriteString(patch)
- if err != nil {
- return err
- }
-
- err = tmpFile.Close()
- if err != nil {
- return err
- }
-
- cmd := exec.Command("git", "apply", tmpFile.Name())
- cmd.Dir = path
- return cmd.Run()
-}
-
-func gitGetLatestCommitHash(path string) (string, error) {
- cmd := exec.Command("git", "rev-parse", "HEAD")
- cmd.Dir = path
- out, err := cmd.Output()
- if err != nil {
- return "", err
- }
-
- return string(out), nil
-}
-
-func gitPull(path string) (bool, error) {
- oldHash, err := gitGetLatestCommitHash(path)
- if err != nil {
- return false, err
- }
-
- cmd := exec.Command("git", "pull", "--rebase", "--autostash")
- cmd.Dir = path
- out, err := cmd.CombinedOutput()
- if err != nil {
- return false, err
- }
-
- newHash, err := gitGetLatestCommitHash(path)
- if err != nil {
- return false, err
- }
-
- affected := oldHash != newHash
-
- if affected {
- fmt.Printf("gitPull(): [%s]\n", path)
- fmt.Printf("Output: %s\n", string(out))
- fmt.Printf("Affected: [%s] -> [%s]\n", oldHash, newHash)
- }
-
- return affected, nil
-}
-
-func gitWebBuild(path string) error {
- webDir := filepath.Join(path, "web")
- fmt.Printf("gitWebBuild(): [%s]\n", webDir)
-
- err := runCmd(webDir, "yarn", "install")
- if err != nil {
- return err
- }
-
- return runCmd(webDir, "yarn", "build")
-}
diff --git a/run/git_test.go b/run/git_test.go
deleted file mode 100644
index ebfb86b..0000000
--- a/run/git_test.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build !skipCi
-// +build !skipCi
-
-package run
-
-import (
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "strings"
- "testing"
-
- "github.com/apache/casbin-gateway/casdoor"
- "github.com/beego/beego"
-)
-
-func TestGitGetDiff(t *testing.T) {
- err := beego.LoadAppConfig("ini", "../conf/app.conf")
- if err != nil {
- panic(err)
- }
-
- //diff := GitDiff("F:/github_repos/casdoor")
- //println(diff)
-
- pid, err := CreateRepo("casdoor_test", true, "", "", "", true)
- if err != nil {
- panic(err)
- }
-
- println(pid)
-}
-
-func TestUploadCdn(t *testing.T) {
- // object.InitConfig()
- casdoor.InitCasdoorConfig()
-
- err := gitUploadCdn("provider_storage_aliyun_oss", "casdoor")
- if err != nil {
- panic(err)
- }
-}
-
-func TestUpdatePort(t *testing.T) {
- appDir := beego.AppConfig.String("appDir")
- err := filepath.Walk(appDir, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- panic(err)
- }
-
- if strings.HasSuffix(path, "/conf/app.conf") {
- var content []byte
- content, err = os.ReadFile(path)
- if err != nil {
- panic(err)
- }
-
- newContent := strings.Replace(string(content), "(localhost:3306)", "(localhost:3306)", -1)
-
- err = ioutil.WriteFile(path, []byte(newContent), info.Mode())
- if err != nil {
- panic(err)
- }
-
- fmt.Printf("Successfully updated: %s\n", path)
- }
-
- return nil
- })
- if err != nil {
- panic(err)
- }
-}
diff --git a/run/run.go b/run/run.go
deleted file mode 100644
index 28af6ca..0000000
--- a/run/run.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "fmt"
- "path/filepath"
- "strings"
-
- "github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/util"
-)
-
-func isTargetRepo(siteName string) bool {
- return strings.HasPrefix(siteName, "cc_") || strings.HasPrefix(siteName, "casibase_customer_") || strings.Count(siteName, "_") == 2
-}
-
-func isFrontendBaseDirEnabledRepo(siteName string) bool {
- if strings.HasPrefix(siteName, "casdoor_") && siteName != "casdoor_my" {
- return true
- }
- if strings.HasPrefix(siteName, "casibase_") && !strings.HasSuffix(siteName, "keli") && !strings.HasSuffix(siteName, "med2") {
- return true
- }
- return strings.HasPrefix(siteName, "opendata_") && siteName != "opendata_my"
-}
-
-func wrapRepoError(function string, path string, err error) (int, error) {
- return 0, fmt.Errorf("%s(): path = %s, %s", function, path, err.Error())
-}
-
-func CreateRepo(siteName string, needStart bool, diff string, providerName string, orgName string, shouldUpgrade bool) (int, error) {
- path := GetRepoPath(siteName)
- if !util.FileExist(path) {
- // For new repositories, always allow creation regardless of upgrade mode
- originalName := getOriginalName(siteName)
- repoUrl := getRepoUrl(originalName)
- err := gitClone(repoUrl, path)
- if err != nil {
- return wrapRepoError("gitClone", path, err)
- }
-
- dbInstanceId := conf.GetConfigStringUnquoted("dbInstanceId")
- if dbInstanceId == "" {
- _, err = gitCreateDatabase(siteName)
- if err != nil {
- return wrapRepoError("gitCreateDatabase", path, err)
- }
- } else {
- _, err = gitCreateDatabaseCloud(siteName)
- if err != nil {
- return wrapRepoError("gitCreateDatabaseCloud", path, err)
- }
- }
-
- needWebBuild := false
- if isTargetRepo(siteName) {
- index := getNameIndex(siteName)
- updateAppConfFile(siteName, index, orgName)
- if index == 0 {
- needWebBuild = true
- }
- } else {
- needWebBuild = true
-
- if diff != "" {
- err = gitApply(path, diff)
- if err != nil {
- return wrapRepoError("gitApply", path, err)
- }
- }
- }
-
- if needWebBuild && !isFrontendBaseDirEnabledRepo(siteName) {
- err = gitWebBuild(path)
- if err != nil {
- return wrapRepoError("gitWebBuild", path, err)
- }
-
- err = gitUploadCdn(providerName, siteName)
- if err != nil {
- return wrapRepoError("gitUploadCdn", path, err)
- }
- }
- } else {
- // For existing repositories, check if upgrade is allowed
- affected := false
- var err error
- if shouldUpgrade {
- affected, err = gitPull(path)
- if err != nil {
- return wrapRepoError("gitPull", path, err)
- }
- }
-
- needWebBuild := false
- if affected {
- if isTargetRepo(siteName) {
- index := getNameIndex(siteName)
- if index == 0 {
- needWebBuild = true
- }
- } else {
- needWebBuild = true
- }
- } else {
- webIndex := filepath.Join(path, "web/build/index.html")
- if !util.FileExist(webIndex) {
- needWebBuild = true
- }
-
- if isTargetRepo(siteName) {
- index := getNameIndex(siteName)
- if index != 0 {
- needWebBuild = false
- }
- }
- }
-
- if needWebBuild && !isFrontendBaseDirEnabledRepo(siteName) {
- err = gitWebBuild(path)
- if err != nil {
- return wrapRepoError("gitWebBuild", path, err)
- }
-
- err = gitUploadCdn(providerName, siteName)
- if err != nil {
- return wrapRepoError("gitUploadCdn", path, err)
- }
- }
-
- if affected {
- if !needStart {
- if !strings.HasPrefix(siteName, "casdoor") && !strings.HasPrefix(siteName, "casibase") && !strings.HasPrefix(siteName, "opendata") {
- err = stopProcess(siteName)
- if err != nil {
- return wrapRepoError("stopProcess", path, err)
- }
- }
-
- err = startProcess(siteName)
- if err != nil {
- return wrapRepoError("startProcess", path, err)
- }
-
- var pid int
- pid, err = getPid(siteName)
- if err != nil {
- return wrapRepoError("getPid", path, err)
- }
-
- return pid, nil
- }
- }
- }
-
- if needStart {
- err := startProcess(siteName)
- if err != nil {
- return wrapRepoError("startProcess", path, err)
- }
-
- pid, err := getPid(siteName)
- if err != nil {
- return wrapRepoError("getPid", path, err)
- }
-
- return pid, nil
- }
-
- return 0, nil
-}
diff --git a/run/util.go b/run/util.go
deleted file mode 100644
index cfbdefa..0000000
--- a/run/util.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "fmt"
- "os"
- "os/exec"
- "strings"
-
- "github.com/apache/casbin-gateway/conf"
- "github.com/apache/casbin-gateway/util"
- "github.com/beego/beego"
-)
-
-func runCmd(dir, name string, args ...string) error {
- cmd := exec.Command(name, args...)
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- cmd.Dir = dir
- return cmd.Run()
-}
-
-func getOriginalName(name string) string {
- tokens := strings.Split(name, "_")
- if len(tokens) > 0 {
- return tokens[0]
- } else {
- return name
- }
-}
-
-func getNameIndex(name string) int {
- tokens := strings.Split(name, "_")
- if len(tokens) > 0 {
- return util.ParseInt(tokens[len(tokens)-1])
- } else {
- panic(fmt.Sprintf("getNameIndex() error, name = %s", name))
- }
-}
-
-func getRepoUrl(name string) string {
- if name == "casdoor" {
- return "https://github.com/casdoor/casdoor"
- } else if name == "casibase" {
- return "https://github.com/casibase/casibase"
- } else if name == "opendata" {
- return "https://github.com/hsluoyz/opendata"
- } else {
- return fmt.Sprintf("https://github.com/casbin/%s", name)
- }
-}
-
-func updateAppConfFile(name string, i int, orgName string) {
- fmt.Printf("updateAppConfFile(): [%s]\n", name)
- confPath := getCodeAppConfPath(name)
- content := util.ReadStringFromPath(confPath)
-
- if strings.HasPrefix(name, "casibase_customer_") {
- shortName := strings.ReplaceAll(name, "casibase_customer_", "cbc")
- if orgName != "" {
- shortName = orgName
- }
-
- content = strings.ReplaceAll(content, "httpport = 14000", fmt.Sprintf("httpport = %d", 40000+i))
- content = strings.ReplaceAll(content, "root", conf.GetConfigStringUnquoted("dbUser"))
- content = strings.ReplaceAll(content, "123456", conf.GetConfigStringUnquoted("dbPass"))
- content = strings.ReplaceAll(content, "localhost:3306", fmt.Sprintf("%s:3306", conf.GetConfigStringUnquoted("dbHost")))
- content = strings.ReplaceAll(content, "dbName = casibase", fmt.Sprintf("dbName = %s", name))
- content = strings.ReplaceAll(content, "redisEndpoint =", fmt.Sprintf("redisEndpoint = \"%s\"", beego.AppConfig.String("redisEndpoint")))
- content = strings.ReplaceAll(content, "disablePreviewMode = false", "disablePreviewMode = true")
- content = strings.ReplaceAll(content, "casdoorEndpoint = https://door.casdoor.com", fmt.Sprintf("casdoorEndpoint = %s", strings.ReplaceAll(conf.GetConfigStringUnquoted("casdoorEndpoint"), "my.", "cbc.")))
- content = strings.ReplaceAll(content, "clientId = af6b5aa958822fb9dc33", fmt.Sprintf("clientId = %s", conf.GetConfigStringUnquoted("clientIdPrefix")+shortName))
- content = strings.ReplaceAll(content, "clientSecret = 8bc3010c1c951c8d876b1f311a901ff8deeb93bc", fmt.Sprintf("clientSecret = %s", conf.GetConfigStringUnquoted("clientSecretPrefix")+shortName))
- content = strings.ReplaceAll(content, "casdoorOrganization = \"casbin\"", fmt.Sprintf("casdoorOrganization = \"%s\"", shortName))
- content = strings.ReplaceAll(content, "casdoorApplication = \"app-casibase\"", fmt.Sprintf("casdoorApplication = \"%s\"", fmt.Sprintf("app-%s", shortName)))
- content = strings.ReplaceAll(content, "isLocalIpDb = false", "isLocalIpDb = true")
- content = strings.ReplaceAll(content, "providerDbName = \"\"", "providerDbName = \"casibase_casbin\"")
- } else if strings.HasPrefix(name, "opendata_customer_") {
- shortName := strings.ReplaceAll(name, "opendata_customer_", "od")
- if orgName != "" {
- shortName = orgName
- }
-
- content = strings.ReplaceAll(content, "httpport = 14000", fmt.Sprintf("httpport = %d", 50000+i))
- content = strings.ReplaceAll(content, "root", conf.GetConfigStringUnquoted("dbUser"))
- content = strings.ReplaceAll(content, "123456", conf.GetConfigStringUnquoted("dbPass"))
- content = strings.ReplaceAll(content, "localhost:3306", fmt.Sprintf("%s:3306", conf.GetConfigStringUnquoted("dbHost")))
- content = strings.ReplaceAll(content, "dbName = opendata", fmt.Sprintf("dbName = %s", name))
- content = strings.ReplaceAll(content, "redisEndpoint =", fmt.Sprintf("redisEndpoint = \"%s\"", beego.AppConfig.String("redisEndpoint")))
- content = strings.ReplaceAll(content, "casdoorEndpoint = https://door.casdoor.com", fmt.Sprintf("casdoorEndpoint = %s", strings.ReplaceAll(conf.GetConfigStringUnquoted("casdoorEndpoint"), "my.", "od.")))
- content = strings.ReplaceAll(content, "clientId = af6b5aa958822fb9dc33", fmt.Sprintf("clientId = %s", conf.GetConfigStringUnquoted("clientIdPrefix")+shortName))
- content = strings.ReplaceAll(content, "clientSecret = 8bc3010c1c951c8d876b1f311a901ff8deeb93bc", fmt.Sprintf("clientSecret = %s", conf.GetConfigStringUnquoted("clientSecretPrefix")+shortName))
- content = strings.ReplaceAll(content, "casdoorOrganization = \"casbin\"", fmt.Sprintf("casdoorOrganization = \"%s\"", shortName))
- content = strings.ReplaceAll(content, "casdoorApplication = \"app-opendata\"", fmt.Sprintf("casdoorApplication = \"%s\"", fmt.Sprintf("app-%s", shortName)))
- } else {
- content = strings.ReplaceAll(content, "httpport = 8000", fmt.Sprintf("httpport = %d", 30000+i))
- content = strings.ReplaceAll(content, "123456", conf.GetConfigStringUnquoted("dbPass"))
- content = strings.ReplaceAll(content, "dbName = casdoor", fmt.Sprintf("dbName = %s", strings.Replace(name, "_00", "_", 1)))
- content = strings.ReplaceAll(content, "redisEndpoint =", "redisEndpoint = \"localhost:6379\"")
- content = strings.ReplaceAll(content, "socks5Proxy = \"127.0.0.1:10808\"", "socks5Proxy =")
- }
-
- util.WriteStringToPath(content, confPath)
-}
diff --git a/run/util_path.go b/run/util_path.go
deleted file mode 100644
index 1c705f5..0000000
--- a/run/util_path.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "encoding/json"
- "fmt"
- "path/filepath"
- "strings"
-
- "github.com/apache/casbin-gateway/conf"
-)
-
-var appMap = map[string]string{}
-
-func InitAppMap() {
- res := conf.GetConfigStringUnquoted("appMap")
- if res != "" {
- err := json.Unmarshal([]byte(res), &appMap)
- if err != nil {
- panic(err)
- }
- }
-}
-
-func getMappedName(name string) string {
- for k, v := range appMap {
- if v != "cc" {
- if name == k {
- return v
- }
- }
- }
- for k, v := range appMap {
- if v == "cc" {
- name = strings.Replace(name, k, v, 1)
- name = strings.Replace(name, "cc_00", "cc_", 1)
- return name
- }
- }
- return name
-}
-
-func GetRepoPath(name string) string {
- name = getMappedName(name)
- appDir := conf.GetConfigStringUnquoted("appDir")
- res := filepath.Join(appDir, name)
- return res
-}
-
-func getCodeAppConfPath(name string) string {
- name = getMappedName(name)
- appDir := conf.GetConfigStringUnquoted("appDir")
- return fmt.Sprintf("%s/%s/conf/app.conf", appDir, name)
-}
diff --git a/run/util_process.go b/run/util_process.go
deleted file mode 100644
index 481199b..0000000
--- a/run/util_process.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
- "bytes"
- "fmt"
- "os/exec"
- "regexp"
- "strconv"
- "strings"
-)
-
-// A site runs in its own console window started from its repo folder. The
-// "title" sets the window title so the user can tell the windows apart, and it
-// is also what identifies the process in the command line listing below.
-var reSiteNames = regexp.MustCompile(`title (\S+) & go run main\.go`)
-
-func getRunCommand(name string) string {
- return fmt.Sprintf("title %s & go run main.go", name)
-}
-
-func parseSiteName(s string) string {
- res := reSiteNames.FindStringSubmatch(s)
- if res == nil {
- return ""
- }
-
- return res[1]
-}
-
-func getSiteNamesFromOutput(output string) map[string]int {
- siteNameMap := map[string]int{}
-
- output = strings.ReplaceAll(output, "\r", "")
- lines := strings.Split(output, "\n")
- for _, line := range lines {
- name := parseSiteName(line)
- if name == "" {
- continue
- }
-
- tokens := strings.Fields(line)
- processId, err := strconv.Atoi(tokens[len(tokens)-1])
- if err != nil {
- continue
- }
-
- siteNameMap[name] = processId
- }
-
- return siteNameMap
-}
-
-func getPid(name string) (int, error) {
- name = getMappedName(name)
-
- psCommand := `Get-CimInstance Win32_Process -Filter "Name='cmd.exe'" | Select-Object CommandLine, ProcessId | ForEach-Object { "$($_.CommandLine) $($_.ProcessId)" }`
- cmd := exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", psCommand)
- var out bytes.Buffer
- var stderr bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &stderr
-
- err := cmd.Run()
- if err != nil {
- return 0, fmt.Errorf("powershell command failed: %v, stderr: %s", err, stderr.String())
- }
-
- siteNameMap := getSiteNamesFromOutput(out.String())
- pid, ok := siteNameMap[name]
- if ok {
- return pid, nil
- } else {
- return 0, fmt.Errorf("getSiteNamesFromOutput() error, name = %s, siteNameMap = %v", name, siteNameMap)
- }
-}
-
-func startProcess(name string) error {
- fmt.Printf("startProcess(): [%s]\n", name)
-
- cmd := exec.Command("cmd", "/C", "start", "", "cmd", "/C", getRunCommand(getMappedName(name)))
- cmd.Dir = GetRepoPath(name)
- return cmd.Run()
-}
-
-func stopProcess(name string) error {
- fmt.Printf("stopProcess(): [%s]\n", name)
-
- pid, err := getPid(name)
- if err != nil {
- // Not running is not an error to report here.
- return nil
- }
-
- cmd := exec.Command("taskkill", "/F", "/T", "/PID", strconv.Itoa(pid))
- return cmd.Run()
-}
-
-func IsProcessActive(pid int) (bool, error) {
- cmd := exec.Command("tasklist", "/FI", fmt.Sprintf("PID eq %d", pid))
- var out bytes.Buffer
- cmd.Stdout = &out
- err := cmd.Run()
- if err != nil {
- return false, err
- }
-
- output := out.String()
- res := strings.Contains(output, strconv.Itoa(pid))
- return res, nil
-}
-
-// IsSiteProcessActive covers the window between "started" and "serving", while
-// go run is still compiling and the port is not up yet.
-func IsSiteProcessActive(name string) (bool, error) {
- _, err := getPid(name)
- if err != nil {
- return false, nil
- }
-
- return true, nil
-}
diff --git a/service/captcha.go b/service/captcha.go
deleted file mode 100644
index 59d54ab..0000000
--- a/service/captcha.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package service
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "mime/multipart"
- "net/http"
- "time"
-
- "github.com/apache/casbin-gateway/auth"
- "github.com/apache/casbin-gateway/conf"
- "github.com/google/uuid"
-)
-
-type verifyResponse struct {
- Status string `json:"status"`
- Msg string `json:"msg"`
- Sub string `json:"sub"`
- Name string `json:"name"`
- Data bool `json:"data"`
- Data2 interface{} `json:"data2"`
-}
-
-var verifiedSession = make(map[string]time.Time)
-
-func redirectToCaptcha(w http.ResponseWriter, r *http.Request) {
- // The CAPTCHA challenge page is served by Casdoor. Without an endpoint the
- // redirect would just loop back into the proxied site, so say why instead.
- if !conf.IsCasdoorAvailable() {
- responseError(w, "Casbin Gateway error: the CAPTCHA rule action requires a \"casdoorEndpoint\" in app.conf")
- return
- }
-
- scheme := getScheme(r)
- callbackUrl := fmt.Sprintf("%s://%s/_captcha-verify", scheme, r.Host)
- captchaUri := fmt.Sprintf(
- "%s/captcha?client_id=%s&redirect_uri=%s&state=%s",
- getCasdoorEndpoint(),
- conf.GetConfigString("clientId"),
- callbackUrl,
- conf.GetConfigString("casdoorApplication"),
- )
- http.Redirect(w, r, captchaUri, http.StatusFound)
-}
-
-func handleCaptchaCallback(w http.ResponseWriter, r *http.Request) {
- host := r.Host
-
- code := r.URL.Query().Get("code")
- typeStr := r.URL.Query().Get("type")
- secret := r.URL.Query().Get("secret")
- applicationId := r.URL.Query().Get("applicationId")
- if code == "" || typeStr == "" || secret == "" || applicationId == "" {
- redirectToCaptcha(w, r)
- }
-
- var b bytes.Buffer
- writer := multipart.NewWriter(&b)
- _ = writer.WriteField("captchaToken", code)
- _ = writer.WriteField("clientSecret", secret)
- _ = writer.WriteField("applicationId", applicationId)
- _ = writer.WriteField("captchaType", typeStr)
- _ = writer.Close()
- verifyURL := auth.GetUrl("verify-captcha", nil)
- req, err := http.NewRequest("POST", verifyURL, &b)
- if err != nil {
- redirectToCaptcha(w, r)
- }
- req.Header.Set("Content-Type", writer.FormDataContentType())
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- redirectToCaptcha(w, r)
- }
- // read response
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- redirectToCaptcha(w, r)
- }
- // parse response
- var vr verifyResponse
- err = json.Unmarshal(body, &vr)
- if err != nil {
- redirectToCaptcha(w, r)
- }
- if vr.Status != "ok" || !vr.Data {
- redirectToCaptcha(w, r)
- }
- // set verified session
- uuidStr := uuid.NewString()
- verifiedSession[uuidStr] = time.Now()
- cookie := &http.Cookie{
- Name: "casdoor_captcha_token",
- Value: uuidStr,
- Path: "/",
... 7014 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org