diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a418a0fc5fe..d84111647a5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,9 +30,9 @@ jobs: libc6-dev-arm64-cross \ file - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Build ${{ matrix.arch }} @@ -43,7 +43,7 @@ jobs: run: | ./build.sh -v $VER -a ${{ matrix.arch }} -s - name: Archive artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: dist-linux-${{ matrix.arch }} path: build/linux/**/* @@ -60,16 +60,16 @@ jobs: run: | brew install coreutils gnu-tar - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Build ${{ matrix.arch }} run: | ./build.sh -v $VER -a ${{ matrix.arch }} - name: Archive artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: dist-darwin-${{ matrix.arch }} path: build/darwin/**/* @@ -85,7 +85,7 @@ jobs: run: | brew install coreutils gnu-tar - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Build universal run: | export WORKDIR=$PWD/build/darwin/universal/$VER @@ -112,7 +112,7 @@ jobs: ls -alh $WORKDIR/* sha256sum $WORKDIR/* - name: Archive artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: dist-darwin-universal path: build/darwin/**/* @@ -125,9 +125,9 @@ jobs: - name: Install build dependencies run: choco install zip - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Build amd64 @@ -135,7 +135,7 @@ jobs: run: | ./build.sh -v $VER - name: Archive artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: dist-windows path: build/windows/**/* @@ -151,7 +151,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/v') diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6d3ac9d9362..b4462790e34 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,7 @@ jobs: - 1433:1433 steps: - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: stable - name: Install Packages @@ -39,7 +39,7 @@ jobs: sudo apt-get -qq update sudo apt-get install -y build-essential libicu-dev unixodbc unixodbc-dev - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Unit Tests run: go test -v ./stmt - name: Build with all drivers diff --git a/LICENSE b/LICENSE index 8f7419d5574..9c3985ece51 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2023 Kenneth Shaw +Copyright (c) 2016-2024 Kenneth Shaw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6658573d6bf..353afc9955d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -

+

-

+
-

+

Installing | Building | Database Support | @@ -10,7 +10,7 @@ Features and Compatibility | Releases | Contributing -

+

@@ -23,7 +23,8 @@ via a command-line inspired by PostgreSQL's `psql`. `usql` supports most of the core `psql` features, such as [variables][variables], [backticks][backticks], [backslash commands][commands] and has additional features that `psql` does not, such as [multiple database support][databases], [copying between databases][copying], -[syntax highlighting][highlighting], and [context-based completion][completion]. +[syntax highlighting][highlighting], [context-based completion][completion], +and [terminal graphics][termgraphics]. Database administrators and developers that would prefer to work with a tool like `psql` with non-PostgreSQL databases, will find `usql` intuitive, @@ -49,13 +50,14 @@ for other databases. ## Installing `usql` can be installed [via Release][], [via Homebrew][], [via AUR][], [via -Scoop][] or [via Go][]: +Scoop][], [via Go][], or [via Docker][]: [via Release]: #installing-via-release [via Homebrew]: #installing-via-homebrew-macos-and-linux [via AUR]: #installing-via-aur-arch-linux [via Scoop]: #installing-via-scoop-windows [via Go]: #installing-via-go +[via Docker]: #installing-via-docker ### Installing via Release @@ -137,6 +139,45 @@ $ go install -tags most github.com/xo/usql@latest See [below for information](#building) on `usql` build tags. +### Installing via Docker + +An [official container image (`docker.io/usql/usql`)][docker-hub] is maintained +by the `usql` team, and can be used with Docker, Podman, or other container +runtime. + +[docker-hub]: https://hub.docker.com/r/usql/usql + +Install `usql` with Docker, Podman, or other container runtime: + +```sh +# run interactive shell and mount the $PWD/data directory as a volume for use +# within the container +$ docker run --rm -it --volume $(pwd)/data:/data docker.io/usql/usql:latest sqlite3://data/test.db +Trying to pull docker.io/usql/usql:latest... +Getting image source signatures +Copying blob af48168d69d8 done | +Copying blob efc2b5ad9eec skipped: already exists +Copying config 917ceb411d done | +Writing manifest to image destination +Connected with driver sqlite3 (SQLite3 3.45.1) +Type "help" for help. + +sq:data/test.db=> \q + +# run postgres locally +$ docker run --detach --rm --name=postgres --publish=5432:5432 --env=POSTGRES_PASSWORD=P4ssw0rd docker.io/usql/postgres + +# connect to local postgres instance +$ docker run --rm --network host -it docker.io/usql/usql:latest postgres://postgres:P4ssw0rd@localhost +Connected with driver postgres (PostgreSQL 16.3 (Debian 16.3-1.pgdg120+1)) +Type "help" for help. + +pg:postgres@localhost=> \q + +# run specific usql version +$ docker run --rm -it docker.io/usql/usql:0.19.3 +``` + ## Building When building `usql` out-of-the-box with `go build` or `go install`, only the @@ -181,7 +222,7 @@ $ go install -tags all github.com/xo/usql@master `usql` works with all Go standard library compatible SQL drivers supported by [`github.com/xo/dburl`][dburl]. -The list of drivers that `usql` was built with can be displayed using the +The list of drivers that `usql` was built with can be displayed with the [`\drivers` command][commands]: ```sh @@ -214,8 +255,9 @@ The following are the [Go SQL drivers][go-sql] that `usql` supports, the associated database, scheme / build tag, and scheme aliases: + | Database | Scheme / Tag | Scheme Aliases | Driver Package / Notes | -|----------------------|-----------------|-------------------------------------------------|-----------------------------------------------------------------------------| +| -------------------- | --------------- | ----------------------------------------------- | --------------------------------------------------------------------------- | | PostgreSQL | `postgres` | `pg`, `pgsql`, `postgresql` | [github.com/lib/pq][d-postgres] | | MySQL | `mysql` | `my`, `maria`, `aurora`, `mariadb`, `percona` | [github.com/go-sql-driver/mysql][d-mysql] | | Microsoft SQL Server | `sqlserver` | `ms`, `mssql`, `azuresql` | [github.com/microsoft/go-mssqldb][d-sqlserver] | @@ -233,9 +275,10 @@ associated database, scheme / build tag, and scheme aliases: | AWS Athena | `athena` | `s3`, `aws`, `awsathena` | [github.com/uber/athenadriver/go][d-athena] | | Azure CosmosDB | `cosmos` | `cm` | [github.com/btnguyen2k/gocosmos][d-cosmos] | | Cassandra | `cassandra` | `ca`, `scy`, `scylla`, `datastax`, `cql` | [github.com/MichaelS11/go-cql-driver][d-cassandra] | +| ChaiSQL | `chai` | `ci`, `genji`, `chaisql` | [github.com/chaisql/chai/driver][d-chai] | | Couchbase | `couchbase` | `n1`, `n1ql` | [github.com/couchbase/go_n1ql][d-couchbase] | | Cznic QL | `ql` | `cznic`, `cznicql` | [modernc.org/ql][d-ql] | -| Databend | `databend` | `dd`, `bend` | [github.com/databendcloud/databend-go][d-databend] | +| Databend | `databend` | `dd`, `bend` | [github.com/datafuselabs/databend-go][d-databend] | | Databricks | `databricks` | `br`, `brick`, `bricks`, `databrick` | [github.com/databricks/databricks-sql-go][d-databricks] | | DuckDB | `duckdb` | `dk`, `ddb`, `duck`, `file` | [github.com/marcboeker/go-duckdb][d-duckdb] [†][f-cgo] | | DynamoDb | `dynamodb` | `dy`, `dyn`, `dynamo`, `dynamodb` | [github.com/btnguyen2k/godynamo][d-dynamodb] | @@ -250,6 +293,7 @@ associated database, scheme / build tag, and scheme aliases: | Netezza | `netezza` | `nz`, `nzgo` | [github.com/IBM/nzgo/v12][d-netezza] | | PostgreSQL PGX | `pgx` | `px` | [github.com/jackc/pgx/v5/stdlib][d-pgx] | | Presto | `presto` | `pr`, `prs`, `prestos`, `prestodb`, `prestodbs` | [github.com/prestodb/presto-go-client/presto][d-presto] | +| RamSQL | `ramsql` | `rm`, `ram` | [github.com/proullon/ramsql/driver][d-ramsql] | | SAP ASE | `sapase` | `ax`, `ase`, `tds` | [github.com/thda/tds][d-sapase] | | SAP HANA | `saphana` | `sa`, `sap`, `hana`, `hdb` | [github.com/SAP/go-hdb/driver][d-saphana] | | Snowflake | `snowflake` | `sf` | [github.com/snowflakedb/gosnowflake][d-snowflake] | @@ -269,7 +313,6 @@ associated database, scheme / build tag, and scheme aliases: | Vitess Database | `mysql` | `vt`, `vitess` | [github.com/go-sql-driver/mysql][d-mysql] [‡][f-wire] | | | | | | | Apache Impala | `impala` | `im` | [github.com/bippio/go-impala][d-impala] | -| Genji | `genji` | `gj` | [github.com/genjidb/genji/driver][d-genji] | | | | | | | **NO DRIVERS** | `no_base` | | _no base drivers (useful for development)_ | | **MOST DRIVERS** | `most` | | _all stable drivers_ | @@ -282,18 +325,18 @@ associated database, scheme / build tag, and scheme aliases: [d-avatica]: https://github.com/apache/calcite-avatica-go [d-bigquery]: https://github.com/go-gorm/bigquery [d-cassandra]: https://github.com/MichaelS11/go-cql-driver +[d-chai]: https://github.com/chaisql/chai [d-clickhouse]: https://github.com/ClickHouse/clickhouse-go [d-cosmos]: https://github.com/btnguyen2k/gocosmos [d-couchbase]: https://github.com/couchbase/go_n1ql [d-csvq]: https://github.com/mithrandie/csvq-driver -[d-databend]: https://github.com/databendcloud/databend-go +[d-databend]: https://github.com/datafuselabs/databend-go [d-databricks]: https://github.com/databricks/databricks-sql-go [d-duckdb]: https://github.com/marcboeker/go-duckdb [d-dynamodb]: https://github.com/btnguyen2k/godynamo [d-exasol]: https://github.com/exasol/exasol-driver-go [d-firebird]: https://github.com/nakagami/firebirdsql [d-flightsql]: https://github.com/apache/arrow/tree/main/go/arrow/flight/flightsql/driver -[d-genji]: https://github.com/genjidb/genji [d-godror]: https://github.com/godror/godror [d-h2]: https://github.com/jmrobles/h2go [d-hive]: https://github.com/sql-machine-learning/gohive @@ -311,6 +354,7 @@ associated database, scheme / build tag, and scheme aliases: [d-postgres]: https://github.com/lib/pq [d-presto]: https://github.com/prestodb/presto-go-client [d-ql]: https://gitlab.com/cznic/ql +[d-ramsql]: https://github.com/proullon/ramsql [d-sapase]: https://github.com/thda/tds [d-saphana]: https://github.com/SAP/go-hdb [d-snowflake]: https://github.com/snowflakedb/gosnowflake @@ -321,6 +365,7 @@ associated database, scheme / build tag, and scheme aliases: [d-vertica]: https://github.com/vertica/vertica-sql-go [d-voltdb]: https://github.com/VoltDB/voltdb-client-go [d-ydb]: https://github.com/ydb-platform/ydb-go-sdk + [f-cgo]: #f-cgo "Requires CGO" @@ -333,7 +378,7 @@ associated database, scheme / build tag, and scheme aliases:

-Any of the protocol schemes/aliases shown above can be used in conjunction when +Any of the protocol schemes/aliases above can be used in conjunction when connecting to a database via the command-line or with the [`\connect` and `\copy` commands][commands]: @@ -375,38 +420,38 @@ $ usql --help usql, the universal command-line interface for SQL databases Usage: - usql [OPTIONS]... [DSN] + usql [flags]... [DSN] Arguments: - DSN database url - -Options: - -c, --command=COMMAND ... run only single command (SQL or internal) and exit - -f, --file=FILE ... execute commands from file and exit - -w, --no-password never prompt for password - -X, --no-rc do not read start up file - -o, --out=OUT output file - -W, --password force password prompt (should happen automatically) - -1, --single-transaction execute as a single transaction (if non-interactive) - -v, --set=, --variable=NAME=VALUE ... - set variable NAME to VALUE - -P, --pset=VAR[=ARG] ... set printing option VAR to ARG (see \pset command) - -F, --field-separator=FIELD-SEPARATOR ... - field separator for unaligned output (default, "|") - -R, --record-separator=RECORD-SEPARATOR ... - record separator for unaligned output (default, \n) - -T, --table-attr=TABLE-ATTR ... - set HTML table tag attributes (e.g., width, border) - -A, --no-align unaligned table output mode - -H, --html HTML table output mode - -t, --tuples-only print rows only - -x, --expanded turn on expanded table output - -z, --field-separator-zero set field separator for unaligned output to zero byte - -0, --record-separator-zero set record separator for unaligned output to zero byte - -J, --json JSON output mode - -C, --csv CSV output mode - -G, --vertical vertical output mode - -V, --version display version and exit + DSN database url or connection name + +Flags: + -c, --command COMMAND run only single command (SQL or internal) and exit + -f, --file FILE execute commands from file and exit + -w, --no-password never prompt for password + -X, --no-init do not execute initialization scripts (aliases: --no-rc --no-psqlrc --no-usqlrc) + -o, --out FILE output file + -W, --password force password prompt (should happen automatically) + -1, --single-transaction execute as a single transaction (if non-interactive) + -v, --set NAME=VALUE set variable NAME to VALUE (see \set command, aliases: --var --variable) + -N, --cset NAME=DSN set named connection NAME to DSN (see \cset command) + -P, --pset VAR=ARG set printing option VAR to ARG (see \pset command) + -F, --field-separator FIELD-SEPARATOR field separator for unaligned and CSV output (default "|" and ",") + -R, --record-separator RECORD-SEPARATOR record separator for unaligned and CSV output (default \n) + -T, --table-attr TABLE-ATTR set HTML table tag attributes (e.g., width, border) + -A, --no-align unaligned table output mode + -H, --html HTML table output mode + -t, --tuples-only print rows only + -x, --expanded turn on expanded table output + -z, --field-separator-zero set field separator for unaligned and CSV output to zero byte + -0, --record-separator-zero set record separator for unaligned and CSV output to zero byte + -J, --json JSON output mode + -C, --csv CSV output mode + -G, --vertical vertical output mode + -q, --quiet run quietly (no messages, only query output) + --config string config file + -V, --version output version information, then exit + -?, --help show this help, then exit ``` ### Connecting to Databases @@ -417,12 +462,18 @@ connection strings (aka "data source name" or DSNs) have the same parsing rules as URLs, and can be passed to `usql` via command-line, or to the [`\connect`, `\c`, and `\copy` commands][commands]. +Database connections can be defined with [the `\cset` command][connection-vars] +or in [the `config.yaml` configuration file][config]. + +#### Database Connection Strings + Database connection strings look like the following: ```txt - driver+transport://user:pass@host/dbname?opt1=a&opt2=b - driver:/path/to/file - /path/to/file + driver+transport://user:pass@host/dbname?opt1=a&opt2=b + driver:/path/to/file + /path/to/file + name ``` Where the above are: @@ -437,6 +488,7 @@ Where the above are: | `dbname` [±][f-path] | database name, instance, or service name/ID | | `?opt1=a&...` | additional database driver options (see respective SQL driver for available options) | | `/path/to/file` | a path on disk | +| `name` | a connection name set by [`\cset`][connection-vars] or in [`config.yaml`][config] | [f-path]: #f-path "URL Paths for Databases" @@ -475,10 +527,10 @@ If a URL does not have a `driver:` scheme, `usql` will check if it is a path on disk. If the path exists, `usql` will attempt to use an appropriate database driver to open the path. -When the path is a Unix Domain Socket, `usql` will attempt to open it using the +When the path is a Unix Domain Socket, `usql` will attempt to open it with the MySQL driver. When the path is a directory, `usql` will attempt to open it using the PostgreSQL driver. And, lastly, when the path is a regular file, -`usql` will attempt to open the file using the SQLite3 driver. +`usql` will attempt to open the file using the SQLite3 or DuckDB drivers. #### Driver Defaults @@ -537,8 +589,8 @@ $ usql ca:// # connect to a sqlite database that exists on disk $ usql dbname.sqlite3 -# Note: when connecting to a SQLite database, if the "://" or -# ":" scheme/alias is omitted, the file must already exist on disk. +# Note: when connecting to a SQLite database, if the "driver://" or +# "driver:" scheme/alias is omitted, the file must already exist on disk. # # if the file does not yet exist, the URL must incorporate file:, sq:, sqlite3:, # or any other recognized sqlite3 driver alias to force usql to create a new, @@ -551,6 +603,12 @@ $ usql file:/path/to/dbname.sqlite3 $ usql adodb://Microsoft.Jet.OLEDB.4.0/myfile.mdb $ usql "adodb://Microsoft.ACE.OLEDB.12.0/?Extended+Properties=\"Text;HDR=NO;FMT=Delimited\"" +# connect to a named connection in $HOME/.config/usql/config.yaml +$ cat $HOME/.config/usql/config.yaml +connections: + my_named_connection: sqlserver://user:pass@localhost/ +$ usql my_named_connection + # connect with ODBC driver (requires building with odbc tag) $ cat /etc/odbcinst.ini [DB2] @@ -566,15 +624,19 @@ Setup=libodbcpsqlS.so Debug=0 CommLog=1 UsageCount=1 -# connect to db2, postgres databases using ODBC + +# connect to db2, postgres databases using odbc config above $ usql odbc+DB2://user:pass@localhost/dbname $ usql odbc+PostgreSQL+ANSI://user:pass@localhost/dbname?TraceFile=/path/to/trace.log ``` +See the [section on connection variables][connection-vars] for information on +defining connection names. + ### Executing Queries and Commands -The interactive intrepreter reads queries and [meta (`\`) commands][commands], -sending the query to the connected database: +The interactive interpreter reads queries and [backslash meta (`\`) +commands][commands], sending the query to the connected database: ```sh $ usql sqlite://example.sqlite3 @@ -620,7 +682,16 @@ or `"`. Command parameters [may also be backticked][backticks]. ### Backslash Commands -Currently available commands: +`usql` supports interleaved backslash (`\`) meta commands to modify or alter +the way that `usql` interprets queries, formats its output, and changes the +resulting interactive flow. + +```sh +(not connected)=> \c postgres://user:pass@localhost +pg:user@localhost=> select * from my_table \G +``` + +Available backslash meta commands can be displayed with `\?`: ```sh $ usql @@ -640,6 +711,7 @@ Query Execute \gset [PREFIX] execute query and store results in usql variables \gx [(OPTIONS)] [FILE] as \g, but forces expanded output mode \watch [(OPTIONS)] [DURATION] execute query every specified interval + \bind [PARAM]... set query parameters Query Buffer \e [FILE] [LINE] edit the query buffer (or file) with external editor @@ -683,8 +755,8 @@ Formatting \C [STRING] set table title, or unset if none \f [STRING] show or set field separator for unaligned query output \H toggle HTML output mode - \t [on|off] show only rows \T [STRING] set HTML tag attributes, or unset if none + \t [on|off] show only rows \x [on|off|auto] toggle expanded output Transaction @@ -696,61 +768,129 @@ Transaction Connection \c DSN connect to database url \c DRIVER PARAMS... connect to database with driver and parameters + \cset [NAME [DSN]] set named connection, or list all if no parameters + \cset NAME DRIVER PARAMS... define named connection for database driver \Z close database connection \password [USERNAME] change the password for a user \conninfo display information about the current database connection Operating System \cd [DIR] change the current working directory + \getenv VARNAME ENVVAR fetch environment variable \setenv NAME [VALUE] set or unset environment variable \! [COMMAND] execute command in shell or start interactive shell \timing [on|off] toggle timing of commands Variables - \prompt [-TYPE] [PROMPT] prompt user to set variable + \prompt [-TYPE] VAR [PROMPT] prompt user to set variable \set [NAME [VALUE]] set internal variable, or list all if no parameters \unset NAME unset (delete) internal variable ``` +Parameters passed to commands [can be backticked][backticks]. + ## Features and Compatibility -An overview of `usql`'s features, functionality, and compability with `psql`: +An overview of `usql`'s features, functionality, and compatibility with `psql`: -- [Variables and Interpolation][variables] +- [Configuration][config] +- [Variables][variables] - [Backticks][backticks] -- [Passwords][usqlpass] -- [Runtime Configuration (RC) File][usqlrc] - [Copying Between Databases][copying] - [Syntax Highlighting][highlighting] - [Time Formatting][timefmt] - [Context Completion][completion] - [Host Connection Information](#host-connection-information) +- [Passwords][usqlpass] +- [Runtime Configuration (RC) File][usqlrc] The `usql` project's goal is to support as much of `psql`'s core features and functionality, and aims to be as compatible as possible - [contributions are always appreciated][contributing]! -#### Variables and Interpolation +#### Configuration + +During its initialization phase, `usql` reads a standard [YAML configuration][yaml] +file `config.yaml`. On Windows this is `%AppData%/usql/config.yaml`, on macOS +this is `$HOME/Library/Application Support/usql/config.yaml`, and on Linux and +other Unix systems this is normally `$HOME/.config/usql/config.yaml`. + +##### `connections:` + +[Named connection DSNs][connecting] can be defined under `connections:` as a string +or as a map: + +```yaml +connections: + my_couchbase_conn: couchbase://Administrator:P4ssw0rd@localhost + my_clickhouse_conn: clickhouse://clickhouse:P4ssw0rd@localhost + my_godror_conn: + protocol: godror + username: system + password: P4ssw0rd + hostname: localhost + port: 1521 + database: free +``` -To see the list of specially treated variables, run the `\? variables` command. +Defined `connections:` can be used on the command-line with `\connect`, `\c`, +`\copy`, and [other commands][commands]: -`usql` supports client-side interpolation of variables that can be `\set` and -`\unset`: +```sh +$ usql my_godror_conn +Connected with driver godror (Oracle Database 23.0.0.0.0) +Type "help" for help. + +gr:system@localhost/free=> +``` + +##### `init:` + +An initialization script can be defined as `init:`: + +```yaml +init: | + \echo welcome to the jungle `date` + \set SYNTAX_HL_STYLE paraiso-dark +``` + +The `init:` script is commonly used to set [environment variables][variables] +or other configuration, and can be disabled on the command-line using the +`--no-init` / `-X` flag. The script will be executed prior to any `-c` / +`--command` / `-f` / `--file` flag and before starting the interactive +interpreter. + +##### Other Options + +Please see [`contrib/config.yaml`](contrib/config.yaml) for an overview of +available configuration options. + +#### Variables + +`usql` supports [runtime][runtime-vars], [connection][connection-vars], and +[display formatting][print-vars] variables that can be `\set`, `\cset`, or +`\pset` respectively. + +##### Runtime Variables + +Runtime variables are managed with the `\set` and `\unset` [commands][commands]: ```sh -$ usql -(not connected)=> \set +(not connected)=> \unset FOO (not connected)=> \set FOO bar +``` + +Runtime variables can be displayed with `\set`: + +```sh (not connected)=> \set FOO = 'bar' -(not connected)=> \unset FOO -(not connected)=> \set -(not connected)=> ``` -A `\set` variable, `NAME`, will be directly interpolated (by string -substitution) into the query when prefixed with `:` and optionally surrounded -by quotation marks (`'` or `"`): +###### Variable Interpolation + +When a runtime variable `NAME` has been `\set`, then `:NAME`, `:'NAME'`, and +`:"NAME"` will be interpolated into the query buffer: ```sh pg:booktest@localhost=> \set FOO bar @@ -761,28 +901,28 @@ pg:booktest@localhost=> select * from authors where name = :'FOO'; (1 rows) ``` -The three forms, `:NAME`, `:'NAME'`, and `:"NAME"`, are used to interpolate a -variable in parts of a query that may require quoting, such as for a column -name, or when doing concatenation in a query: +Where a runtime variable is used as `:'NAME'` or `:"NAME"` the interpolated +value will be quoted using `'` or `"` respectively: ```sh pg:booktest@localhost=> \set TBLNAME authors pg:booktest@localhost=> \set COLNAME name pg:booktest@localhost=> \set FOO bar pg:booktest@localhost=> select * from :TBLNAME where :"COLNAME" = :'FOO' +``` + +The query buffer and interpolated values can be displayed with `\p` and +`\print`, or the raw query buffer can be displayed with `\raw`: + +```sh pg:booktest@localhost-> \p select * from authors where "name" = 'bar' pg:booktest@localhost-> \raw select * from :TBLNAME where :"COLNAME" = :'FOO' -pg:booktest@localhost-> \g - author_id | name -+-----------+------+ - 7 | bar -(1 rows) - -pg:booktest@localhost=> ``` +
+ > **Note** > > Variables contained within other strings will not be interpolated: @@ -796,86 +936,85 @@ pg:booktest@localhost=> select ':FOO'; pg:booktest@localhost=> \p select ':FOO'; -pg:booktest@localhost=> ``` -#### Backticks +
+ +##### Connection Variables -[Meta (`\`) commands][commands] support backticks on parameters: +Connection variables work similarly to runtime variables, and are managed with +`\cset`. Connection variables can be used with the `\c`, `\connect`, `\copy`, +or [other commands][commands]: ```sh -(not connected)=> \echo Welcome `echo $USER` -- 'currently:' "(" `date` ")" -Welcome ken -- currently: ( Wed Jun 13 12:10:27 WIB 2018 ) -(not connected)=> +(not connected)=> \cset my_conn postgres://user:pass@localhost +(not connected)=> \c my_conn +Connected with driver postgres (PostgreSQL 16.2 (Debian 16.2-1.pgdg120+2)) +pg:postgres@localhost=> ``` -Backticked parameters will be passed to the user's `SHELL`, exactly as written, -and can be combined with `\set`: +Connection variables are not interpolated into queries. See the [configuration +section for information on defining persistent connection variables][config]. + +Connection variables can be displayed with `\cset`: ```sh -pg:booktest@localhost=> \set MYVAR `date` -pg:booktest@localhost=> \set -MYVAR = 'Wed Jun 13 12:17:11 WIB 2018' -pg:booktest@localhost=> \echo :MYVAR -Wed Jun 13 12:17:11 WIB 2018 -pg:booktest@localhost=> +(not connected)=> \cset +my_conn = 'postgres://user:pass@localhost' ``` -#### Passwords +##### Display Formatting (Print) Variables -`usql` supports reading passwords for databases from a `.usqlpass` file -contained in the user's `HOME` directory at startup: +Display formatting variables can be set using `\pset` and [other +commands][commands]: ```sh -$ cat $HOME/.usqlpass -# format is: -# protocol:host:port:dbname:user:pass -postgres:*:*:*:booktest:booktest -$ usql pg:// -Connected with driver postgres (PostgreSQL 9.6.9) -Type "help" for help. - -pg:booktest@=> +(not connected)=> \pset time Kitchen +Time display is "Kitchen" ("3:04PM"). +(not connected)=> \a +Output format is unaligned. ``` -> **Note** -> -> The `.usqlpass` file cannot be readable by other users, and the permissions -> should be set accordingly: +Display formatting variables can be displayed with `\pset`: ```sh -chmod 0600 ~/.usqlpass +(not connected)=> \pset +time Kitchen ``` -#### Runtime Configuration (RC) File +##### Other Variables -`usql` supports executing a `.usqlrc` runtime configuration (RC) file contained -in the user's `HOME` directory: +Runtime behavior, such as [enabling or disabling syntax +highlighting][highlighting] can be modified through special variables like +[`SYNTAX_HL`][highlighting]. + +Use the `\? variables` [command][commands] to display variable help information +and to list special variables recognized by `usql`: ```sh -$ cat $HOME/.usqlrc -\echo WELCOME TO THE JUNGLE `date` -\set SYNTAX_HL_STYLE paraiso-dark -# display color prompt (default is prompt is "%S%m%/%R%#" ) -\set PROMPT1 "\033[32m%S%m%/%R%#\033[0m" -$ usql -WELCOME TO THE JUNGLE Thu Jun 14 02:36:53 WIB 2018 -Type "help" for help. +(not connected)=> \? variables +``` -(not connected)=> \set -SYNTAX_HL_STYLE = 'paraiso-dark' +#### Backticks + +[Backslash (`\`) meta commands][commands] support backticks on parameters: + +```sh +(not connected)=> \echo Welcome `echo $USER` -- 'currently:' "(" `date` ")" +Welcome ken -- currently: ( Wed Jun 13 12:10:27 WIB 2018 ) (not connected)=> ``` -The `.usqlrc` file is read at startup in the same way as a file passed on the -command-line with `-f` / `--file`. It is commonly used to set startup -environment variables and settings. - -RC-file execution can be temporarily disabled at startup by passing `-X` or -`--no-rc` on the command-line: +Backticked parameters will be passed to the user's `SHELL`, exactly as written, +and can be combined with `\set`: ```sh -$ usql --no-rc pg:// +pg:booktest@localhost=> \set MYVAR `date` +pg:booktest@localhost=> \set +MYVAR = 'Wed Jun 13 12:17:11 WIB 2018' +pg:booktest@localhost=> \echo :MYVAR +Wed Jun 13 12:17:11 WIB 2018 +pg:booktest@localhost=> ``` #### Copying Between Databases @@ -884,23 +1023,38 @@ $ usql --no-rc pg:// and writes to a destination database DSN: ```sh -$ usql -(not connected)=> \copy :PGDSN :MYDSN 'select book_id, author_id from books' 'books(id, author_id)' +(not connected)=> \cset PGDSN postgres://user:pass@localhost +(not connected)=> \cset MYDSN mysql://user:pass@localhost +(not connected)=> \copy PGDSN MYDSN 'select book_id, author_id from books' 'books(id, author_id)' ``` +As demonstrated above, the `\copy` command does not require being connected to +a database, and will not modify or change the current open database connection +or state. + +Any valid URL or DSN name maybe used for the source and destination database: + +```sh +(not connected)=> \cset MYDSN mysql://user:pass@localhost +(not connected)=> \copy postgres://user:pass@localhost MYDSN 'select book_id, author_id from books' 'books(id, author_id)' +``` + +
+ > **Note** > > `usql`'s `\copy` is distinct from and does not function like > `psql`'s `\copy`. -##### Parameters +
+ +##### Copy Parameters The `\copy` command has two parameter forms: ```txt -SRC DST QUERY TABLE - -SRC DST QUERY TABLE(COL1, COL2, ..., COLN) +\copy SRC DST QUERY TABLE +\copy SRC DST QUERY TABLE(COL1, COL2, ..., COLN) ``` Where: @@ -943,7 +1097,7 @@ error: failed to prepare insert query: 2 values for 1 columns COPY 2 ``` -###### Datatype Compatibilty and Casting +###### Datatype Compatibility and Casting The `\copy` command does not attempt to perform any kind of datatype conversion. @@ -1014,11 +1168,15 @@ sq:booktest.db=> select * from books; (4 rows) ``` +
+ > **Note** > > When importing large datasets (> 1GiB) from one database to another, it is > better to use a database's native clients and tools. +
+ ###### Reusing Connections with Copy The `\copy` command (and all `usql` commands) [works with variables][variables]. @@ -1103,7 +1261,7 @@ Command completion can be canceled with ``. Some databases support time/date columns that [support formatting][go-time]. By default, `usql` formats time/date columns as [RFC3339Nano][go-time], and can be -set using `\pset time `: +set using `\pset time FORMAT`: ```sh $ usql pg:// @@ -1193,6 +1351,140 @@ Connected with driver postgres (PostgreSQL 9.6.9) pg:booktest@=> ``` +#### Terminal Graphics + +`usql` supports terminal graphics for [Kitty][kitty-graphics], [iTerm][iterm-graphics], +and [Sixel][sixel-graphics] enabled terminals using the [`github.com/kenshaw/rasterm` package][rasterm]. +Terminal graphics are only available when using the interactive shell. + +##### Detection and Support + +`usql` will attempt to detect when terminal graphics support is available using +the `USQL_TERM_GRAPHICS`, `TERM_GRAPHICS` and other environment variables +unique to various terminals. + +When support is available, the logo will be displayed at the start of an +interactive session: + +
+ +
+ +##### Charts and Graphs + +The [`\chart` command][chart-command] can be used to display a chart +directly in the terminal: + +
+ +
+ +See [the section on the `\chart` meta command][chart-command] for details. + +##### Enabling/Disabling Terminal Graphics + +Terminal graphics can be forced enabled or disabled by setting the +`USQL_TERM_GRAPHICS` or the `TERM_GRAPHICS` environment variable: + +```sh +# disable +$ USQL_TERM_GRAPHICS=none usql + +# force iterm graphics +$ TERM_GRAPHICS=iterm usql +``` + +| Variable | Default | Values | Description | +| --------------- | ------- | ------------------------------------- | ------------------------------ | +| `TERM_GRAPHICS` | `` | ``, `kitty`, `iterm`, `sixel`, `none` | enables/disables term graphics | + +##### Terminals with Graphics Support + +The following terminals have been tested with `usql`: + +- [WezTerm][wezterm] is a cross-platform terminal for Windows, macOS, Linux, and + many other platforms that supports [iTerm][iterm-graphics] graphics + +- [iTerm2][iterm2] is a macOS terminal that supports [iTerm][iterm-graphics] + graphics + +- [kitty][kitty] is a terminal for Linux, macOS, and various BSDs that supports + [Kitty][kitty-graphics] graphics + +- [foot][foot] is a Wayland terminal for Linux (and other Wayland hosts) that + supports [Sixel][sixel-graphics] graphics + +Additional terminals that support [Sixel][sixel-graphics] graphics are +catalogued on the [Are We Sixel Yet?][arewesixelyet] website. + +#### Passwords + +`usql` supports reading passwords for databases from a `.usqlpass` file +contained in the user's `HOME` directory at startup: + +```sh +$ cat $HOME/.usqlpass +# format is: +# protocol:host:port:dbname:user:pass +postgres:*:*:*:booktest:booktest +$ usql pg:// +Connected with driver postgres (PostgreSQL 9.6.9) +Type "help" for help. + +pg:booktest@=> +``` + +While the `.usqlpass` functionality will not be removed, it is recommended to +[define named connections][connection-vars] preferrably via [the `config.yaml` +file][config]. + +
+ +> **Note** +> +> The `.usqlpass` file cannot be readable by other users, and the permissions +> should be set accordingly: + +```sh +chmod 0600 ~/.usqlpass +``` + +
+ +#### Runtime Configuration (RC) File + +`usql` supports executing a `.usqlrc` runtime configuration (RC) file contained +in the user's `HOME` directory: + +```sh +$ cat $HOME/.usqlrc +\echo WELCOME TO THE JUNGLE `date` +\set SYNTAX_HL_STYLE paraiso-dark +# display color prompt (default is prompt is "%S%m%/%R%#" ) +\set PROMPT1 "\033[32m%S%m%/%R%#\033[0m" +$ usql +WELCOME TO THE JUNGLE Thu Jun 14 02:36:53 WIB 2018 +Type "help" for help. + +(not connected)=> \set +SYNTAX_HL_STYLE = 'paraiso-dark' +(not connected)=> +``` + +The `.usqlrc` file is read at startup in the same way as a file passed on the +command-line with `-f` / `--file`. It is commonly used to set startup +environment variables and settings. + +RC-file execution can be temporarily disabled at startup by passing `-X` or +`--no-init` on the command-line: + +```sh +$ usql --no-init pg:// +``` + +While the `.usqlrc` functionality will not be removed, it is recommended to set +an `init` script in [the `config.yaml` file][config]. + ## Additional Notes The following are additional notes and miscellania related to `usql`: @@ -1200,13 +1492,13 @@ The following are additional notes and miscellania related to `usql`: ### Release Builds [Release builds][releases] are built with the `most` build tag and with -additional [SQLite3 build tags (see: `build-release.sh`)](build-release.sh). +additional [SQLite3 build tags (see: `build.sh`)](build.sh). ### macOS -The recommended installation method on macOS is [via `brew` (see above)][via Homebrew] -due to the way libary dependencies for the `sqlite3` driver are done on macOS. -If the following (or similar) error is encountered when attempting to run `usql`: +The recommended installation method on macOS is [via `brew`][via Homebrew] due +to the way library dependencies for the `sqlite3` driver are done on macOS. If +the following (or similar) error is encountered when attempting to run `usql`: ```sh $ usql @@ -1259,13 +1551,29 @@ contributing, see CONTRIBUTING.md](CONTRIBUTING.md). [yay]: https://github.com/Jguer/yay [arch-makepkg]: https://wiki.archlinux.org/title/makepkg [backticks]: #backticks "Backticks" -[commands]: #backslash-commands "Commands" +[config]: #configuration "Configuration" +[commands]: #backslash-commands "Backslash Commands" [completion]: #context-completion "Context Completion" [connecting]: #connecting-to-databases "Connecting to Databases" [contributing]: #contributing "Contributing" [copying]: #copying-between-databases "Copying Between Databases" [highlighting]: #syntax-highlighting "Syntax Highlighting" +[termgraphics]: #terminal-graphics "Terminal Graphics" [timefmt]: #time-formatting "Time Formatting" [usqlpass]: #passwords "Passwords" [usqlrc]: #runtime-configuration-rc-file "Runtime Configuration File" -[variables]: #variables-and-interpolation "Variable Interpolation" +[variables]: #variables "Variables" +[runtime-vars]: #runtime-variables "Runtime Variables" +[connection-vars]: #connection-variables "Connection Variables" +[print-vars]: #display-formatting-(print)-variables "Display Formatting (print) Variables" +[kitty-graphics]: https://sw.kovidgoyal.net/kitty/graphics-protocol.html +[iterm-graphics]: https://iterm2.com/documentation-images.html +[sixel-graphics]: https://saitoha.github.io/libsixel/ +[rasterm]: https://github.com/kenshaw/rasterm +[wezterm]: https://wezfurlong.org/wezterm/ +[iterm2]: https://iterm2.com +[foot]: https://codeberg.org/dnkl/foot +[kitty]: https://sw.kovidgoyal.net/kitty/ +[arewesixelyet]: https://www.arewesixelyet.com +[chart-command]: #chart-command "\\chart meta command" +[yaml]: https://yaml.org diff --git a/args.go b/args.go deleted file mode 100644 index 6eb327655af..00000000000 --- a/args.go +++ /dev/null @@ -1,153 +0,0 @@ -package main - -import ( - "fmt" - "io" - "os" - "strings" - - "github.com/alecthomas/kingpin/v2" - "github.com/xo/usql/text" -) - -// CommandOrFile is a special type to deal with interspersed -c, -f, -// command-line options, to ensure proper order execution. -type CommandOrFile struct { - Command bool - Value string -} - -// Args are the command line arguments. -type Args struct { - DSN string - CommandOrFiles []CommandOrFile - Out string - ForcePassword bool - NoPassword bool - NoRC bool - SingleTransaction bool - Variables []string - PVariables []string -} - -func (args *Args) Next() (string, bool, error) { - if len(args.CommandOrFiles) == 0 { - return "", false, io.EOF - } - cmd := args.CommandOrFiles[0] - args.CommandOrFiles = args.CommandOrFiles[1:] - return cmd.Value, cmd.Command, nil -} - -type commandOrFile struct { - args *Args - command bool -} - -func (c commandOrFile) Set(value string) error { - c.args.CommandOrFiles = append(c.args.CommandOrFiles, CommandOrFile{ - Command: c.command, - Value: value, - }) - return nil -} - -func (c commandOrFile) String() string { - return "" -} - -func (c commandOrFile) IsCumulative() bool { - return true -} - -// for populating args.PVariables with user-specified options -type pset struct { - args *Args - vals []string -} - -func (p pset) Set(value string) error { - for i, v := range p.vals { - if strings.ContainsRune(v, '%') { - p.vals[i] = fmt.Sprintf(v, value) - } - } - p.args.PVariables = append(p.args.PVariables, p.vals...) - return nil -} - -func (p pset) String() string { - return "" -} - -func (p pset) IsCumulative() bool { - return true -} - -func NewArgs() *Args { - args := &Args{} - // set usage template - kingpin.UsageTemplate(text.UsageTemplate()) - kingpin.Arg("dsn", "database url").StringVar(&args.DSN) - // command / file flags - kingpin.Flag("command", "run only single command (SQL or internal) and exit").Short('c').SetValue(commandOrFile{args, true}) - kingpin.Flag("file", "execute commands from file and exit").Short('f').SetValue(commandOrFile{args, false}) - // general flags - kingpin.Flag("no-password", "never prompt for password").Short('w').BoolVar(&args.NoPassword) - kingpin.Flag("no-rc", "do not read start up file").Short('X').BoolVar(&args.NoRC) - kingpin.Flag("out", "output file").Short('o').StringVar(&args.Out) - kingpin.Flag("password", "force password prompt (should happen automatically)").Short('W').BoolVar(&args.ForcePassword) - kingpin.Flag("single-transaction", "execute as a single transaction (if non-interactive)").Short('1').BoolVar(&args.SingleTransaction) - kingpin.Flag("set", "set variable NAME to VALUE").Short('v').PlaceHolder(", --variable=NAME=VALUE").StringsVar(&args.Variables) - // pset - kingpin.Flag("pset", `set printing option VAR to ARG (see \pset command)`).Short('P').PlaceHolder("VAR[=ARG]").StringsVar(&args.PVariables) - // pset flags - kingpin.Flag("field-separator", `field separator for unaligned and CSV output (default "|" and ",")`).Short('F').SetValue(pset{args, []string{"fieldsep=%q", "csv_fieldsep=%q"}}) - kingpin.Flag("record-separator", `record separator for unaligned and CSV output (default \n)`).Short('R').SetValue(pset{args, []string{"recordsep=%q"}}) - kingpin.Flag("table-attr", "set HTML table tag attributes (e.g., width, border)").Short('T').SetValue(pset{args, []string{"tableattr=%q"}}) - type psetconfig struct { - long string - short rune - help string - vals []string - } - pc := func(long string, r rune, help string, vals ...string) psetconfig { - return psetconfig{long, r, help, vals} - } - for _, c := range []psetconfig{ - pc("no-align", 'A', "unaligned table output mode", "format=unaligned"), - pc("html", 'H', "HTML table output mode", "format=html"), - pc("tuples-only", 't', "print rows only", "tuples_only=on"), - pc("expanded", 'x', "turn on expanded table output", "expanded=on"), - pc("field-separator-zero", 'z', "set field separator for unaligned and CSV output to zero byte", "fieldsep_zero=on"), - pc("record-separator-zero", '0', "set record separator for unaligned and CSV output to zero byte", "recordsep_zero=on"), - pc("json", 'J', "JSON output mode", "format=json"), - pc("csv", 'C', "CSV output mode", "format=csv"), - pc("vertical", 'G', "vertical output mode", "format=vertical"), - } { - // make copy of values for the callback closure (see https://stackoverflow.com/q/26692844) - vals := make([]string, len(c.vals)) - copy(vals, c.vals) - kingpin.Flag(c.long, c.help).Short(c.short).PlaceHolder("TEXT").PreAction(func(*kingpin.ParseContext) error { - args.PVariables = append(args.PVariables, vals...) - return nil - }).Bool() - } - kingpin.Flag("quiet", "run quietly (no messages, only query output)").Short('q').PreAction(func(*kingpin.ParseContext) error { - args.Variables = append(args.Variables, "QUIET=on") - return nil - }).Bool() - // add --set as a hidden alias for --variable - kingpin.Flag("variable", "set variable NAME to VALUE").Hidden().StringsVar(&args.Variables) - // add --version flag - kingpin.Flag("version", "display version and exit").PreAction(func(*kingpin.ParseContext) error { - fmt.Fprintln(os.Stdout, text.CommandName, text.CommandVersion) - os.Exit(0) - return nil - }).Bool() - // hide help flag - kingpin.HelpFlag.Short('h').Hidden() - // parse - kingpin.Parse() - return args -} diff --git a/build.sh b/build.sh index 9f9b5032411..9d68bf98cb8 100755 --- a/build.sh +++ b/build.sh @@ -102,7 +102,7 @@ if [[ "$PLATFORM" == "linux" && "$ARCH" != "$GOARCH" ]]; then esac LDARCH=$CARCH if [[ "$ARCH" == "arm" ]]; then - TAGS+=(no_netezza) + TAGS+=(no_netezza no_chai) if [ -d /usr/arm-linux-$GNUTYPE ]; then LDARCH=arm elif [ -d /usr/arm-none-linux-$GNUTYPE ]; then diff --git a/contrib/charts/area_density_stacked.vl.json b/contrib/charts/area_density_stacked.vl.json new file mode 100644 index 00000000000..1a3667677be --- /dev/null +++ b/contrib/charts/area_density_stacked.vl.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "title": "{{ header }}", + "width": 400, + "height": 80, + "data": { + "url": "data/penguins.json" + }, + "mark": "area", + "transform": [ + { + "density": "{{ x }}", + "groupby": ["Species"], + "extent": [2500, 6500] + } + ], + "encoding": { + "x": {"field": "value", "type": "quantitative", "title": "{{ title_x }}"}, + "y": {"field": "density", "type": "quantitative", "stack": "zero"}, + "color": {"field": "{{ field_x }}", "type": "nominal"} + } +} diff --git a/contrib/charts/area_density_stacked.vl.json.svg b/contrib/charts/area_density_stacked.vl.json.svg new file mode 100644 index 00000000000..9b90000f2ad --- /dev/null +++ b/contrib/charts/area_density_stacked.vl.json.svg @@ -0,0 +1 @@ +2,5003,0003,5004,0004,5005,0005,5006,0006,500Body Mass (g)0.0000.0010.002densityAdelieChinstrapGentooSpeciesDistribution of Body Mass of Penguins \ No newline at end of file diff --git a/contrib/charts/area_density_stacked.vl.json.svg.export.png b/contrib/charts/area_density_stacked.vl.json.svg.export.png new file mode 100644 index 00000000000..08fc54b541b Binary files /dev/null and b/contrib/charts/area_density_stacked.vl.json.svg.export.png differ diff --git a/contrib/charts/penguins.json b/contrib/charts/penguins.json new file mode 100644 index 00000000000..517b6d32671 --- /dev/null +++ b/contrib/charts/penguins.json @@ -0,0 +1,3098 @@ +[ + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.1, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3750, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.5, + "Beak Depth (mm)": 17.4, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3800, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 40.3, + "Beak Depth (mm)": 18, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3250, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": null, + "Beak Depth (mm)": null, + "Flipper Length (mm)": null, + "Body Mass (g)": null, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 36.7, + "Beak Depth (mm)": 19.3, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.3, + "Beak Depth (mm)": 20.6, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3650, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.9, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3625, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.2, + "Beak Depth (mm)": 19.6, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4675, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 34.1, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3475, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 42, + "Beak Depth (mm)": 20.2, + "Flipper Length (mm)": 190, + "Body Mass (g)": 4250, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 37.8, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3300, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 37.8, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 180, + "Body Mass (g)": 3700, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 17.6, + "Flipper Length (mm)": 182, + "Body Mass (g)": 3200, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.6, + "Beak Depth (mm)": 21.2, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 34.6, + "Beak Depth (mm)": 21.1, + "Flipper Length (mm)": 198, + "Body Mass (g)": 4400, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 36.6, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.7, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 42.5, + "Beak Depth (mm)": 20.7, + "Flipper Length (mm)": 197, + "Body Mass (g)": 4500, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 34.4, + "Beak Depth (mm)": 18.4, + "Flipper Length (mm)": 184, + "Body Mass (g)": 3325, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 46, + "Beak Depth (mm)": 21.5, + "Flipper Length (mm)": 194, + "Body Mass (g)": 4200, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.8, + "Beak Depth (mm)": 18.3, + "Flipper Length (mm)": 174, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.7, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 180, + "Body Mass (g)": 3600, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35.9, + "Beak Depth (mm)": 19.2, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3800, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.2, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.8, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 180, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35.3, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3800, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 40.6, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 183, + "Body Mass (g)": 3550, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 40.5, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3200, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.9, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 172, + "Body Mass (g)": 3150, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 40.5, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 180, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.5, + "Beak Depth (mm)": 16.7, + "Flipper Length (mm)": 178, + "Body Mass (g)": 3250, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.2, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 178, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.5, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 188, + "Body Mass (g)": 3300, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.9, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 184, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.4, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3325, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.2, + "Beak Depth (mm)": 21.1, + "Flipper Length (mm)": 196, + "Body Mass (g)": 4150, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 38.8, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 42.2, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 180, + "Body Mass (g)": 3550, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.6, + "Beak Depth (mm)": 19.3, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3300, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.8, + "Beak Depth (mm)": 19.1, + "Flipper Length (mm)": 184, + "Body Mass (g)": 4650, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.5, + "Beak Depth (mm)": 18, + "Flipper Length (mm)": 182, + "Body Mass (g)": 3150, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.8, + "Beak Depth (mm)": 18.4, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3100, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 44.1, + "Beak Depth (mm)": 19.7, + "Flipper Length (mm)": 196, + "Body Mass (g)": 4400, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37, + "Beak Depth (mm)": 16.9, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3000, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.6, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 190, + "Body Mass (g)": 4600, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 182, + "Body Mass (g)": 3425, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.5, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 179, + "Body Mass (g)": 2975, + "Sex": null + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 42.3, + "Beak Depth (mm)": 21.2, + "Flipper Length (mm)": 191, + "Body Mass (g)": 4150, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 39.6, + "Beak Depth (mm)": 17.7, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3500, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 40.1, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 188, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 42, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 200, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 34.5, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 187, + "Body Mass (g)": 2900, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41.4, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3700, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 39, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3550, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 40.6, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 36.5, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 181, + "Body Mass (g)": 2850, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.6, + "Beak Depth (mm)": 19.1, + "Flipper Length (mm)": 194, + "Body Mass (g)": 3750, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35.7, + "Beak Depth (mm)": 16.9, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3150, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41.3, + "Beak Depth (mm)": 21.1, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4400, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.6, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3600, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 18.2, + "Flipper Length (mm)": 192, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 36.4, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 184, + "Body Mass (g)": 2850, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41.6, + "Beak Depth (mm)": 18, + "Flipper Length (mm)": 192, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35.5, + "Beak Depth (mm)": 16.2, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3350, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 19.1, + "Flipper Length (mm)": 188, + "Body Mass (g)": 4100, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 35.9, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3050, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 41.8, + "Beak Depth (mm)": 19.4, + "Flipper Length (mm)": 198, + "Body Mass (g)": 4450, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 33.5, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3600, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.7, + "Beak Depth (mm)": 18.4, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39.6, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 196, + "Body Mass (g)": 3550, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 45.8, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 197, + "Body Mass (g)": 4150, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 35.5, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 42.8, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4250, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 40.9, + "Beak Depth (mm)": 16.8, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 37.2, + "Beak Depth (mm)": 19.4, + "Flipper Length (mm)": 184, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 36.2, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3550, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 42.1, + "Beak Depth (mm)": 19.1, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4000, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 34.6, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3200, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 42.9, + "Beak Depth (mm)": 17.6, + "Flipper Length (mm)": 196, + "Body Mass (g)": 4700, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 36.7, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3800, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 35.1, + "Beak Depth (mm)": 19.4, + "Flipper Length (mm)": 193, + "Body Mass (g)": 4200, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.3, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3350, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 41.3, + "Beak Depth (mm)": 20.3, + "Flipper Length (mm)": 194, + "Body Mass (g)": 3550, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.3, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.9, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3500, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 38.3, + "Beak Depth (mm)": 19.2, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 38.9, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3600, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 35.7, + "Beak Depth (mm)": 18, + "Flipper Length (mm)": 202, + "Body Mass (g)": 3550, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 205, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 34, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.6, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 186, + "Body Mass (g)": 4450, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.2, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3300, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.8, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 38.1, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.3, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 196, + "Body Mass (g)": 4350, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 33.1, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 178, + "Body Mass (g)": 2900, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 43.2, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 192, + "Body Mass (g)": 4100, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 35, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 192, + "Body Mass (g)": 3725, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 41, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 203, + "Body Mass (g)": 4725, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.7, + "Beak Depth (mm)": 16, + "Flipper Length (mm)": 183, + "Body Mass (g)": 3075, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.8, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 190, + "Body Mass (g)": 4250, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 37.9, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 193, + "Body Mass (g)": 2925, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 39.7, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 184, + "Body Mass (g)": 3550, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.6, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 199, + "Body Mass (g)": 3750, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.2, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.1, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3175, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 43.2, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 197, + "Body Mass (g)": 4775, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 38.1, + "Beak Depth (mm)": 16.5, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3825, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 45.6, + "Beak Depth (mm)": 20.3, + "Flipper Length (mm)": 191, + "Body Mass (g)": 4600, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 39.7, + "Beak Depth (mm)": 17.7, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3200, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 42.2, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 197, + "Body Mass (g)": 4275, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 39.6, + "Beak Depth (mm)": 20.7, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3900, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Biscoe", + "Beak Length (mm)": 42.7, + "Beak Depth (mm)": 18.3, + "Flipper Length (mm)": 196, + "Body Mass (g)": 4075, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.6, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 188, + "Body Mass (g)": 2900, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 37.3, + "Beak Depth (mm)": 20.5, + "Flipper Length (mm)": 199, + "Body Mass (g)": 3775, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 35.7, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3350, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3325, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 36.2, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3150, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 37.7, + "Beak Depth (mm)": 19.8, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3500, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 40.2, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 176, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 41.4, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 202, + "Body Mass (g)": 3875, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 35.2, + "Beak Depth (mm)": 15.9, + "Flipper Length (mm)": 186, + "Body Mass (g)": 3050, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 40.6, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 199, + "Body Mass (g)": 4000, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.8, + "Beak Depth (mm)": 17.6, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3275, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 41.5, + "Beak Depth (mm)": 18.3, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 39, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3050, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 44.1, + "Beak Depth (mm)": 18, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4000, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 38.5, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3325, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Torgersen", + "Beak Length (mm)": 43.1, + "Beak Depth (mm)": 19.2, + "Flipper Length (mm)": 197, + "Body Mass (g)": 3500, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.8, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3500, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.5, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 199, + "Body Mass (g)": 4475, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 38.1, + "Beak Depth (mm)": 17.6, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3425, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 41.1, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 35.6, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3175, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.2, + "Beak Depth (mm)": 20.1, + "Flipper Length (mm)": 200, + "Body Mass (g)": 3975, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37, + "Beak Depth (mm)": 16.5, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.7, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 193, + "Body Mass (g)": 4250, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.2, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.6, + "Beak Depth (mm)": 17.2, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3475, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 32.1, + "Beak Depth (mm)": 15.5, + "Flipper Length (mm)": 188, + "Body Mass (g)": 3050, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 40.7, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3725, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.3, + "Beak Depth (mm)": 16.8, + "Flipper Length (mm)": 192, + "Body Mass (g)": 3000, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3650, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 39.2, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 190, + "Body Mass (g)": 4250, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36.6, + "Beak Depth (mm)": 18.4, + "Flipper Length (mm)": 184, + "Body Mass (g)": 3475, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 37.8, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3750, + "Sex": "MALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 36, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Adelie", + "Island": "Dream", + "Beak Length (mm)": 41.5, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 201, + "Body Mass (g)": 4000, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.5, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 192, + "Body Mass (g)": 3500, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 196, + "Body Mass (g)": 3900, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.3, + "Beak Depth (mm)": 19.2, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3650, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.4, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 188, + "Body Mass (g)": 3525, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52.7, + "Beak Depth (mm)": 19.8, + "Flipper Length (mm)": 197, + "Body Mass (g)": 3725, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3950, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.1, + "Beak Depth (mm)": 18.2, + "Flipper Length (mm)": 178, + "Body Mass (g)": 3250, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.3, + "Beak Depth (mm)": 18.2, + "Flipper Length (mm)": 197, + "Body Mass (g)": 3750, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46, + "Beak Depth (mm)": 18.9, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4150, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.3, + "Beak Depth (mm)": 19.9, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3700, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.6, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3800, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.7, + "Beak Depth (mm)": 20.3, + "Flipper Length (mm)": 194, + "Body Mass (g)": 3775, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 47, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 185, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 201, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.9, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3575, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.5, + "Beak Depth (mm)": 19.6, + "Flipper Length (mm)": 201, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.3, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 197, + "Body Mass (g)": 3300, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 58, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.4, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3450, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.2, + "Beak Depth (mm)": 18.2, + "Flipper Length (mm)": 195, + "Body Mass (g)": 4400, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 42.4, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 181, + "Body Mass (g)": 3600, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 48.5, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3400, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 43.2, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 187, + "Body Mass (g)": 2900, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.6, + "Beak Depth (mm)": 19.4, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.7, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3300, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 197, + "Body Mass (g)": 4150, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.5, + "Beak Depth (mm)": 18.4, + "Flipper Length (mm)": 200, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.5, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 200, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.4, + "Beak Depth (mm)": 17.8, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3700, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52.8, + "Beak Depth (mm)": 20, + "Flipper Length (mm)": 205, + "Body Mass (g)": 4550, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 40.9, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3200, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 54.2, + "Beak Depth (mm)": 20.8, + "Flipper Length (mm)": 201, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 42.5, + "Beak Depth (mm)": 16.7, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3350, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 203, + "Body Mass (g)": 4100, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.7, + "Beak Depth (mm)": 18.6, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3600, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 47.5, + "Beak Depth (mm)": 16.8, + "Flipper Length (mm)": 199, + "Body Mass (g)": 3900, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 47.6, + "Beak Depth (mm)": 18.3, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3850, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52, + "Beak Depth (mm)": 20.7, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4800, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.9, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 192, + "Body Mass (g)": 2700, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 53.5, + "Beak Depth (mm)": 19.9, + "Flipper Length (mm)": 205, + "Body Mass (g)": 4500, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 210, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.2, + "Beak Depth (mm)": 17.5, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3650, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.9, + "Beak Depth (mm)": 19.1, + "Flipper Length (mm)": 196, + "Body Mass (g)": 3550, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.5, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 196, + "Body Mass (g)": 3500, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.9, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 196, + "Body Mass (g)": 3675, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.8, + "Beak Depth (mm)": 18.5, + "Flipper Length (mm)": 201, + "Body Mass (g)": 4450, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.1, + "Beak Depth (mm)": 17.9, + "Flipper Length (mm)": 190, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49, + "Beak Depth (mm)": 19.6, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4300, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.5, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3250, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.8, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3675, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 48.1, + "Beak Depth (mm)": 16.4, + "Flipper Length (mm)": 199, + "Body Mass (g)": 3325, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.4, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 201, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.7, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3600, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.7, + "Beak Depth (mm)": 19.7, + "Flipper Length (mm)": 203, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 42.5, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 187, + "Body Mass (g)": 3350, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 52.2, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 197, + "Body Mass (g)": 3450, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 16.6, + "Flipper Length (mm)": 191, + "Body Mass (g)": 3250, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.3, + "Beak Depth (mm)": 19.9, + "Flipper Length (mm)": 203, + "Body Mass (g)": 4050, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.2, + "Beak Depth (mm)": 18.8, + "Flipper Length (mm)": 202, + "Body Mass (g)": 3800, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.6, + "Beak Depth (mm)": 19.4, + "Flipper Length (mm)": 194, + "Body Mass (g)": 3525, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 51.9, + "Beak Depth (mm)": 19.5, + "Flipper Length (mm)": 206, + "Body Mass (g)": 3950, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 46.8, + "Beak Depth (mm)": 16.5, + "Flipper Length (mm)": 189, + "Body Mass (g)": 3650, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 45.7, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 195, + "Body Mass (g)": 3650, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 55.8, + "Beak Depth (mm)": 19.8, + "Flipper Length (mm)": 207, + "Body Mass (g)": 4000, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 43.5, + "Beak Depth (mm)": 18.1, + "Flipper Length (mm)": 202, + "Body Mass (g)": 3400, + "Sex": "FEMALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 49.6, + "Beak Depth (mm)": 18.2, + "Flipper Length (mm)": 193, + "Body Mass (g)": 3775, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.8, + "Beak Depth (mm)": 19, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4100, + "Sex": "MALE" + }, + { + "Species": "Chinstrap", + "Island": "Dream", + "Beak Length (mm)": 50.2, + "Beak Depth (mm)": 18.7, + "Flipper Length (mm)": 198, + "Body Mass (g)": 3775, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.1, + "Beak Depth (mm)": 13.2, + "Flipper Length (mm)": 211, + "Body Mass (g)": 4500, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50, + "Beak Depth (mm)": 16.3, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5700, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.7, + "Beak Depth (mm)": 14.1, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4450, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50, + "Beak Depth (mm)": 15.2, + "Flipper Length (mm)": 218, + "Body Mass (g)": 5700, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.6, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5400, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.5, + "Beak Depth (mm)": 13.5, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4550, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.4, + "Beak Depth (mm)": 14.6, + "Flipper Length (mm)": 211, + "Body Mass (g)": 4800, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.7, + "Beak Depth (mm)": 15.3, + "Flipper Length (mm)": 219, + "Body Mass (g)": 5200, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.3, + "Beak Depth (mm)": 13.4, + "Flipper Length (mm)": 209, + "Body Mass (g)": 4400, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.8, + "Beak Depth (mm)": 15.4, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5150, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 40.9, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4650, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 216, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.5, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4650, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.4, + "Beak Depth (mm)": 14.6, + "Flipper Length (mm)": 213, + "Body Mass (g)": 5850, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.8, + "Beak Depth (mm)": 14.6, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4200, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.3, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 217, + "Body Mass (g)": 5850, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 42, + "Beak Depth (mm)": 13.5, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4150, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.2, + "Beak Depth (mm)": 15.2, + "Flipper Length (mm)": 221, + "Body Mass (g)": 6300, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.2, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 209, + "Body Mass (g)": 4800, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.7, + "Beak Depth (mm)": 15.1, + "Flipper Length (mm)": 222, + "Body Mass (g)": 5350, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.2, + "Beak Depth (mm)": 14.3, + "Flipper Length (mm)": 218, + "Body Mass (g)": 5700, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.1, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5000, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.5, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 213, + "Body Mass (g)": 4400, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.3, + "Beak Depth (mm)": 15.8, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5050, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 42.9, + "Beak Depth (mm)": 13.1, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5000, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.1, + "Beak Depth (mm)": 15.1, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5100, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.5, + "Beak Depth (mm)": 14.3, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4100, + "Sex": null + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.8, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5650, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.2, + "Beak Depth (mm)": 14.3, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4600, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50, + "Beak Depth (mm)": 15.3, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.3, + "Beak Depth (mm)": 15.3, + "Flipper Length (mm)": 222, + "Body Mass (g)": 5250, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 42.8, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 209, + "Body Mass (g)": 4700, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.1, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 207, + "Body Mass (g)": 5050, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 59.6, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 230, + "Body Mass (g)": 6050, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.1, + "Beak Depth (mm)": 14.8, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5150, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.4, + "Beak Depth (mm)": 16.3, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5400, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 42.6, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 213, + "Body Mass (g)": 4950, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.4, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 219, + "Body Mass (g)": 5250, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44, + "Beak Depth (mm)": 13.6, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4350, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.7, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 208, + "Body Mass (g)": 5350, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 42.7, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 208, + "Body Mass (g)": 3950, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.6, + "Beak Depth (mm)": 16, + "Flipper Length (mm)": 225, + "Body Mass (g)": 5700, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.3, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4300, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.6, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4750, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.5, + "Beak Depth (mm)": 15.9, + "Flipper Length (mm)": 222, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.6, + "Beak Depth (mm)": 13.9, + "Flipper Length (mm)": 217, + "Body Mass (g)": 4900, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.5, + "Beak Depth (mm)": 13.9, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4200, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.5, + "Beak Depth (mm)": 15.9, + "Flipper Length (mm)": 225, + "Body Mass (g)": 5400, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.9, + "Beak Depth (mm)": 13.3, + "Flipper Length (mm)": 213, + "Body Mass (g)": 5100, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 15.8, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5300, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.6, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4850, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.5, + "Beak Depth (mm)": 14.1, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5300, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.1, + "Beak Depth (mm)": 14.4, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4400, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.1, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 225, + "Body Mass (g)": 5000, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.5, + "Beak Depth (mm)": 14.4, + "Flipper Length (mm)": 217, + "Body Mass (g)": 4900, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45, + "Beak Depth (mm)": 15.4, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5050, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.8, + "Beak Depth (mm)": 13.9, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4300, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.5, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 220, + "Body Mass (g)": 5000, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.2, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4450, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.4, + "Beak Depth (mm)": 15.3, + "Flipper Length (mm)": 224, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.3, + "Beak Depth (mm)": 13.8, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4200, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.2, + "Beak Depth (mm)": 14.9, + "Flipper Length (mm)": 221, + "Body Mass (g)": 5300, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.7, + "Beak Depth (mm)": 13.9, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4400, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 54.3, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 231, + "Body Mass (g)": 5650, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.8, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 219, + "Body Mass (g)": 4700, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.8, + "Beak Depth (mm)": 16.8, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5700, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.2, + "Beak Depth (mm)": 14.4, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4650, + "Sex": null + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.5, + "Beak Depth (mm)": 16.2, + "Flipper Length (mm)": 229, + "Body Mass (g)": 5800, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.5, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 220, + "Body Mass (g)": 4700, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.7, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 223, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.7, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4750, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.4, + "Beak Depth (mm)": 15.6, + "Flipper Length (mm)": 221, + "Body Mass (g)": 5000, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.2, + "Beak Depth (mm)": 15.6, + "Flipper Length (mm)": 221, + "Body Mass (g)": 5100, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.5, + "Beak Depth (mm)": 14.8, + "Flipper Length (mm)": 217, + "Body Mass (g)": 5200, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.4, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4700, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.6, + "Beak Depth (mm)": 16, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5800, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.5, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 209, + "Body Mass (g)": 4600, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 51.1, + "Beak Depth (mm)": 16.3, + "Flipper Length (mm)": 220, + "Body Mass (g)": 6000, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 13.8, + "Flipper Length (mm)": 215, + "Body Mass (g)": 4750, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 16.4, + "Flipper Length (mm)": 223, + "Body Mass (g)": 5950, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.1, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4625, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 52.5, + "Beak Depth (mm)": 15.6, + "Flipper Length (mm)": 221, + "Body Mass (g)": 5450, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.4, + "Beak Depth (mm)": 14.6, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4725, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50, + "Beak Depth (mm)": 15.9, + "Flipper Length (mm)": 224, + "Body Mass (g)": 5350, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.9, + "Beak Depth (mm)": 13.8, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4750, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.8, + "Beak Depth (mm)": 17.3, + "Flipper Length (mm)": 228, + "Body Mass (g)": 5600, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.4, + "Beak Depth (mm)": 14.4, + "Flipper Length (mm)": 218, + "Body Mass (g)": 4600, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 51.3, + "Beak Depth (mm)": 14.2, + "Flipper Length (mm)": 218, + "Body Mass (g)": 5300, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.5, + "Beak Depth (mm)": 14, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4875, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 52.1, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5550, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.5, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 218, + "Body Mass (g)": 4950, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 52.2, + "Beak Depth (mm)": 17.1, + "Flipper Length (mm)": 228, + "Body Mass (g)": 5400, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.5, + "Beak Depth (mm)": 14.5, + "Flipper Length (mm)": 212, + "Body Mass (g)": 4750, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.5, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 224, + "Body Mass (g)": 5650, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.5, + "Beak Depth (mm)": 14.7, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4850, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.8, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 226, + "Body Mass (g)": 5200, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.4, + "Beak Depth (mm)": 15.8, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4925, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.9, + "Beak Depth (mm)": 14.6, + "Flipper Length (mm)": 222, + "Body Mass (g)": 4875, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.4, + "Beak Depth (mm)": 14.4, + "Flipper Length (mm)": 203, + "Body Mass (g)": 4625, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 51.1, + "Beak Depth (mm)": 16.5, + "Flipper Length (mm)": 225, + "Body Mass (g)": 5250, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.5, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 219, + "Body Mass (g)": 4850, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 55.9, + "Beak Depth (mm)": 17, + "Flipper Length (mm)": 228, + "Body Mass (g)": 5600, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.2, + "Beak Depth (mm)": 15.5, + "Flipper Length (mm)": 215, + "Body Mass (g)": 4975, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.1, + "Beak Depth (mm)": 15, + "Flipper Length (mm)": 228, + "Body Mass (g)": 5500, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.3, + "Beak Depth (mm)": 13.8, + "Flipper Length (mm)": 216, + "Body Mass (g)": 4725, + "Sex": null + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.8, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 215, + "Body Mass (g)": 5500, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 41.7, + "Beak Depth (mm)": 14.7, + "Flipper Length (mm)": 210, + "Body Mass (g)": 4700, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 53.4, + "Beak Depth (mm)": 15.8, + "Flipper Length (mm)": 219, + "Body Mass (g)": 5500, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.3, + "Beak Depth (mm)": 14, + "Flipper Length (mm)": 208, + "Body Mass (g)": 4575, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.1, + "Beak Depth (mm)": 15.1, + "Flipper Length (mm)": 209, + "Body Mass (g)": 5500, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.5, + "Beak Depth (mm)": 15.2, + "Flipper Length (mm)": 216, + "Body Mass (g)": 5000, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.8, + "Beak Depth (mm)": 15.9, + "Flipper Length (mm)": 229, + "Body Mass (g)": 5950, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 43.5, + "Beak Depth (mm)": 15.2, + "Flipper Length (mm)": 213, + "Body Mass (g)": 4650, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 51.5, + "Beak Depth (mm)": 16.3, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5500, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.2, + "Beak Depth (mm)": 14.1, + "Flipper Length (mm)": 217, + "Body Mass (g)": 4375, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 55.1, + "Beak Depth (mm)": 16, + "Flipper Length (mm)": 230, + "Body Mass (g)": 5850, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 44.5, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 217, + "Body Mass (g)": 4875, + "Sex": "." + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 48.8, + "Beak Depth (mm)": 16.2, + "Flipper Length (mm)": 222, + "Body Mass (g)": 6000, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 47.2, + "Beak Depth (mm)": 13.7, + "Flipper Length (mm)": 214, + "Body Mass (g)": 4925, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": null, + "Beak Depth (mm)": null, + "Flipper Length (mm)": null, + "Body Mass (g)": null, + "Sex": null + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 46.8, + "Beak Depth (mm)": 14.3, + "Flipper Length (mm)": 215, + "Body Mass (g)": 4850, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 50.4, + "Beak Depth (mm)": 15.7, + "Flipper Length (mm)": 222, + "Body Mass (g)": 5750, + "Sex": "MALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 45.2, + "Beak Depth (mm)": 14.8, + "Flipper Length (mm)": 212, + "Body Mass (g)": 5200, + "Sex": "FEMALE" + }, + { + "Species": "Gentoo", + "Island": "Biscoe", + "Beak Length (mm)": 49.9, + "Beak Depth (mm)": 16.1, + "Flipper Length (mm)": 213, + "Body Mass (g)": 5400, + "Sex": "MALE" + } +] \ No newline at end of file diff --git a/contrib/config.yaml b/contrib/config.yaml new file mode 100644 index 00000000000..40f74a08b9d --- /dev/null +++ b/contrib/config.yaml @@ -0,0 +1,47 @@ +--- +# named connections +connections: + my_couchbase_conn: couchbase://Administrator:P4ssw0rd@localhost + my_clickhouse_conn: clickhouse://clickhouse:P4ssw0rd@localhost + css: cassandra://cassandra:cassandra@localhost + fsl: flightsql://flight_username:P4ssw0rd@localhost + gdr: + protocol: godror + username: system + password: P4ssw0rd + hostname: localhost + port: 1521 + database: free + ign: ignite://ignite:ignite@localhost + mss: sqlserver://sa:Adm1nP@ssw0rd@localhost + mym: mysql://root:P4ssw0rd@localhost + myz: mymysql://root:P4ssw0rd@localhost + ora: oracle://system:P4ssw0rd@localhost/free + pgs: postgres://postgres:P4ssw0rd@localhost + pgx: pgx://postgres:P4ssw0rd@localhost + vrt: + proto: vertica + user: vertica + pass: vertica + host: localhost + sll: + file: /path/to/mydb.sqlite3 + mdc: modernsqlite:test.db + dkd: test.duckdb + zzz: ["databricks", "token:dapi*****@adb-*************.azuredatabricks.net:443/sql/protocolv1/o/*********/*******"] + zz2: + proto: mysql + user: 'my username' + pass: 'my password!' + host: localhost + opts: + opt1: "😀" +# startup script +init: | + \echo welcome to the jungle `date` + \set SYNTAX_HL_STYLE paraiso-dark +# charts path +charts_path: charts +# defined queries +queries: + q1: diff --git a/contrib/couchbase/README.md b/contrib/couchbase/README.md index 5ef4ad85142..d083861c49a 100644 --- a/contrib/couchbase/README.md +++ b/contrib/couchbase/README.md @@ -1,4 +1,8 @@ -# Setting up Couchbase +# Couchbase Notes + +```sh +$ podman volume create couchbase-data +``` After running the docker image, browse to http://127.0.0.1:8091/ui/index.html and manually configure database. diff --git a/contrib/couchbase/podman-config b/contrib/couchbase/podman-config index a6c81274ee1..6fa84850e71 100644 --- a/contrib/couchbase/podman-config +++ b/contrib/couchbase/podman-config @@ -1,3 +1,4 @@ NAME=couchbase IMAGE=docker.io/library/couchbase PUBLISH=8091-8094:8091-8094 +VOLUME=couchbase-data:/opt/couchbase/var diff --git a/contrib/couchbase/usql-config b/contrib/couchbase/usql-config index 1d2fc6b0cb4..359692deecf 100644 --- a/contrib/couchbase/usql-config +++ b/contrib/couchbase/usql-config @@ -1,2 +1,3 @@ -DB="couchbase://localhost:8093" -VSQL="select version() as version;" +# NOTE: this will only work after setting up a database on http://localhost:8091/ +DB="couchbase://Administrator:P4ssw0rd@localhost" +VSQL="select raw ds_version() as version;" diff --git a/contrib/db2/README.md b/contrib/db2/README.md index 4912c3a903c..c812141c7ed 100644 --- a/contrib/db2/README.md +++ b/contrib/db2/README.md @@ -1,4 +1,4 @@ -# Configuring db2 +# db2 Notes 1. Install unixodbc: diff --git a/contrib/ignite/README.md b/contrib/ignite/README.md index d0a343f03fd..ad0e105a269 100644 --- a/contrib/ignite/README.md +++ b/contrib/ignite/README.md @@ -1,4 +1,4 @@ -# Setting up Ignite +# Ignite Notes After starting the database, run `activate.sh`: diff --git a/contrib/oracle/README.md b/contrib/oracle/README.md index ab67287dc74..399e07571d6 100644 --- a/contrib/oracle/README.md +++ b/contrib/oracle/README.md @@ -1,39 +1,5 @@ # Oracle Notes -1. Clone: - -```sh -$ mkdir -p ~/src/oracle && cd ~/src/oracle -$ git clone https://github.com/oracle/docker-images.git -``` - -2. Download `LINUX.X64_193000_db_home.zip` -> `~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/`: - -```sh -$ mv ~/Downloads/LINUX.X64_193000_db_home.zip ~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/ -``` -3. Build: - -```sh -$ cd ~/src/oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles/ -$ ./buildDockerImage.sh -v 19.3.0 -e -``` - -4. Fix ["out-of-band" issue][out-of-band-issue] ([see also GitHub issue][out-of-band-github]) by adding `userland-proxy: false` to `/etc/docker/daemon.json` - -[out-of-band-issue]: https://medium.com/@FranckPachot/19c-instant-client-and-docker-1566630ab20e -[out-of-band-github]: https://github.com/oracle/docker-images/issues/1352 - -5. Create storage directory, and change ownership: - -```sh -$ mkdir -p /media/src/opt/oracle -$ sudo chown -R 54321:54321 /media/src/opt/oracle -``` - -6. Start: - ```sh -$ cd $GOPATH/src/github.com/xo/usql/contrib -$ ./docker-run.sh oracle +$ podman volume create oracle-data ``` diff --git a/contrib/podman-run.sh b/contrib/podman-run.sh index 753b509dbe1..08be2fc0ede 100755 --- a/contrib/podman-run.sh +++ b/contrib/podman-run.sh @@ -41,6 +41,7 @@ podman_run() { echo "error: $BASE/podman-config doesn't exist" exit 1 fi + # load parameters from podman-config unset IMAGE NAME PUBLISH ENV VOLUME NETWORK PRIVILEGED HOSTNAME PARAMS CMD source $BASE/podman-config @@ -48,6 +49,7 @@ podman_run() { echo "error: $BASE/podman-config is invalid" exit 1 fi + # setup params PARAMS=() for k in NAME PUBLISH ENV VOLUME NETWORK PRIVILEGED HOSTNAME; do @@ -59,11 +61,13 @@ podman_run() { done fi done + # determine if image exists EXISTS=$(podman image ls -q $IMAGE) if [[ "$UPDATE" == "0" && -z "$EXISTS" ]]; then UPDATE=1 fi + # show parameters echo "-------------------------------------------" echo "NAME: $NAME $HOSTNAME" @@ -74,6 +78,8 @@ podman_run() { echo "NETWORK: $NETWORK" echo "PRIVILEGED: $PRIVILEGED" echo "CMD: $CMD" + echo + # update if [[ "$UPDATE" == "1" && "$TARGET" != "oracle" ]]; then if [ ! -f $BASE/Dockerfile ]; then @@ -95,21 +101,24 @@ podman_run() { ) fi fi - # stop any running images + + # stop and remove if [ ! -z "$(podman ps -q --filter "name=$NAME")" ]; then (set -x; podman stop $NAME ) fi - if [ ! -z "$(podman ps -q -a --filter "name=$NAME")" ]; then (set -x; podman rm -f $NAME ) fi + + # start (set -ex; podman run --detach --rm ${PARAMS[@]} $IMAGE $CMD ) + echo } pushd $SRC &> /dev/null diff --git a/contrib/usql-test.sh b/contrib/usql-test.sh index 26d0cfa740b..75dea565b7e 100755 --- a/contrib/usql-test.sh +++ b/contrib/usql-test.sh @@ -1,28 +1,25 @@ #!/bin/bash -SRC=$(realpath $(cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )) +SRC=$(realpath $(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)) USQL=$(which usql) if [ -f $SRC/../usql ]; then USQL=$(realpath $SRC/../usql) fi +export USQL_SHOW_HOST_INFORMATION=false for TARGET in $SRC/*/usql-config; do NAME=$(basename $(dirname $TARGET)) if [[ ! -z "$(podman ps -q --filter "name=$NAME")" || "$NAME" == "duckdb" || "$NAME" == "sqlite3" ]]; then unset DB VSQL source $TARGET - if [ -z "$DB" ]; then - echo "error: DB not defined in $TARGET/usql-config!" - exit 1 - fi - if [ -z "$VSQL" ]; then - echo "error: VSQL not defined in $TARGET/usql-config!" - exit 1 + if [[ -z "$DB" || -z "$VSQL" ]]; then + echo -e "ERROR: DB or VSQL not defined in $TARGET!\n" + continue fi (set -x; - USQL_SHOW_HOST_INFORMATION=false \ - $USQL "$DB" -X -J -c "$VSQL" + $USQL "$DB" -X -J -c "$VSQL" ) + echo fi done diff --git a/contrib/usqlpass b/contrib/usqlpass index 1a364d137d9..17a67d27c68 100644 --- a/contrib/usqlpass +++ b/contrib/usqlpass @@ -6,6 +6,7 @@ postgres:*:*:*:postgres:P4ssw0rd cql:*:*:*:cassandra:cassandra clickhouse:*:*:*:clickhouse:P4ssw0rd +couchbase:*:*:*:Administrator:P4ssw0rd godror:*:*:*:system:P4ssw0rd ignite:*:*:*:ignite:ignite mymysql:*:*:*:root:P4ssw0rd diff --git a/drivers/adodb/adodb.go b/drivers/adodb/adodb.go index c5c91d99114..d84f8bb40d7 100644 --- a/drivers/adodb/adodb.go +++ b/drivers/adodb/adodb.go @@ -8,15 +8,30 @@ package adodb import ( "database/sql" + "regexp" + "strings" _ "github.com/mattn/go-adodb" // DRIVER + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) func init() { + endRE := regexp.MustCompile(`;?\s*$`) + endAnchorRE := regexp.MustCompile(`(?i)\send\s*;\s*$`) drivers.Register("adodb", drivers.Driver{ AllowMultilineComments: true, AllowCComments: true, + Process: func(u *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { + // trim last ; but only when not END; + if s := strings.ToLower(u.Query().Get("usql_trim")); s != "" && s != "off" && s != "0" && s != "false" { + if !endAnchorRE.MatchString(sqlstr) { + sqlstr = endRE.ReplaceAllString(sqlstr, "") + } + } + typ, q := drivers.QueryExecType(prefix, sqlstr) + return typ, sqlstr, q, nil + }, RowsAffected: func(res sql.Result) (int64, error) { return 0, nil }, diff --git a/drivers/athena/athena.go b/drivers/athena/athena.go index cf4f9083d29..b263bffbfcd 100644 --- a/drivers/athena/athena.go +++ b/drivers/athena/athena.go @@ -8,6 +8,7 @@ import ( "regexp" _ "github.com/uber/athenadriver/go" // DRIVER: awsathena + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) @@ -15,7 +16,7 @@ func init() { endRE := regexp.MustCompile(`;?\s*$`) drivers.Register("awsathena", drivers.Driver{ AllowMultilineComments: true, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { sqlstr = endRE.ReplaceAllString(sqlstr, "") typ, q := drivers.QueryExecType(prefix, sqlstr) return typ, sqlstr, q, nil diff --git a/drivers/chai/chai.go b/drivers/chai/chai.go new file mode 100644 index 00000000000..cf35e9bc86e --- /dev/null +++ b/drivers/chai/chai.go @@ -0,0 +1,13 @@ +// Package chai defines and registers usql's ChaiSQL driver. +// +// See: https://github.com/chaisql/chai +package chai + +import ( + _ "github.com/chaisql/chai/driver" // DRIVER + "github.com/xo/usql/drivers" +) + +func init() { + drivers.Register("chai", drivers.Driver{}) +} diff --git a/drivers/clickhouse/clickhouse_test.go b/drivers/clickhouse/clickhouse_test.go index 0b72a76abca..d138f186673 100644 --- a/drivers/clickhouse/clickhouse_test.go +++ b/drivers/clickhouse/clickhouse_test.go @@ -1,18 +1,25 @@ package clickhouse_test import ( + "context" "database/sql" "flag" "fmt" + "github.com/xo/dburl" + "github.com/xo/usql/drivers" "log" "os" "path/filepath" "testing" + "time" dt "github.com/ory/dockertest/v3" "github.com/xo/usql/drivers/clickhouse" "github.com/xo/usql/drivers/metadata" "github.com/yookoala/realpath" + + _ "github.com/xo/usql/drivers/csvq" + _ "github.com/xo/usql/drivers/moderncsqlite" ) // db is the database connection. @@ -59,7 +66,7 @@ func doMain(m *testing.M, cleanup bool) (int, error) { if cleanup { defer func() { if err := pool.Purge(db.res); err != nil { - fmt.Fprintf(os.Stderr, "error: could not purge resoure: %v\n", err) + fmt.Fprintf(os.Stderr, "error: could not purge resource: %v\n", err) } }() } @@ -85,7 +92,7 @@ func TestSchemas(t *testing.T) { if err != nil { t.Fatalf("could not read schemas: %v", err) } - checkNames(t, "schema", res, "default", "system", "tutorial", "tutorial_unexpected", "INFORMATION_SCHEMA", "information_schema") + checkNames(t, "schema", res, "default", "system", "tutorial", "tutorial_unexpected", "INFORMATION_SCHEMA", "information_schema", "copy_test") } func TestTables(t *testing.T) { @@ -119,6 +126,75 @@ func TestColumns(t *testing.T) { checkNames(t, "column", res, colNames()...) } +func TestCopy(t *testing.T) { + // Tests with csvq source DB. That driver doesn't support ScanType() + for _, destTableSpec := range []string{ + "copy_test.dest", + "copy_test.dest(StringCol, NumCol)", + "insert into copy_test.dest values(?, ?)", + } { + t.Run("csvq_"+destTableSpec, func(t *testing.T) { + testCopy(t, destTableSpec, "csvq:.") + }) + } + // Test with a driver that supports ScanType() + t.Run("sqlite", func(t *testing.T) { + testCopy(t, "copy_test.dest", "moderncsqlite://:memory:") + }) +} + +func testCopy(t *testing.T, destTableSpec string, sourceDbUrlStr string) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + _, err := db.db.ExecContext(ctx, "truncate table copy_test.dest") + if err != nil { + t.Fatalf("could not truncate copy_test table: %v", err) + } + // Prepare copy destination URL + port := db.res.GetPort("9000/tcp") + dbUrlStr := fmt.Sprintf("clickhouse://127.0.0.1:%s", port) + dbUrl, err := dburl.Parse(dbUrlStr) + if err != nil { + t.Fatalf("could not parse clickhouse url %s: %v", dbUrlStr, err) + } + // Prepare source data + sourceDbUrl, err := dburl.Parse(sourceDbUrlStr) + if err != nil { + t.Fatalf("could not parse source DB url %s: %v", sourceDbUrlStr, err) + } + sourceDb, err := drivers.Open(ctx, sourceDbUrl, nil, nil) + if err != nil { + t.Fatalf("could not open sourceDb: %v", err) + } + defer sourceDb.Close() + rows, err := sourceDb.QueryContext(ctx, "select 'string', 1") + if err != nil { + t.Fatalf("could not retrieve source rows: %v", err) + } + // Do Copy, ignoring copied rows count because clickhouse driver doesn't report RowsAffected + _, err = drivers.Copy(ctx, dbUrl, nil, nil, rows, destTableSpec) + if err != nil { + t.Fatalf("copy failed: %v", err) + } + rows, err = db.db.QueryContext(ctx, "select StringCol, NumCol from copy_test.dest") + if err != nil { + t.Fatalf("failed to query: %v", err) + } + defer rows.Close() + var copiedString string + var copiedNum int + if !rows.Next() { + t.Fatalf("nothing copied") + } + err = rows.Scan(&copiedString, &copiedNum) + if err != nil { + t.Fatalf("could not read copied data: %v", err) + } + if copiedString != "string" || copiedNum != 1 { + t.Fatalf("copied data differs: %s != string, %d != 1", copiedString, copiedNum) + } +} + func checkNames(t *testing.T, typ string, res interface{ Next() bool }, exp ...string) { n := make(map[string]bool) for _, s := range exp { @@ -798,7 +874,6 @@ func funcNames() []string { "max2", "maxIntersections", "maxIntersectionsPosition", - "maxMap", "maxMappedArrays", "meanZTest", "median", @@ -818,7 +893,6 @@ func funcNames() []string { "mid", "min", "min2", - "minMap", "minMappedArrays", "minSampleSizeContinous", "minSampleSizeConversion", @@ -1143,7 +1217,6 @@ func funcNames() []string { "sum", "sumCount", "sumKahan", - "sumMap", "sumMapFiltered", "sumMapFilteredWithOverflow", "sumMapWithOverflow", @@ -1435,6 +1508,7 @@ func colNames() []string { "CLID", "ClientEventTime", "ClientIP", + "ClientIP", "ClientIP6", "ClientTimeZone", "CodeVersion", diff --git a/drivers/clickhouse/testdata/clickhouse.sql b/drivers/clickhouse/testdata/clickhouse.sql index 78f1870025a..b14a35c6e34 100644 --- a/drivers/clickhouse/testdata/clickhouse.sql +++ b/drivers/clickhouse/testdata/clickhouse.sql @@ -340,3 +340,11 @@ CREATE TABLE tutorial_unexpected.hits_v1 ( ) ENGINE = MergeTree() ORDER BY (Unexpected); + +CREATE DATABASE copy_test; +CREATE TABLE copy_test.dest ( + StringCol String, + NumCol UInt32 +) +ENGINE = MergeTree() +ORDER BY (StringCol); \ No newline at end of file diff --git a/drivers/completer/completer.go b/drivers/completer/completer.go index 4294eb00fef..23be68e0943 100644 --- a/drivers/completer/completer.go +++ b/drivers/completer/completer.go @@ -122,60 +122,65 @@ func NewDefaultCompleter(opts ...Option) readline.AutoCompleter { backslashCommands: []string{ `\!`, `\?`, + `\C`, + `\H`, + `\T`, + `\Z`, `\a`, `\begin`, + `\bind`, `\c`, - `\connect`, - `\C`, `\cd`, `\commit`, + `\connect`, `\conninfo`, - `\copyright`, `\copy`, + `\copyright`, + `\cset`, `\d+`, + `\dS+`, + `\dS`, `\da+`, - `\da`, `\daS+`, `\daS`, + `\da`, `\df+`, - `\df`, `\dfS+`, `\dfS`, + `\df`, `\di+`, - `\di`, `\diS+`, `\diS`, + `\di`, `\dm+`, - `\dm`, `\dmS+`, `\dmS`, + `\dm`, `\dn+`, - `\dn`, `\dnS+`, `\dnS`, + `\dn`, `\drivers`, `\ds+`, - `\ds`, - `\dS+`, - `\dS`, `\dsS+`, `\dsS`, + `\ds`, `\dt+`, - `\dt`, `\dtS+`, `\dtS`, + `\dt`, `\dv+`, - `\dv`, `\dvS+`, `\dvS`, + `\dv`, `\e`, `\echo`, `\f`, `\g`, + `\getenv`, `\gexec`, `\gset`, `\gx`, - `\H`, `\i`, `\ir`, `\l+`, @@ -191,13 +196,11 @@ func NewDefaultCompleter(opts ...Option) readline.AutoCompleter { `\set`, `\setenv`, `\t`, - `\T`, `\timing`, `\unset`, `\w`, `\watch`, `\x`, - `\Z`, }, } for _, o := range opts { diff --git a/drivers/couchbase/couchbase.go b/drivers/couchbase/couchbase.go index ff5a218c4d1..4114bc63847 100644 --- a/drivers/couchbase/couchbase.go +++ b/drivers/couchbase/couchbase.go @@ -4,6 +4,8 @@ package couchbase import ( + "context" + "strconv" "strings" _ "github.com/couchbase/go_n1ql" // DRIVER: n1ql @@ -13,6 +15,27 @@ import ( func init() { drivers.Register("n1ql", drivers.Driver{ AllowMultilineComments: true, + Version: func(ctx context.Context, db drivers.DB) (string, error) { + ver := "" + /* + var buf []byte + if err := db.QueryRowContext(ctx, `SELECT ds_version() AS version`).Scan(&buf); err == nil { + var m map[string]string + if err := json.Unmarshal(buf, &m); err == nil { + if s, ok := m["version"]; ok { + ver = s + } + } + } + */ + var v string + if err := db.QueryRowContext(ctx, `SELECT RAW ds_version()`).Scan(&v); err == nil { + if s, err := strconv.Unquote(v); err == nil { + ver = s + } + } + return "Couchbase " + ver, nil + }, Err: func(err error) (string, string) { return "", strings.TrimPrefix(err.Error(), "N1QL: ") }, diff --git a/drivers/csvq/csvq.go b/drivers/csvq/csvq.go index 4493558e025..ba09636608b 100644 --- a/drivers/csvq/csvq.go +++ b/drivers/csvq/csvq.go @@ -11,6 +11,7 @@ import ( "github.com/mithrandie/csvq-driver" // DRIVER "github.com/mithrandie/csvq/lib/query" + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) @@ -18,7 +19,7 @@ func init() { csvq.SetStdout(query.NewDiscard()) drivers.Register("csvq", drivers.Driver{ AllowMultilineComments: true, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { typ, q := drivers.QueryExecType(prefix, sqlstr) if strings.HasPrefix(prefix, "SHOW") { csvq.SetStdout(os.Stdout) diff --git a/drivers/databend/databend.go b/drivers/databend/databend.go index f5437fc3570..18998529826 100644 --- a/drivers/databend/databend.go +++ b/drivers/databend/databend.go @@ -1,12 +1,12 @@ // Package databend defines and registers usql's Databend driver. // -// See: https://github.com/databendcloud/databend-go +// See: https://github.com/datafuselabs/databend-go package databend import ( "io" - _ "github.com/databendcloud/databend-go" // DRIVER + _ "github.com/datafuselabs/databend-go" // DRIVER "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/metadata" infos "github.com/xo/usql/drivers/metadata/informationschema" diff --git a/drivers/drivers.go b/drivers/drivers.go index dc8e21d5f96..2a721a9c0d4 100644 --- a/drivers/drivers.go +++ b/drivers/drivers.go @@ -74,7 +74,9 @@ type Driver struct { // IsPasswordErr will be used by IsPasswordErr if defined. IsPasswordErr func(error) bool // Process will be used by Process if defined. - Process func(string, string) (string, string, bool, error) + Process func(*dburl.URL, string, string) (string, string, bool, error) + // ColumnTypes is a callback that will be used if + ColumnTypes func(*sql.ColumnType) (interface{}, error) // RowsAffected will be used by RowsAffected if defined. RowsAffected func(sql.Result) (int64, error) // Err will be used by Error.Error if defined. @@ -246,13 +248,18 @@ func User(ctx context.Context, u *dburl.URL, db DB) (string, error) { // Process processes the sql query for a driver. func Process(u *dburl.URL, prefix, sqlstr string) (string, string, bool, error) { if d, ok := drivers[u.Driver]; ok && d.Process != nil { - a, b, c, err := d.Process(prefix, sqlstr) + a, b, c, err := d.Process(u, prefix, sqlstr) return a, b, c, WrapErr(u.Driver, err) } typ, q := QueryExecType(prefix, sqlstr) return typ, sqlstr, q, nil } +// ColumnTypes returns the column types callback for a driver. +func ColumnTypes(u *dburl.URL) func(*sql.ColumnType) (interface{}, error) { + return drivers[u.Driver].ColumnTypes +} + // IsPasswordErr returns true if an err is a password error for a driver. func IsPasswordErr(u *dburl.URL, err error) bool { drv := u.Driver @@ -533,16 +540,12 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db * if !strings.HasPrefix(strings.ToLower(query), "insert into") { leftParen := strings.IndexRune(table, '(') if leftParen == -1 { - colStmt, err := db.PrepareContext(ctx, "SELECT * FROM "+table+" WHERE 1=0") - if err != nil { - return 0, fmt.Errorf("failed to prepare query to determine target table columns: %w", err) - } - defer colStmt.Close() - colRows, err := colStmt.QueryContext(ctx) + colRows, err := db.QueryContext(ctx, "SELECT * FROM "+table+" WHERE 1=0") if err != nil { return 0, fmt.Errorf("failed to execute query to determine target table columns: %w", err) } columns, err := colRows.Columns() + _ = colRows.Close() if err != nil { return 0, fmt.Errorf("failed to fetch target table columns: %w", err) } @@ -569,8 +572,11 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db * return 0, fmt.Errorf("failed to fetch source column types: %w", err) } values := make([]interface{}, clen) + valueRefs := make([]reflect.Value, clen) + actuals := make([]interface{}, clen) for i := 0; i < len(columnTypes); i++ { - values[i] = reflect.New(columnTypes[i].ScanType()).Interface() + valueRefs[i] = reflect.New(columnTypes[i].ScanType()) + values[i] = valueRefs[i].Interface() } var n int64 for rows.Next() { @@ -578,7 +584,12 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db * if err != nil { return n, fmt.Errorf("failed to scan row: %w", err) } - res, err := stmt.ExecContext(ctx, values...) + //We can't use values... in Exec() below, because some drivers + //don't accept pointer to an argument instead of the arg itself. + for i := range values { + actuals[i] = valueRefs[i].Elem().Interface() + } + res, err := stmt.ExecContext(ctx, actuals...) if err != nil { return n, fmt.Errorf("failed to exec insert: %w", err) } @@ -597,3 +608,7 @@ func CopyWithInsert(placeholder func(int) string) func(ctx context.Context, db * return n, rows.Err() } } + +func init() { + dburl.OdbcIgnoreQueryPrefixes = []string{"usql_"} +} diff --git a/drivers/drivers_test.go b/drivers/drivers_test.go index 1ed8cd5e7c3..ead41f786ee 100644 --- a/drivers/drivers_test.go +++ b/drivers/drivers_test.go @@ -115,6 +115,10 @@ var ( DSN: "trino://test@localhost:%s/tpch/sf1", DockerPort: "8080/tcp", }, + "csvq": { + // go test sets working directory to current package regardless of initial working directory + DSN: "csvq://./testdata/csvq", + }, } cleanup bool ) @@ -144,30 +148,21 @@ func TestMain(m *testing.M) { } for dbName, db := range dbs { - var ok bool - db.Resource, ok = pool.ContainerByName(db.RunOptions.Name) - if !ok { - buildOpts := &dt.BuildOptions{ - ContextDir: "./testdata/docker", - BuildArgs: db.BuildArgs, - } - db.Resource, err = pool.BuildAndRunWithBuildOptions(buildOpts, db.RunOptions) - if err != nil { - log.Fatalf("Could not start %s: %s", dbName, err) - } - } - - hostPort := db.Resource.GetPort(db.DockerPort) - db.URL, err = dburl.Parse(fmt.Sprintf(db.DSN, hostPort)) + dsn, hostPort := getConnInfo(dbName, db, pool) + db.URL, err = dburl.Parse(dsn) if err != nil { log.Fatalf("Failed to parse %s URL %s: %v", dbName, db.DSN, err) } if len(db.Exec) != 0 { + readyDSN := db.ReadyDSN if db.ReadyDSN == "" { - db.ReadyDSN = db.DSN + readyDSN = db.DSN } - readyURL, err := dburl.Parse(fmt.Sprintf(db.ReadyDSN, hostPort)) + if hostPort != "" { + readyDSN = fmt.Sprintf(db.ReadyDSN, hostPort) + } + readyURL, err := dburl.Parse(readyDSN) if err != nil { log.Fatalf("Failed to parse %s ready URL %s: %v", dbName, db.ReadyDSN, err) } @@ -205,8 +200,10 @@ func TestMain(m *testing.M) { // You can't defer this because os.Exit doesn't care for defer if cleanup { for _, db := range dbs { - if err := pool.Purge(db.Resource); err != nil { - log.Fatal("Could not purge resource: ", err) + if db.Resource != nil { + if err := pool.Purge(db.Resource); err != nil { + log.Fatal("Could not purge resource: ", err) + } } } } @@ -214,6 +211,35 @@ func TestMain(m *testing.M) { os.Exit(code) } +func getConnInfo(dbName string, db *Database, pool *dt.Pool) (string, string) { + if db.RunOptions == nil { + return db.DSN, "" + } + + var ok bool + db.Resource, ok = pool.ContainerByName(db.RunOptions.Name) + if ok && !db.Resource.Container.State.Running { + err := db.Resource.Close() + if err != nil { + log.Fatalf("Failed to clean up stale container %s: %s", dbName, err) + } + ok = false + } + if !ok { + buildOpts := &dt.BuildOptions{ + ContextDir: "./testdata/docker", + BuildArgs: db.BuildArgs, + } + var err error + db.Resource, err = pool.BuildAndRunWithBuildOptions(buildOpts, db.RunOptions) + if err != nil { + log.Fatalf("Failed to start %s: %s", dbName, err) + } + } + hostPort := db.Resource.GetPort(db.DockerPort) + return fmt.Sprintf(db.DSN, hostPort), hostPort +} + func TestWriter(t *testing.T) { type testFunc struct { label string @@ -422,6 +448,15 @@ func TestCopy(t *testing.T) { src: "select * from staff", dest: "staff_copy", }, + { + dbName: "pgsql", + setupQueries: []setupQuery{ + {query: "DROP TABLE staff_copy"}, + {query: "CREATE TABLE staff_copy AS SELECT * FROM staff WHERE 0=1", check: true}, + }, + src: "select * from staff", + dest: "public.staff_copy", + }, { dbName: "pgx", setupQueries: []setupQuery{ @@ -431,6 +466,15 @@ func TestCopy(t *testing.T) { src: "select * from staff", dest: "staff_copy", }, + { + dbName: "pgx", + setupQueries: []setupQuery{ + {query: "DROP TABLE staff_copy"}, + {query: "CREATE TABLE staff_copy AS SELECT * FROM staff WHERE 0=1", check: true}, + }, + src: "select * from staff", + dest: "public.staff_copy", + }, { dbName: "mysql", setupQueries: []setupQuery{ @@ -449,6 +493,14 @@ func TestCopy(t *testing.T) { src: "select first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update from staff", dest: "staff_copy(first_name, last_name, address_id, picture, email, store_id, active, username, password, last_update)", }, + { + dbName: "csvq", + setupQueries: []setupQuery{ + {query: "CREATE TABLE IF NOT EXISTS staff_copy AS SELECT * FROM `staff.csv` WHERE 0=1", check: true}, + }, + src: "select first_name, last_name, address_id, email, store_id, active, username, password, last_update from staff", + dest: "staff_copy", + }, } for _, test := range testCases { db, ok := dbs[test.dbName] @@ -456,30 +508,33 @@ func TestCopy(t *testing.T) { continue } - // TODO test copy from a different DB, maybe csvq? - // TODO test copy from same DB + t.Run(test.dbName, func(t *testing.T) { - for _, q := range test.setupQueries { - _, err := db.DB.Exec(q.query) - if q.check && err != nil { - log.Fatalf("Failed to run setup query `%s`: %v", q.query, err) + // TODO test copy from a different DB, maybe csvq? + // TODO test copy from same DB + + for _, q := range test.setupQueries { + _, err := db.DB.Exec(q.query) + if q.check && err != nil { + t.Fatalf("Failed to run setup query `%s`: %v", q.query, err) + } + } + rows, err := pg.DB.Query(test.src) + if err != nil { + t.Fatalf("Could not get rows to copy: %v", err) } - } - rows, err := pg.DB.Query(test.src) - if err != nil { - log.Fatalf("Could not get rows to copy: %v", err) - } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - var rlen int64 = 1 - n, err := drivers.Copy(ctx, db.URL, nil, nil, rows, test.dest) - if err != nil { - log.Fatalf("Could not copy: %v", err) - } - if n != rlen { - log.Fatalf("Expected to copy %d rows but got %d", rlen, n) - } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + var rlen int64 = 1 + n, err := drivers.Copy(ctx, db.URL, nil, nil, rows, test.dest) + if err != nil { + t.Fatalf("Could not copy: %v", err) + } + if n != rlen { + t.Fatalf("Expected to copy %d rows but got %d", rlen, n) + } + }) } } diff --git a/drivers/duckdb/duckdb.go b/drivers/duckdb/duckdb.go index ddb00bbd950..909dbc22422 100644 --- a/drivers/duckdb/duckdb.go +++ b/drivers/duckdb/duckdb.go @@ -5,15 +5,137 @@ package duckdb import ( "context" + "database/sql" + "fmt" "io" + "strings" _ "github.com/marcboeker/go-duckdb" // DRIVER "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/metadata" + infos "github.com/xo/usql/drivers/metadata/informationschema" mymeta "github.com/xo/usql/drivers/metadata/mysql" ) +type metaReader struct { + metadata.LoggingReader +} + +var ( + _ metadata.CatalogReader = &metaReader{} + _ metadata.ColumnStatReader = &metaReader{} +) + +func (r metaReader) Catalogs(metadata.Filter) (*metadata.CatalogSet, error) { + qstr := `SHOW catalogs` + rows, closeRows, err := r.Query(qstr) + if err != nil { + return nil, err + } + defer closeRows() + + results := []metadata.Catalog{} + for rows.Next() { + rec := metadata.Catalog{} + err = rows.Scan(&rec.Catalog) + if err != nil { + return nil, err + } + results = append(results, rec) + } + if rows.Err() != nil { + return nil, rows.Err() + } + return metadata.NewCatalogSet(results), nil +} + +func (r metaReader) ColumnStats(f metadata.Filter) (*metadata.ColumnStatSet, error) { + names := []string{} + if f.Catalog != "" { + names = append(names, f.Catalog+".") + } + if f.Schema != "" { + names = append(names, f.Schema+".") + } + names = append(names, f.Parent) + rows, closeRows, err := r.Query(fmt.Sprintf("SHOW STATS FOR %s", strings.Join(names, ""))) + if err != nil { + return nil, err + } + defer closeRows() + + results := []metadata.ColumnStat{} + for rows.Next() { + rec := metadata.ColumnStat{Catalog: f.Catalog, Schema: f.Schema, Table: f.Parent} + name := sql.NullString{} + avgWidth := sql.NullInt32{} + numDistinct := sql.NullInt64{} + nullFrac := sql.NullFloat64{} + numRows := sql.NullInt64{} + min := sql.NullString{} + max := sql.NullString{} + err = rows.Scan( + &name, + &avgWidth, + &numDistinct, + &nullFrac, + &numRows, + &min, + &max, + ) + if err != nil { + return nil, err + } + if !name.Valid { + continue + } + rec.Name = name.String + if avgWidth.Valid { + rec.AvgWidth = int(avgWidth.Int32) + } + if numDistinct.Valid { + rec.NumDistinct = numDistinct.Int64 + } + if nullFrac.Valid { + rec.NullFrac = nullFrac.Float64 + } + if min.Valid { + rec.Min = min.String + } + if max.Valid { + rec.Max = max.String + } + results = append(results, rec) + } + if rows.Err() != nil { + return nil, rows.Err() + } + + return metadata.NewColumnStatSet(results), nil +} + func init() { + newReader := func(db drivers.DB, opts ...metadata.ReaderOption) metadata.Reader { + ir := infos.New( + infos.WithPlaceholder(func(int) string { return "?" }), + infos.WithCustomClauses(map[infos.ClauseName]string{ + infos.ColumnsColumnSize: "0", + infos.ColumnsNumericScale: "0", + infos.ColumnsNumericPrecRadix: "0", + infos.ColumnsCharOctetLength: "0", + }), + infos.WithFunctions(false), + infos.WithSequences(false), + infos.WithIndexes(false), + infos.WithConstraints(false), + infos.WithColumnPrivileges(false), + infos.WithUsagePrivileges(false), + )(db, opts...) + mr := &metaReader{ + LoggingReader: metadata.NewLoggingReader(db, opts...), + } + return metadata.NewPluginReader(ir, mr) + } drivers.Register("duckdb", drivers.Driver{ AllowMultilineComments: true, Version: func(ctx context.Context, db drivers.DB) (string, error) { @@ -24,9 +146,9 @@ func init() { } return "DuckDB " + ver, nil }, - NewMetadataReader: mymeta.NewReader, + NewMetadataReader: newReader, NewMetadataWriter: func(db drivers.DB, w io.Writer, opts ...metadata.ReaderOption) metadata.Writer { - return metadata.NewDefaultWriter(mymeta.NewReader(db, opts...))(db, w) + return metadata.NewDefaultWriter(newReader(db, opts...))(db, w) }, Copy: drivers.CopyWithInsert(func(int) string { return "?" }), NewCompleter: mymeta.NewCompleter, diff --git a/drivers/flightsql/flightsql.go b/drivers/flightsql/flightsql.go index d15dd171d7d..da7e1b4a035 100644 --- a/drivers/flightsql/flightsql.go +++ b/drivers/flightsql/flightsql.go @@ -4,7 +4,7 @@ package flightsql import ( - _ "github.com/apache/arrow/go/v12/arrow/flight/flightsql/driver" // DRIVER + _ "github.com/apache/arrow/go/v16/arrow/flight/flightsql/driver" // DRIVER "github.com/xo/usql/drivers" ) diff --git a/drivers/genji/genji.go b/drivers/genji/genji.go deleted file mode 100644 index af9cc352222..00000000000 --- a/drivers/genji/genji.go +++ /dev/null @@ -1,14 +0,0 @@ -// Package genji defines and registers usql's Genji driver. -// -// Group: bad -// See: https://github.com/genjidb/genji -package genji - -import ( - _ "github.com/genjidb/genji/driver" // DRIVER - "github.com/xo/usql/drivers" -) - -func init() { - drivers.Register("genji", drivers.Driver{}) -} diff --git a/drivers/metadata/informationschema/metadata.go b/drivers/metadata/informationschema/metadata.go index ea97bfe1f6f..4fdf25f97de 100644 --- a/drivers/metadata/informationschema/metadata.go +++ b/drivers/metadata/informationschema/metadata.go @@ -192,7 +192,7 @@ func WithCurrentSchema(expr string) metadata.ReaderOption { } } -// WithDataTypeFormatter function to build updated string represenation of data type +// WithDataTypeFormatter function to build updated string representation of data type // from Column func WithDataTypeFormatter(f func(metadata.Column) string) metadata.ReaderOption { return func(r metadata.Reader) { @@ -606,7 +606,7 @@ JOIN information_schema.columns c ON return metadata.NewIndexColumnSet(results), nil } -// Constraintes from selected catalog (or all, if empty), matching schemas and names +// Constraints from selected catalog (or all, if empty), matching schemas and names func (s InformationSchema) Constraints(f metadata.Filter) (*metadata.ConstraintSet, error) { if !s.hasConstraints { return nil, text.ErrNotSupported diff --git a/drivers/odbc/odbc.go b/drivers/odbc/odbc.go index 1f64384d06a..abbe4851e5f 100644 --- a/drivers/odbc/odbc.go +++ b/drivers/odbc/odbc.go @@ -6,15 +6,29 @@ package odbc import ( + "regexp" "strings" "github.com/alexbrainman/odbc" // DRIVER + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) func init() { + endRE := regexp.MustCompile(`;?\s*$`) + endAnchorRE := regexp.MustCompile(`(?i)\send\s*;\s*$`) drivers.Register("odbc", drivers.Driver{ LexerName: "tsql", + Process: func(u *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { + // trim last ; but only when not END; + if s := strings.ToLower(u.Query().Get("usql_trim")); s != "" && s != "off" && s != "0" && s != "false" { + if !endAnchorRE.MatchString(sqlstr) { + sqlstr = endRE.ReplaceAllString(sqlstr, "") + } + } + typ, q := drivers.QueryExecType(prefix, sqlstr) + return typ, sqlstr, q, nil + }, IsPasswordErr: func(err error) bool { if e, ok := err.(*odbc.Error); ok { msg := strings.ToLower(e.Error()) diff --git a/drivers/oracle/orshared/orshared.go b/drivers/oracle/orshared/orshared.go index 4e2161ad422..af5cb4e7307 100644 --- a/drivers/oracle/orshared/orshared.go +++ b/drivers/oracle/orshared/orshared.go @@ -55,7 +55,7 @@ func Register(name string, err func(error) (string, string), isPasswordErr func( }, Err: err, IsPasswordErr: isPasswordErr, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { if !endAnchorRE.MatchString(sqlstr) { // trim last ; but only when not END; sqlstr = endRE.ReplaceAllString(sqlstr, "") diff --git a/drivers/pgx/pgx.go b/drivers/pgx/pgx.go index 1f75b8f6348..b847124b88d 100644 --- a/drivers/pgx/pgx.go +++ b/drivers/pgx/pgx.go @@ -11,12 +11,14 @@ import ( "io" "strings" - "github.com/jackc/pgconn" "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" "github.com/jackc/pgx/v5/stdlib" // DRIVER + "github.com/xo/dburl" "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/metadata" pgmeta "github.com/xo/usql/drivers/metadata/postgres" + "github.com/xo/usql/text" ) func init() { @@ -24,6 +26,33 @@ func init() { AllowDollar: true, AllowMultilineComments: true, LexerName: "postgres", + Open: func(ctx context.Context, u *dburl.URL, stdout, stderr func() io.Writer) (func(string, string) (*sql.DB, error), error) { + return func(_, dsn string) (*sql.DB, error) { + config, err := pgx.ParseConfig(dsn) + if err != nil { + return nil, err + } + config.OnNotice = func(_ *pgconn.PgConn, notice *pgconn.Notice) { + out := stderr() + fmt.Fprintln(out, notice.Severity+": ", notice.Message) + if notice.Hint != "" { + fmt.Fprintln(out, "HINT: ", notice.Hint) + } + } + config.OnNotification = func(_ *pgconn.PgConn, notification *pgconn.Notification) { + var payload string + if notification.Payload != "" { + payload = fmt.Sprintf(text.NotificationPayload, notification.Payload) + } + fmt.Fprintln(stdout(), fmt.Sprintf(text.NotificationReceived, notification.Channel, payload, notification.PID)) + } + // NOTE: as opposed to the github.com/lib/pq driver, this + // NOTE: driver has a "prefer" mode that is enabled by default. + // NOTE: as such there is no logic here to try to reconnect as + // NOTE: in the postgres driver. + return stdlib.OpenDB(*config), nil + }, nil + }, Version: func(ctx context.Context, db drivers.DB) (string, error) { var ver string err := db.QueryRowContext(ctx, `SHOW server_version`).Scan(&ver) @@ -93,7 +122,7 @@ func init() { var n int64 err = conn.Raw(func(driverConn interface{}) error { conn := driverConn.(*stdlib.Conn).Conn() - n, err = conn.CopyFrom(ctx, pgx.Identifier{table}, columns, crows) + n, err = conn.CopyFrom(ctx, pgx.Identifier(strings.SplitN(table, ".", 2)), columns, crows) return err }) return n, err @@ -112,7 +141,11 @@ func (r *copyRows) Next() bool { func (r *copyRows) Values() ([]interface{}, error) { err := r.rows.Scan(r.values...) - return r.values, err + actuals := make([]interface{}, len(r.values)) + for i, v := range r.values { + actuals[i] = *(v.(*interface{})) + } + return actuals, err } func (r *copyRows) Err() error { diff --git a/drivers/postgres/postgres.go b/drivers/postgres/postgres.go index 31118b23b53..335fed2fd6c 100644 --- a/drivers/postgres/postgres.go +++ b/drivers/postgres/postgres.go @@ -137,7 +137,11 @@ func init() { if err != nil { return 0, fmt.Errorf("failed to fetch target table columns: %w", err) } - query = pq.CopyIn(table, columns...) + if schemaSep := strings.Index(table, "."); schemaSep >= 0 { + query = pq.CopyInSchema(table[:schemaSep], table[schemaSep+1:], columns...) + } else { + query = pq.CopyIn(table, columns...) + } } tx, err := db.BeginTx(ctx, nil) if err != nil { diff --git a/drivers/presto/presto.go b/drivers/presto/presto.go index 09a4278f6b8..6b2c5d57cd7 100644 --- a/drivers/presto/presto.go +++ b/drivers/presto/presto.go @@ -8,6 +8,7 @@ import ( "regexp" _ "github.com/prestodb/presto-go-client/presto" // DRIVER + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) @@ -15,7 +16,7 @@ func init() { endRE := regexp.MustCompile(`;?\s*$`) drivers.Register("presto", drivers.Driver{ AllowMultilineComments: true, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { sqlstr = endRE.ReplaceAllString(sqlstr, "") typ, q := drivers.QueryExecType(prefix, sqlstr) return typ, sqlstr, q, nil diff --git a/drivers/qtype.go b/drivers/qtype.go index 77989ed62c4..91b043f5c0c 100644 --- a/drivers/qtype.go +++ b/drivers/qtype.go @@ -213,6 +213,34 @@ var execMap = map[string]bool{ "UNLISTEN": true, // stop listening for a notification "UPDATE": true, // update rows of a table "VACUUM": true, // garbage-collect and optionally analyze a database + // oracle + "ADMINISTER KEY MANAGEMENT": true, + "ALTER ANALYTIC VIEW": true, + "ALTER ATTRIBUTE DIMENSION": true, + "ALTER AUDIT POLICY": true, + "ALTER CLUSTER": true, + "ALTER DATABASE DICTIONARY": true, + "ALTER DATABASE LINK": true, + "ALTER DIMENSION": true, + "ALTER DISKGROUP": true, + "ALTER FLASHBACK ARCHIVE": true, + "ALTER HEIRARCHY": true, + "ALTER INMEMORY JOIN GROUP": true, + "ALTER JAVA": true, + "ALTER LIBRARY": true, + "ALTER LOCKDOWN PROFILE": true, + "ALTER MATERIALIZED VIEW LOG": true, + "ALTER MATERIALIZED ZONEMAP": true, + "ALTER PACKAGE": true, + "ALTER PLUGGABLE DATABASE": true, + "ALTER PROCEDURE": true, + "ALTER PROFILE": true, + "ALTER RESOURCE COST": true, + "ALTER ROLLBACK SEGMENT": true, + "ALTER SESSION": true, + "ALTER SYNONYM": true, + "ALTER TABLESPACE SET": true, + "ASSOCIATE STATISTICS": true, } // createIgnore are parts of the query exec type after CREATE to ignore. diff --git a/drivers/ramsql/ramsql.go b/drivers/ramsql/ramsql.go new file mode 100644 index 00000000000..a34d816eca8 --- /dev/null +++ b/drivers/ramsql/ramsql.go @@ -0,0 +1,13 @@ +// Package ramsql defines and registers usql's RamSQL driver. +// +// See: https://github.com/proullon/ramsql +package ql + +import ( + _ "github.com/proullon/ramsql/driver" // DRIVER + "github.com/xo/usql/drivers" +) + +func init() { + drivers.Register("ramsql", drivers.Driver{}) +} diff --git a/drivers/sapase/sapase.go b/drivers/sapase/sapase.go index 621abdc6d68..f7c96652c20 100644 --- a/drivers/sapase/sapase.go +++ b/drivers/sapase/sapase.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/thda/tds" // DRIVER: tds + "github.com/xo/dburl" "github.com/xo/usql/drivers" ) @@ -48,7 +49,7 @@ func init() { IsPasswordErr: func(err error) bool { return strings.Contains(err.Error(), "Login failed") }, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { sqlstr = endRE.ReplaceAllString(sqlstr, "") typ, q := drivers.QueryExecType(prefix, sqlstr) return typ, sqlstr, q, nil diff --git a/drivers/sqlserver/sqlserver.go b/drivers/sqlserver/sqlserver.go index e88ffad911e..8371e1446ed 100644 --- a/drivers/sqlserver/sqlserver.go +++ b/drivers/sqlserver/sqlserver.go @@ -6,11 +6,13 @@ package sqlserver import ( "context" + "database/sql" "fmt" "io" "strconv" "strings" + mssql "github.com/microsoft/go-mssqldb" sqlserver "github.com/microsoft/go-mssqldb" // DRIVER "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/metadata" @@ -59,6 +61,16 @@ func init() { _, err := db.Exec(`ALTER LOGIN ` + user + ` WITH password = '` + newpw + `' old_password = '` + oldpw + `'`) return err }, + ColumnTypes: func(col *sql.ColumnType) (interface{}, error) { + switch col.DatabaseTypeName() { + case "UNIQUEIDENTIFIER": + if nullable, ok := col.Nullable(); ok && nullable { + return new(NullUniqueIdentifier), nil + } + return new(mssql.UniqueIdentifier), nil + } + return new(interface{}), nil + }, Err: func(err error) (string, string) { if e, ok := err.(sqlserver.Error); ok { return strconv.Itoa(int(e.Number)), e.Message @@ -83,3 +95,27 @@ func init() { func placeholder(n int) string { return fmt.Sprintf("@p%d", n) } + +type NullUniqueIdentifier struct { + ID mssql.UniqueIdentifier + Valid bool +} + +func (nui *NullUniqueIdentifier) Scan(v interface{}) error { + nui.Valid = false + if v == nil { + return nil + } + if err := nui.ID.Scan(v); err != nil { + return err + } + nui.Valid = true + return nil +} + +func (nui NullUniqueIdentifier) String() string { + if nui.Valid { + return nui.ID.String() + } + return "" +} diff --git a/drivers/testdata/csvq/.gitignore b/drivers/testdata/csvq/.gitignore new file mode 100644 index 00000000000..8ad2a688ce3 --- /dev/null +++ b/drivers/testdata/csvq/.gitignore @@ -0,0 +1 @@ +*_copy diff --git a/drivers/testdata/csvq/staff.csv b/drivers/testdata/csvq/staff.csv new file mode 100644 index 00000000000..454999dfe7e --- /dev/null +++ b/drivers/testdata/csvq/staff.csv @@ -0,0 +1,2 @@ +first_name,last_name,address_id,email,store_id,active,username,password,last_update +John,Doe,1,john@invalid.com,1,true,jdoe,abc,2024-05-10T08:12:05.46875Z diff --git a/drivers/trino/trino.go b/drivers/trino/trino.go index 088107b899a..d90ff68b994 100644 --- a/drivers/trino/trino.go +++ b/drivers/trino/trino.go @@ -9,6 +9,7 @@ import ( "regexp" _ "github.com/trinodb/trino-go-client/trino" // DRIVER + "github.com/xo/dburl" "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/metadata" infos "github.com/xo/usql/drivers/metadata/informationschema" @@ -39,7 +40,7 @@ func init() { } drivers.Register("trino", drivers.Driver{ AllowMultilineComments: true, - Process: func(prefix string, sqlstr string) (string, string, bool, error) { + Process: func(_ *dburl.URL, prefix string, sqlstr string) (string, string, bool, error) { sqlstr = endRE.ReplaceAllString(sqlstr, "") typ, q := drivers.QueryExecType(prefix, sqlstr) return typ, sqlstr, q, nil diff --git a/drivers/vertica/vertica.go b/drivers/vertica/vertica.go index 3185a99826b..8be41cb0248 100644 --- a/drivers/vertica/vertica.go +++ b/drivers/vertica/vertica.go @@ -8,66 +8,25 @@ import ( "crypto/tls" "crypto/x509" "database/sql" - "fmt" + "errors" "io" "net/url" "os" "regexp" "strings" - vertigo "github.com/vertica/vertica-sql-go" // DRIVER + vertica "github.com/vertica/vertica-sql-go" // DRIVER "github.com/vertica/vertica-sql-go/logger" "github.com/xo/dburl" "github.com/xo/usql/drivers" ) func init() { - // List of custom TLS configurations that may be applied via query in connection string. - customTlsConfig := map[string]func(string, *tls.Config) error{ - "ca_path": func(queryValue string, c *tls.Config) error { - rootCertPool := x509.NewCertPool() - - pem, err := os.ReadFile(queryValue) - if err != nil { - return err - } - - if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { - return fmt.Errorf("error: failed to append pem to cert pool") - } - - c.RootCAs = rootCertPool - - return nil - }, - } - - hasCustomTlsConfig := func(queries url.Values) bool { - for key := range customTlsConfig { - if queries.Has(key) { - return true - } - } - - return false - } - - applyCustomTlsConfig := func(queries url.Values, tlsConfig *tls.Config) error { - for key, configFunction := range customTlsConfig { - if queries.Has(key) { - if err := configFunction(queries.Get(key), tlsConfig); err != nil { - return err - } - } - } - - return nil - } - // turn off logging if os.Getenv("VERTICA_SQL_GO_LOG_LEVEL") == "" { logger.SetLogLevel(logger.NONE) } + errCodeRE := regexp.MustCompile(`(?i)^\[([0-9a-z]+)\]\s+(.+)`) drivers.Register("vertica", drivers.Driver{ AllowDollar: true, @@ -80,42 +39,28 @@ func init() { return ver, nil }, Open: func(_ context.Context, u *dburl.URL, stdout, stderr func() io.Writer) (func(string, string) (*sql.DB, error), error) { - return func(_, _ string) (*sql.DB, error) { - queries := u.Query() - - if hasCustomTlsConfig(queries) { - if queries.Get("tlsmode") != "server-strict" { - configNames := []string{} - - for key := range customTlsConfig { - configNames = append(configNames, key) - } - - return nil, fmt.Errorf(fmt.Sprintf("error: when custom tls configurations are set (%s), tlsmode must be set to server-strict", strings.Join(configNames, ","))) + return func(driver, dsn string) (*sql.DB, error) { + u, err := url.Parse(dsn) + if err != nil { + return nil, err + } + q := u.Query() + if name := q.Get("ca_path"); name != "" { + if q.Get("tlsmode") != "server-strict" { + return nil, errors.New("tlsmode must be set to server-strict: ca_path is set") } - - tlsConfig := &tls.Config{ServerName: u.Hostname()} - - if err := applyCustomTlsConfig(queries, tlsConfig); err != nil { + cfg := &tls.Config{ + ServerName: u.Hostname(), + } + if err := addCA(name, cfg); err != nil { return nil, err } - - if err := vertigo.RegisterTLSConfig("custom_tls_config", tlsConfig); err != nil { + if err := vertica.RegisterTLSConfig("custom_tls_config", cfg); err != nil { return nil, err } - - queries.Set("tlsmode", "custom_tls_config") - } - - dsn := url.URL{ - Scheme: u.Driver, - User: u.User, - Host: u.Host, - Path: u.Path, - RawQuery: queries.Encode(), + q.Set("tlsmode", "custom_tls_config") } - - return sql.Open(u.Driver, dsn.String()) + return sql.Open(driver, u.String()) }, nil }, ChangePassword: func(db drivers.DB, user, newpw, _ string) error { @@ -134,3 +79,16 @@ func init() { }, }) } + +// addCA adds the specified file name as a ca to the tls config. +func addCA(name string, cfg *tls.Config) error { + pool := x509.NewCertPool() + switch pem, err := os.ReadFile(name); { + case err != nil: + return err + case !pool.AppendCertsFromPEM(pem): + return errors.New("failed to append pem to cert pool") + } + cfg.RootCAs = pool + return nil +} diff --git a/env/env.go b/env/env.go index 50324fe87a5..e3fbe9a5b6c 100644 --- a/env/env.go +++ b/env/env.go @@ -15,6 +15,7 @@ import ( "strings" "unicode/utf8" + "github.com/kenshaw/rasterm" "github.com/xo/dburl/passfile" "github.com/xo/usql/text" ) @@ -200,13 +201,13 @@ func Shell(s string) error { } // Pipe starts a command and returns its input for writing. -func Pipe(c string) (io.WriteCloser, *exec.Cmd, error) { +func Pipe(stdout, stderr io.Writer, c string) (io.WriteCloser, *exec.Cmd, error) { shell, param := Getshell() if shell == "" { return nil, nil, text.ErrNoShellAvailable } cmd := exec.Command(shell, param, c) - cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + cmd.Stdout, cmd.Stderr = stdout, stderr out, err := cmd.StdinPipe() if err != nil { return nil, nil, err @@ -322,3 +323,11 @@ func Unquote(u *user.User, exec bool, v Vars) func(string, bool) (bool, string, return true, res, nil } } + +// TermGraphics returns the [rasterm.TermType] based on TERM_GRAPHICS +// environment variable. +func TermGraphics() rasterm.TermType { + var typ rasterm.TermType + _ = typ.UnmarshalText([]byte(Get("TERM_GRAPHICS"))) + return typ +} diff --git a/env/types.go b/env/types.go index c2f8f851d44..3a5ae72f300 100644 --- a/env/types.go +++ b/env/types.go @@ -3,8 +3,11 @@ package env import ( "fmt" "io" + "os" "os/exec" + "path/filepath" "regexp" + "runtime" "sort" "strconv" "strings" @@ -14,6 +17,7 @@ import ( syslocale "github.com/jeandeaual/go-locale" "github.com/xo/terminfo" "github.com/xo/usql/text" + "github.com/yookoala/realpath" ) type varName struct { @@ -117,6 +121,10 @@ var pvarNames = []varName{ "time", `format used to display time/date column values (default "RFC3339Nano")`, }, + { + "timezone", + `the timezone to display dates in (default '')`, + }, { "title", "set the table title for subsequently printed tables", @@ -166,7 +174,7 @@ var envVarNames = []varName{ }, { text.CommandUpper() + "_SSLMODE, SSLMODE", - "when set to 'retry', allows postgres connections to attempt to reconnect when no ?sslmode= was specified on the url", + "when set to 'retry', allows connections to attempt to reconnect when no ?sslmode= was specified on the url", }, { "SYNTAX_HL", @@ -184,6 +192,10 @@ var envVarNames = []varName{ "SYNTAX_HL_OVERRIDE_BG", "enables overriding the background color of the chroma styles", }, + { + "TERM_GRAPHICS", + `use the specified terminal graphics`, + }, { "SHELL", "shell used by the \\! command", @@ -208,7 +220,14 @@ func (v Vars) All() map[string]string { return map[string]string(v) } -var vars, pvars Vars +// vars are the environment variables. +var vars Vars + +// pvars are the environment printing variables. +var pvars Vars + +// cvars are the environment named connections. +var cvars map[string][]string func init() { cmdNameUpper := strings.ToUpper(text.CommandName) @@ -254,6 +273,7 @@ func init() { "SHOW_HOST_INFORMATION": enableHostInformation, "PAGER": pagerCmd, "EDITOR": editorCmd, + "QUIET": "off", "ON_ERROR_STOP": "off", // prompts "PROMPT1": "%S%N%m%/%R%# ", @@ -263,6 +283,7 @@ func init() { "SYNTAX_HL_STYLE": "monokai", "SYNTAX_HL_OVERRIDE_BG": "true", "SSLMODE": sslmode, + "TERM_GRAPHICS": "none", } // determine locale locale := "en-US" @@ -288,12 +309,14 @@ func init() { "recordsep_zero": "off", "tableattr": "", "time": "RFC3339Nano", + "timezone": "", "title": "", "tuples_only": "off", "unicode_border_linestyle": "single", "unicode_column_linestyle": "single", "unicode_header_linestyle": "single", } + cvars = make(map[string][]string) } // ValidIdentifier returns an error when n is not a valid identifier. @@ -470,7 +493,7 @@ func Ptoggle(name, extra string) (string, error) { pvars[name] = "aligned" } case "linestyle": - case "csv_fieldsep", "fieldsep", "null", "recordsep", "time", "locale": + case "csv_fieldsep", "fieldsep", "null", "recordsep", "time", "timezone", "locale": case "tableattr", "title": pvars[name] = "" case "unicode_border_linestyle", "unicode_column_linestyle", "unicode_header_linestyle": @@ -520,6 +543,11 @@ func Pset(name, value string) (string, error) { pvars[name] = value case "csv_fieldsep", "fieldsep", "null", "recordsep", "tableattr", "time", "title", "locale": pvars[name] = value + case "timezone": + if _, err := time.LoadLocation(value); err != nil { + return "", text.ErrInvalidTimezoneLocation + } + pvars[name] = value case "unicode_border_linestyle", "unicode_column_linestyle", "unicode_header_linestyle": if !borderRE.MatchString(value) { return "", text.ErrInvalidFormatBorderLineStyle @@ -531,8 +559,45 @@ func Pset(name, value string) (string, error) { return pvars[name], nil } -// timeConstMap is the time const name to value map. -var timeConstMap = map[string]string{ +// Cset sets a named connection for the environment. +func Cset(name string, vals ...string) error { + if err := ValidIdentifier(name); err != nil { + return err + } + if _, ok := cvars[name]; len(vals) == 0 || vals[0] == "" && ok { + delete(cvars, name) + } else { + v := make([]string, len(vals)) + copy(v, vals) + cvars[name] = v + } + return nil +} + +// Cget returns the environment's named connection. +func Cget(name string) ([]string, bool) { + vals, ok := cvars[name] + if !ok { + return nil, false + } + v := make([]string, len(vals)) + copy(v, vals) + return v, true +} + +// Call returns all named connections from the environment. +func Call() map[string][]string { + m := make(map[string][]string, len(cvars)) + for k, vals := range cvars { + v := make([]string, len(vals)) + copy(v, vals) + m[k] = v + } + return m +} + +// timeConsts are well known time consts. +var timeConsts = map[string]string{ "ANSIC": time.ANSIC, "UnixDate": time.UnixDate, "RubyDate": time.RubyDate, @@ -553,14 +618,14 @@ var timeConstMap = map[string]string{ // GoTime returns the user's time format converted to Go's time.Format value. func GoTime() string { tfmt := pvars["time"] - if s, ok := timeConstMap[tfmt]; ok { + if s, ok := timeConsts[tfmt]; ok { return s } return tfmt } -// Listing writes the formatted variables listing to w, separated into different -// sections for all known variables. +// Listing writes a formatted listing of the special environment variables to +// w, separated in sections based on variable type. func Listing(w io.Writer) { varsWithDesc := make([]string, len(varNames)) for i, v := range varNames { @@ -570,40 +635,85 @@ func Listing(w io.Writer) { for i, v := range pvarNames { pvarsWithDesc[i] = v.String() } - envVarsWithDesc := make([]string, len(envVarNames)) - for i, v := range envVarNames { + + // determine config dir name + configDir, configExtra := buildConfigDir("config.yaml") + + // environment var names + configDesc := configDir + if configExtra != "" { + configDesc = configExtra + } + ev := []varName{ + { + text.CommandUpper() + "_CONFIG", + fmt.Sprintf(`config file path (default %q)`, configDesc), + }, + } + envVarsWithDesc := make([]string, len(envVarNames)+1) + for i, v := range append(ev, envVarNames...) { envVarsWithDesc[i] = v.String() } - template := ` -List of specially treated variables + + if configExtra != "" { + configExtra = " (" + configExtra + ")" + } + + template := `List of specially treated variables %s variables: Usage: - %s --set=NAME=VALUE - or \set NAME VALUE inside %s - -%s + %[1]s --set=NAME=VALUE + or \set NAME VALUE inside %[1]s +%[2]s Display settings: Usage: - %s --pset=NAME[=VALUE] - or \pset NAME [VALUE] inside %s + %[1]s --pset=NAME[=VALUE] + or \pset NAME [VALUE] inside %[1]s -%s +%[3]s Environment variables: Usage: - NAME=VALUE [NAME=VALUE] %s ... - or \setenv NAME [VALUE] inside %s + NAME=VALUE [NAME=VALUE] %[1]s ... + or \setenv NAME [VALUE] inside %[1]s -%s +%[4]s +Connection variables: +Usage: + %[1]s --cset NAME[=DSN] + or \cset NAME [DSN] inside %[1]s + or \cset NAME DRIVER PARAMS... inside %[1]s + or define in %[5]s%[6]s ` fmt.Fprintf( w, template, - text.CommandName, text.CommandName, text.CommandName, strings.Join(varsWithDesc, "\n"), - text.CommandName, text.CommandName, strings.Join(pvarsWithDesc, "\n"), - text.CommandName, text.CommandName, strings.Join(envVarsWithDesc, "\n"), + text.CommandName, + strings.TrimRightFunc(strings.Join(varsWithDesc, ""), unicode.IsSpace), + strings.TrimRightFunc(strings.Join(pvarsWithDesc, ""), unicode.IsSpace), + strings.TrimRightFunc(strings.Join(envVarsWithDesc, ""), unicode.IsSpace), + configDir, + configExtra, ) } + +func buildConfigDir(configName string) (string, string) { + dir := `$HOME/.config/usql` + switch runtime.GOOS { + case "darwin": + dir = `$HOME/Library/Application Support` + case "windows": + dir = `%AppData%\usql` + } + configDir, err := os.UserConfigDir() + if err != nil { + return filepath.Join(dir, configName), "" + } + if configDir, err = realpath.Realpath(configDir); err != nil { + return filepath.Join(dir, configName), "" + } + return filepath.Join(dir, configName), filepath.Join(configDir, "usql", configName) +} diff --git a/go.mod b/go.mod index 10447d0b93e..efa69f3dc6d 100644 --- a/go.mod +++ b/go.mod @@ -1,206 +1,229 @@ module github.com/xo/usql -go 1.21 +go 1.23 + +toolchain go1.23rc2 require ( - github.com/ClickHouse/clickhouse-go/v2 v2.16.0 + github.com/ClickHouse/clickhouse-go/v2 v2.26.0 github.com/IBM/nzgo/v12 v12.0.8 github.com/MichaelS11/go-cql-driver v0.1.1 - github.com/SAP/go-hdb v1.6.3 + github.com/SAP/go-hdb v1.10.1 github.com/VoltDB/voltdb-client-go v1.0.15 - github.com/alecthomas/chroma/v2 v2.11.1 - github.com/alecthomas/kingpin/v2 v2.4.0 + github.com/alecthomas/chroma/v2 v2.14.0 github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9 github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9 github.com/amsokol/ignite-go-client v0.12.2 - github.com/apache/arrow/go/v12 v12.0.1 - github.com/apache/calcite-avatica-go/v5 v5.2.0 + github.com/apache/arrow/go/v16 v16.1.0 + github.com/apache/calcite-avatica-go/v5 v5.3.0 github.com/bippio/go-impala v2.1.0+incompatible - github.com/btnguyen2k/gocosmos v0.3.0 - github.com/btnguyen2k/godynamo v0.4.0 + github.com/btnguyen2k/gocosmos v1.1.0 + github.com/btnguyen2k/godynamo v1.3.0 + github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2 github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d - github.com/databendcloud/databend-go v0.4.6 - github.com/databricks/databricks-sql-go v1.5.2 - github.com/docker/docker v24.0.7+incompatible - github.com/exasol/exasol-driver-go v1.0.4 - github.com/genjidb/genji v0.15.2 - github.com/go-sql-driver/mysql v1.7.1 + github.com/databricks/databricks-sql-go v1.5.7 + github.com/datafuselabs/databend-go v0.6.8 + github.com/docker/docker v26.1.1+incompatible + github.com/exasol/exasol-driver-go v1.0.9 + github.com/go-git/go-billy/v5 v5.5.0 + github.com/go-sql-driver/mysql v1.8.1 github.com/gocql/gocql v1.6.0 - github.com/godror/godror v0.40.4 + github.com/godror/godror v0.44.2 github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c github.com/google/go-cmp v0.6.0 github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f - github.com/googleapis/go-sql-spanner v1.1.1 - github.com/jackc/pgconn v1.14.1 - github.com/jackc/pgx/v5 v5.5.0 - github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173 + github.com/googleapis/go-sql-spanner v1.6.0 + github.com/jackc/pgx/v5 v5.6.0 + github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 github.com/jmrobles/h2go v0.5.0 + github.com/kenshaw/rasterm v0.1.10 github.com/lib/pq v1.10.9 - github.com/marcboeker/go-duckdb v1.5.4 + github.com/marcboeker/go-duckdb v1.7.0 github.com/mattn/go-adodb v0.0.1 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.18 - github.com/microsoft/go-mssqldb v1.6.0 + github.com/mattn/go-sqlite3 v1.14.22 + github.com/microsoft/go-mssqldb v1.7.2 github.com/mithrandie/csvq v1.18.1 github.com/mithrandie/csvq-driver v1.7.0 - github.com/nakagami/firebirdsql v0.9.6 + github.com/nakagami/firebirdsql v0.9.10 github.com/ory/dockertest/v3 v3.10.0 - github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e - github.com/sijms/go-ora/v2 v2.7.24 - github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8 + github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783 + github.com/proullon/ramsql v0.1.4 + github.com/sijms/go-ora/v2 v2.8.19 + github.com/snowflakedb/gosnowflake v1.10.1 + github.com/spf13/cobra v1.8.0 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.18.2 github.com/thda/tds v0.1.7 - github.com/trinodb/trino-go-client v0.313.0 - github.com/uber/athenadriver v1.1.14 + github.com/trinodb/trino-go-client v0.315.0 + github.com/uber/athenadriver v1.1.15 github.com/vertica/vertica-sql-go v1.3.3 - github.com/xo/dburl v0.19.1 - github.com/xo/tblfmt v0.10.3 + github.com/xo/chartfmt v0.0.0 + github.com/xo/dburl v0.23.2 + github.com/xo/tblfmt v0.13.2 github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e - github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 + github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2 github.com/yookoala/realpath v1.0.0 github.com/ziutek/mymysql v1.5.4 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 gorm.io/driver/bigquery v1.2.0 modernc.org/ql v1.4.7 - modernc.org/sqlite v1.27.0 + modernc.org/sqlite v1.31.1 sqlflow.org/gohive v0.0.0-20231130013447-c9657f0f21f9 sqlflow.org/gomaxcompute v0.0.0-20210805062559-c14ae028b44c ) require ( - cloud.google.com/go v0.111.0 // indirect - cloud.google.com/go/bigquery v1.57.1 // indirect - cloud.google.com/go/compute v1.23.3 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/longrunning v0.5.4 // indirect - cloud.google.com/go/spanner v1.53.0 // indirect + cel.dev/expr v0.15.0 // indirect + cloud.google.com/go v0.115.0 // indirect + cloud.google.com/go/auth v0.7.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect + cloud.google.com/go/bigquery v1.62.0 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect + cloud.google.com/go/iam v1.1.12 // indirect + cloud.google.com/go/longrunning v0.5.11 // indirect + cloud.google.com/go/spanner v1.64.0 // indirect + dario.cat/mergo v1.0.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/ClickHouse/ch-go v0.60.0 // indirect - github.com/DATA-DOG/go-sqlmock v1.5.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/ClickHouse/ch-go v0.62.0 // indirect + github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0 // indirect + github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect github.com/IBM/nzgo v11.1.0+incompatible // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11 // indirect - github.com/andybalholm/brotli v1.0.6 // indirect - github.com/apache/thrift v0.19.0 // indirect + github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/apache/arrow/go/v12 v12.0.1 // indirect + github.com/apache/arrow/go/v14 v14.0.2 // indirect + github.com/apache/arrow/go/v15 v15.0.2 // indirect + github.com/apache/thrift v0.20.0 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect - github.com/aws/aws-sdk-go v1.48.8 // indirect - github.com/aws/aws-sdk-go-v2 v1.23.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.7 // indirect - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 // indirect - github.com/aws/smithy-go v1.18.0 // indirect - github.com/beltran/gohive v1.6.0 // indirect - github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6 // indirect + github.com/aws/aws-sdk-go v1.55.3 // indirect + github.com/aws/aws-sdk-go-v2 v1.30.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2 // indirect + github.com/aws/smithy-go v1.20.3 // indirect + github.com/beltran/gohive v1.7.0 // indirect + github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66 // indirect github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/btnguyen2k/consu/checksum v1.1.0 // indirect - github.com/btnguyen2k/consu/gjrc v0.2.1 // indirect + github.com/bitfield/gotestdox v0.2.2 // indirect + github.com/btnguyen2k/consu/checksum v1.1.1 // indirect + github.com/btnguyen2k/consu/g18 v0.1.0 // indirect + github.com/btnguyen2k/consu/gjrc v0.2.2 // indirect github.com/btnguyen2k/consu/olaf v0.1.3 // indirect - github.com/btnguyen2k/consu/reddo v0.1.8 // indirect + github.com/btnguyen2k/consu/reddo v0.1.9 // indirect github.com/btnguyen2k/consu/semita v0.1.5 // indirect github.com/buger/jsonparser v1.1.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect - github.com/cockroachdb/errors v1.10.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a // indirect + github.com/cockroachdb/pebble v1.1.1 // indirect github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect - github.com/containerd/containerd v1.7.7 // indirect - github.com/containerd/continuity v0.4.2 // indirect - github.com/coreos/go-oidc/v3 v3.5.0 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/containerd/containerd v1.7.12 // indirect + github.com/containerd/continuity v0.4.3 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/coreos/go-oidc/v3 v3.11.0 // indirect github.com/couchbase/go-couchbase v0.1.1 // indirect - github.com/couchbase/gomemcached v0.2.1 // indirect + github.com/couchbase/gomemcached v0.3.1 // indirect github.com/couchbase/goutils v0.1.2 // indirect - github.com/danieljoos/wincred v1.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dlclark/regexp2 v1.10.0 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/dlclark/regexp2 v1.11.2 // indirect github.com/dnephin/pflag v1.0.7 // indirect - github.com/docker/cli v20.10.17+incompatible // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/cli v26.0.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5 // indirect + github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/elastic/go-sysinfo v1.11.2 // indirect - github.com/elastic/go-windows v1.0.1 // indirect - github.com/envoyproxy/go-control-plane v0.11.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect + github.com/elastic/go-sysinfo v1.14.0 // indirect + github.com/elastic/go-windows v1.0.2 // indirect + github.com/envoyproxy/go-control-plane v0.12.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/exasol/error-reporting-go v0.2.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/getsentry/sentry-go v0.22.0 // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/getsentry/sentry-go v0.28.1 // indirect github.com/go-faster/city v1.0.1 // indirect - github.com/go-faster/errors v0.7.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.0 // indirect + github.com/go-faster/errors v0.7.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.3 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-zookeeper/zk v1.0.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect + github.com/go-zookeeper/zk v1.0.4 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/godror/knownpb v0.1.1 // indirect + github.com/godror/knownpb v0.1.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang-jwt/jwt/v5 v5.1.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang-module/carbon/v2 v2.3.12 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215 // indirect - github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f // indirect - github.com/google/s2a-go v0.1.7 // indirect + github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 // indirect + github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8 // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/hashicorp/go-cleanhttp v0.5.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.1 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/icholy/digest v0.1.22 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgio v1.0.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/icholy/digest v0.1.23 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.2 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect @@ -208,117 +231,129 @@ require ( github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/jedib0t/go-pretty/v6 v6.4.9 // indirect + github.com/jedib0t/go-pretty/v6 v6.5.9 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect - github.com/jonboulle/clockwork v0.3.0 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect - github.com/klauspost/compress v1.17.4 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-sixel v0.0.5 // indirect github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect - github.com/minio/sio v0.3.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mithrandie/go-file/v2 v2.1.0 // indirect github.com/mithrandie/go-text v1.6.0 // indirect github.com/mithrandie/ternary v1.1.1 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect - github.com/opencontainers/runc v1.1.5 // indirect - github.com/paulmach/orb v0.10.0 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect - github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/opencontainers/runc v1.1.12 // indirect + github.com/paulmach/orb v0.11.1 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.17.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/zerolog v1.28.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/zerolog v1.33.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/segmentio/asm v1.2.0 // indirect - github.com/shopspring/decimal v1.3.1 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/soniakeys/quant v1.0.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/stretchr/objx v0.5.1 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/twmb/murmur3 v1.1.8 // indirect - github.com/uber-go/tally v3.5.8+incompatible // indirect + github.com/uber-go/tally v3.5.10+incompatible // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/xo/echartsgoja v0.1.1 // indirect + github.com/xo/resvg v0.6.0 // indirect + github.com/xo/vegagoja v0.1.0 // indirect github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 // indirect - github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd // indirect + github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.25.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.22.0 // indirect + golang.org/x/term v0.22.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.16.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/api v0.152.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect - google.golang.org/grpc v1.59.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/tools v0.23.0 // indirect + golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect + google.golang.org/api v0.189.0 // indirect + google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f // indirect + google.golang.org/grpc v1.65.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect gopkg.in/jcmturner/gokrb5.v6 v6.1.1 // indirect gopkg.in/jcmturner/rpc.v1 v1.1.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/gotestsum v1.8.2 // indirect - howett.net/plist v1.0.0 // indirect - lukechampine.com/uint128 v1.3.0 // indirect + gotest.tools/gotestsum v1.12.0 // indirect + howett.net/plist v1.0.1 // indirect modernc.org/b v1.1.0 // indirect - modernc.org/cc/v3 v3.41.0 // indirect - modernc.org/ccgo/v3 v3.16.15 // indirect modernc.org/db v1.0.10 // indirect modernc.org/file v1.0.8 // indirect - modernc.org/fileutil v1.2.0 // indirect + modernc.org/fileutil v1.3.0 // indirect + modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e // indirect modernc.org/golex v1.1.0 // indirect modernc.org/internal v1.1.0 // indirect - modernc.org/libc v1.34.11 // indirect + modernc.org/libc v1.55.4 // indirect modernc.org/lldb v1.0.8 // indirect modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.7.2 // indirect - modernc.org/opt v0.1.3 // indirect + modernc.org/memory v1.8.0 // indirect modernc.org/sortutil v1.2.0 // indirect modernc.org/strutil v1.2.0 // indirect modernc.org/token v1.1.0 // indirect modernc.org/zappy v1.1.0 // indirect ) + +replace github.com/xo/chartfmt => ../chartfmt diff --git a/go.sum b/go.sum index b7829fbd736..fa2563baa5e 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,11 @@ +cel.dev/expr v0.15.0 h1:O1jzfJCQBfL5BFoYktaxwIhuttaQPsVWerH9/EEKx0w= +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= 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= @@ -15,6 +18,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY 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= @@ -26,26 +30,96 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y 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.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +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.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= +cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= +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/auth v0.7.2 h1:uiha352VrCDMXg+yoBtaD0tUF4Kv9vrtrWPYXwutnDE= +cloud.google.com/go/auth v0.7.2/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs= +cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI= +cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I= 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= @@ -53,14 +127,46 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM 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.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +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/bigquery v1.62.0 h1:SYEA2f7fKqbSRRBHb7g0iHTtZvtPSPYdXfmqsjpsBwo= +cloud.google.com/go/bigquery v1.62.0/go.mod h1:5ee+ZkF1x/ntgCsFQJAQTM3QkAZOecfCmvxhkJsWRSA= 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= @@ -68,171 +174,498 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz 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.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +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.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +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.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +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/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +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.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +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/datacatalog v1.20.4 h1:nUR7JBPZezl1+o+86N01VxAQQHY+It/D8tmNipcdVjI= +cloud.google.com/go/datacatalog v1.20.4/go.mod h1:71PDwywIYkNgSXdUU3H0mkTp3j15aahfYJ1CY3DogtU= 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 v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +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/iam v1.1.12 h1:JixGLimRrNGcxvJEQ8+clfLxPlbeZA6MuRJ+qJNQ5Xw= +cloud.google.com/go/iam v1.1.12/go.mod h1:9LDX8J7dN5YRyzVHxwQzrQs9opFFqn0Mxs9nAeB+Hhg= +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/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +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/longrunning v0.5.11 h1:Havn1kGjz3whCfoD8dxMLP73Ph5w+ODyZB9RUsDxtGk= +cloud.google.com/go/longrunning v0.5.11/go.mod h1:rDn7//lmlfWV1Dx6IB4RatCPenTwwmqXuiP0/RgoEO4= +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/spanner v1.53.0 h1:/NzWQJ1MEhdRcffiutRKbW/AIGVKhcTeivWTDjEyCCo= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +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/spanner v1.64.0 h1:ltyPbHA/nRAtAhU/o742dXBCI1eNHPeaRY09Ja8B+hM= +cloud.google.com/go/spanner v1.64.0/go.mod h1:TOFx3pb2UwPsDGlE1gTehW+y6YlU4IFk+VdDHSGQS/M= 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.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +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/storage v1.42.0 h1:4QtGpplCVt1wz6g5o1ifXd656P5z+yNgzdw1tVfp0cU= +cloud.google.com/go/storage v1.42.0/go.mod h1:HjMXRFq65pGKFn6hxj6x3HCyR41uSB72Z0SO/Vn6JFQ= +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= -fyne.io/fyne v1.4.2/go.mod h1:xL4c3WmpE/Tvz5CEm5vqsaizU/EeOCm9DYlL2GtTSiM= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +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= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0/go.mod h1:Q28U+75mpCaSCDowNEmhIo/rmgdkqmkmzI7N6TGR4UY= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= -github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 h1:hVeq+yCyUi+MsoO/CU95yqCIcdzra5ovzk8Q2BBpV2M= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 h1:Be6KInmFEKV81c0pOAEbRYehLMwmmGI1exuFj248AMk= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0/go.mod h1:WCPBHsOXfBVnivScjs2ypRfimjEW0qPVLGgJkZlrIOA= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.60.0 h1:kDZcVIKKHk7jwqSP5RYdTvabrAyUQYvGFRUdtDVkISA= -github.com/ClickHouse/ch-go v0.60.0/go.mod h1:POJBl0MxEMS91Zd0uTgDDt05KfXEjf5KIwW6lNhje9Y= -github.com/ClickHouse/clickhouse-go/v2 v2.16.0 h1:rhMfnPewXPnY4Q4lQRGdYuTLRBRKJEIEYHtbUMrzmvI= -github.com/ClickHouse/clickhouse-go/v2 v2.16.0/go.mod h1:J7SPfIxwR+x4mQ+o8MLSe0oY50NNntEqCIjFe/T1VPM= +github.com/ClickHouse/ch-go v0.62.0 h1:eXH0hytXeCEEZHgMvOX9IiW7wqBb4w1MJMp9rArbkrc= +github.com/ClickHouse/ch-go v0.62.0/go.mod h1:uzso52/PD9+gZj7tL6XAo8/EYDrx7CIwNF4c6PnO6S0= +github.com/ClickHouse/clickhouse-go/v2 v2.26.0 h1:j4/y6NYaCcFkJwN/TU700ebW+nmsIy34RmUAAcZKy9w= +github.com/ClickHouse/clickhouse-go/v2 v2.26.0/go.mod h1:iDTViXk2Fgvf1jn2dbJd1ys+fBkdD1UMRnXlwmhijhQ= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0 h1:ye3LRgDs6Og7SKC1wBQH8oMaGczhCRpPpnU74l4rma8= github.com/DataDog/zstd v1.5.6-0.20230622172052-ea68dcab66c0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1fXGaK9wTkXHgNp8/ZNMQzUxE= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/IBM/nzgo v11.1.0+incompatible h1:CaaDdlBodPo+ZiHuMMWBpfSQlSH88/nxCzsdCnQRbAA= github.com/IBM/nzgo v11.1.0+incompatible/go.mod h1:n1QK6KJjNa8fe+HQPynW+mJpRpkffLXMO8LR9Nja0JU= github.com/IBM/nzgo/v12 v12.0.8 h1:unEfHMkLoy3Jpexuh//vJEo1OOzrVoux4lNSsUxbwJA= github.com/IBM/nzgo/v12 v12.0.8/go.mod h1:8pc57twtekw0e38NedvaxVuf80Hy3JR95ORTKEvUyAQ= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -240,112 +673,112 @@ github.com/MichaelS11/go-cql-driver v0.1.1 h1:ntFKov/39Tl36HckP4tzld3XMeyDYHHO00 github.com/MichaelS11/go-cql-driver v0.1.1/go.mod h1:rMwGk5bMWiYI/If6r6dbqEfZG6nQLvqJHTplv5yTDaw= 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/Microsoft/hcsshim v0.11.1 h1:hJ3s7GbWlGK4YVV92sO88BQSyF4ZLVy7/awqOlPxFbA= -github.com/Microsoft/hcsshim v0.11.1/go.mod h1:nFJmaO4Zr5Y7eADdFOpYswDDlNVbvcIJJNJLECr5JQg= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/SAP/go-hdb v1.6.3 h1:O2DTMCf4vGYG7W6TjrSIezUz7y0mF5j/E6w6ol1pbho= -github.com/SAP/go-hdb v1.6.3/go.mod h1:TKQ0SvP6dwcVKCu4q9yisg5mTtWPoAbc3lLzkgrAC5M= +github.com/SAP/go-hdb v1.10.1 h1:c9dGT5xHZNDwPL3NQcRpnNISn3MchwYaGoMZpCAllUs= +github.com/SAP/go-hdb v1.10.1/go.mod h1:vxYDca44L2eRudZv5JAI6T+IygOfxb7vOCFh/Kj0pug= github.com/UNO-SOFT/zlog v0.8.1 h1:TEFkGJHtUfTRgMkLZiAjLSHALjwSBdw6/zByMC5GJt4= github.com/UNO-SOFT/zlog v0.8.1/go.mod h1:yqFOjn3OhvJ4j7ArJqQNA+9V+u6t9zSAyIZdWdMweWc= github.com/VoltDB/voltdb-client-go v1.0.15 h1:G7rZxKiemYkaYZLoLamhRnAOGyq5wlyqPefCAAflB/0= github.com/VoltDB/voltdb-client-go v1.0.15/go.mod h1:mMhb5zwkT46Ef3NvkFqt+kX0j+ltQ2Sdqj9+ICq+Yto= -github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= -github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= -github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/chroma/v2 v2.11.1 h1:m9uUtgcdAwgfFNxuqj7AIG75jD2YmL61BBIJWtdzJPs= -github.com/alecthomas/chroma/v2 v2.11.1/go.mod h1:4TQu7gdfuPjSh76j78ietmqh9LiurGF0EpseFXdKMBw= -github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= -github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:3YVZUqkoev4mL+aCwVOSWV4M7pN+NURHL38Z2zq5JKA= +github.com/ahmetb/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:ymXt5bw5uSNu4jveerFxE0vNYxF8ncqbptntMaFMg3k= +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/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= +github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9 h1:Evz52dTPsOXCOQr953SIXw7/7FB1jj+Z3NzWVzV54qA= github.com/alexbrainman/odbc v0.0.0-20230814102256-1421b829acc9/go.mod h1:c5eyz5amZqTKvY3ipqerFO/74a/8CYmXOahSr40c+Ww= github.com/aliyun/aliyun-tablestore-go-sdk v1.7.3/go.mod h1:PWqq46gZJf7mnYTAuTmxKgx6EwJu3oBpOs1s2V0EZPM= -github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11 h1:ZFZs0Oa2xuKbn4SvPpO6mEkufz0e+q0WeXqZFhqYRtY= -github.com/aliyun/aliyun-tablestore-go-sdk v1.7.11/go.mod h1:aVqKjL2cmkgs0JOUf++ayBLI5ChiUdrbRp1vcA77c64= +github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15 h1:xWsS17q0vSwdO13ZPzQVIAiLGHAgJs/zqPf6bUZpHrQ= +github.com/aliyun/aliyun-tablestore-go-sdk v1.7.15/go.mod h1:JzOJMpBPGN+4cuYnrGO5wdwphEyqbeGVY2vCaiAcNW8= github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9 h1:DpsLZRlqHH1b2QyoLDK1/MtUtm7zuiQweA6hsTY97do= github.com/aliyun/aliyun-tablestore-go-sql-driver v0.0.0-20220418015234-4d337cb3eed9/go.mod h1:4yTI9ZSYNi4eENMKL8VWP22MzoDKeqDT4j7Fd103BVQ= github.com/amsokol/ignite-go-client v0.12.2 h1:q4Mr+UUiKVnR7ykjR1YARVS5jp+ZU6ekCIs0V4WgFDo= github.com/amsokol/ignite-go-client v0.12.2/go.mod h1:K3tKJGcLQORFD+ds7f0f9fl88tv0KZcpfuNhzRyuLVE= -github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +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/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= -github.com/apache/calcite-avatica-go/v5 v5.2.0 h1:9SQf9qz/iUaC39lvRDqFGmVVtoIWtnDB94YNg2Dy+UY= -github.com/apache/calcite-avatica-go/v5 v5.2.0/go.mod h1:R9YlGqS8pPRnWAW1peGPpVax49XcujI7GLebaz9sOfk= -github.com/apache/thrift v0.19.0 h1:sOqkWPzMj7w6XaYbJQG7m4sGqVolaW/0D28Ln7yPzMk= -github.com/apache/thrift v0.19.0/go.mod h1:SUALL216IiaOw2Oy+5Vs9lboJ/t9g40C+G07Dc0QC1I= +github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw= +github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= +github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= +github.com/apache/arrow/go/v16 v16.1.0 h1:dwgfOya6s03CzH9JrjCBx6bkVb4yPD4ma3haj9p7FXI= +github.com/apache/arrow/go/v16 v16.1.0/go.mod h1:9wnc9mn6vEDTRIm4+27pEjQpRKuTvBaessPoEXQzxWA= +github.com/apache/calcite-avatica-go/v5 v5.3.0 h1:7Gooh7opt3TObRe7WstTWbQGaA16ERjzoGeB26l3s/w= +github.com/apache/calcite-avatica-go/v5 v5.3.0/go.mod h1:xgozzeFAHCh2ZZ7NCrD4CHx9waunSMOMXLDZRj9Gn3s= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= +github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.37.32/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.48.8 h1:KE7PPWWbvU/qvuSCASrKalblCZGsYaiU5JVw6vsGAWI= -github.com/aws/aws-sdk-go v1.48.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.23.3 h1:Q98kldotjjQimJumYc7tjJRBWOefARezGhP8nIlnExE= -github.com/aws/aws-sdk-go-v2 v1.23.3/go.mod h1:6wqGJPusLvL1YYcoxj4vPtACABVl0ydN1sxzBetRcsw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2 h1:1oGZAnpWWnJgPPWC07RrXt2Ah0qbfbzP466aruiX8pk= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.2/go.mod h1:XBiFjNGW7x9HG45+j5YGxEcN83ORvTNbzE54kNDJuYo= -github.com/aws/aws-sdk-go-v2/config v1.25.9 h1:B04q0cjw4nkynqKsKAusTokhlWH2rOt9NsciQuT1UZE= -github.com/aws/aws-sdk-go-v2/config v1.25.9/go.mod h1:HeYi24CXmvvcFGip8e60q7b0dnrpL6QHn57/eetIW+g= -github.com/aws/aws-sdk-go-v2/credentials v1.13.27/go.mod h1:syOqAek45ZXZp29HlnRS/BNgMIW6uiRmeuQsz4Qh2UE= -github.com/aws/aws-sdk-go-v2/credentials v1.16.7 h1:n07M7lmFiEuyefWXkm7OMSFZLit8BDy2qaw+kMEvycw= -github.com/aws/aws-sdk-go-v2/credentials v1.16.7/go.mod h1:i5yksOJbXOIZVqv10vOFZeT4wgdWFWviM3e9iMuTGlQ= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31 h1:E8dD+ybAgXQDoXzFdosX8nKBG78yZLZLY83JGtuvyx8= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.31/go.mod h1:KBfz/i2tcY+0H3IOOOMVk9Olw8GRmgFPlKamh4Ro0ts= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5/go.mod h1:Gj7tm95r+QsDoN2Fhuz/3npQvcZbkEf5mL70n3Xfluc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.7 h1:Uo0l91jAocWBN8bJzAsAeSLE3WBwGBG9+pbE9zVH5dA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.7/go.mod h1:flStEZ4FT4jfSRGMYaA4gWBU28u5uLJ1CNsSbdhucng= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2 h1:nW/0hPtPEnwIHv+bYeu8Y3Et2UvlFX0fEbgB/1AaeT4= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.15.2/go.mod h1:nQKVS2n6oYb6GfOAvURbuBC7gHs5TWtFFq58R61imz4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6 h1:i7OAczGP6jELUbKC8p/qS/LwCc0U3OKZqWQbb8lp0CA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.6/go.mod h1:d8JTl9EfMC8x7cWRUTOBNHTk/GJ9UsqdANQqAAMKo4s= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6 h1:1oWfl2FGxd7jYqmxbCZHI634v1FOoCWyBLYj9Imj0wM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.6/go.mod h1:9hhwbyCoH/tgJqXTVj/Ef0nGYJVr7+R/pfOx4OZ99KU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6 h1:PwAdPhlij28U62OUi+WmxQ+9bO1efg6coxpE+sk00dg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.6/go.mod h1:KRa2wmoEt38uXpnNKtORDswczZGl1hQNDrkfE6+LhnM= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1 h1:gknY3OHEGXaLamootb1VaJSohtHwcIMGvm23VnZVIzE= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.20.1/go.mod h1:iA/evsHrPWhDyMj6cuMa6qlFTqSqYXoKs8LSvIFauTA= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15 h1:yonnEISVD77M77F813Va41d8wl3A1W6HhfEmrVOcqfM= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.14.15/go.mod h1:3zUTVwCixtSfFyNFK0P0x92IMkfTZQpuXH7Lk/WbW9g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2 h1:/3LHJKFV+VEIEIZi2I3q4K2wgQwNwAW2t0SXnCCEg28= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.2/go.mod h1:IfJeNmXVQIpeR7LviG93t479TtAkBqF92cSnyy5yG1o= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6 h1:eU9m+2vE8ILkr71WK5RJ2pysYngcKoN1Kv5kThuV6J4= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.6/go.mod h1:W8gOSyIsMgmaFnm+CkRHLz0skCyz9cS5SZlBalHkzII= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29 h1:gajv/wALzb2KgK9YKq1jW+y2ZgL5o4A+UZmFfZi8lSY= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.29/go.mod h1:SYEgYIjFeLoPSOCIqdFr44QiBwGlnsUIHqMD5OZnsgg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6 h1:8CbUQkqKstwiVI4fz74O7hFfOyQfsA4UuaJtO+X0nX8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.6/go.mod h1:ssHSTCS9CeO6QDbT5+2e6shPpZhzLNSwI5KvgH9rKdM= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6 h1:GCW9ULjE7qIwzGPcoOnv4h4htx/XxWDy+WJevY30QcI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.6/go.mod h1:YqS77Hii1ITov+Tpf0CGkQdBJCm5L9Wo2C7fhask92M= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0 h1:7KZW8jwPTB/94/ghX8j+kw03zl2ftxDv7PGwA0l+6uw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.47.0/go.mod h1:bL8ey+ugMUesj7F1tF8GJkq14i7qhIsSaCJshRWC3Og= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.13/go.mod h1:DfX0sWuT46KpcqbMhJ9QWtxAIP1VozkDWf8VAkByjYY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.0 h1:JX7BhiMtfBARMib+HHKwBJIT9KOJ1Pd3WCuMTawlFGg= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.0/go.mod h1:Ue5IlnFHeOoLpNXylq+J3Ue3Fq8MjAcSuh8wCqSHKQ0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13/go.mod h1:BzqsVVFduubEmzrVtUFQQIQdFqvUItF8XUq2EnS8Wog= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.0 h1:ffOjyqfqEgqZv5zeXfaLaUKofqoSP3znpWxUKkRbBc4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.0/go.mod h1:FTwjnnqupa0CRANldhsnRVgzaPzhAy/XZYddy06JOLU= -github.com/aws/aws-sdk-go-v2/service/sts v1.19.3/go.mod h1:yVGZA1CPkmUhBdA039jXNJJG7/6t+G+EBWmFq23xqnY= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.0 h1:E0i/PbCoOu04ichWZfLoSgidxkHh7HGfC8l9HWdALi8= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.0/go.mod h1:YHpL2uHCmZtSkDJYc2gG0LSZkeColBGi2TZyCFG8GmE= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.18.0 h1:uWqjOwPEqjzmQXpwm/8cwUWTmFhT9Ypc8tECXrshDsI= -github.com/aws/smithy-go v1.18.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= -github.com/beltran/gohive v1.6.0 h1:VqKaSeYhae4cY9QHfw8uqWZARq9yJdydiOVsqS63KbE= -github.com/beltran/gohive v1.6.0/go.mod h1:IgDi0gD1c73aKKQyS+3j1+NWSNn5NUK7rDcg/Rr6mTs= -github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6 h1:OPqfeBd/oCkMl9I4D999xqr8ExmXWA6I2tXIKsGlTLQ= -github.com/beltran/gosasl v0.0.0-20231124144235-92b2e4f10bb6/go.mod h1:Qx8cW6jkI8riyzmklj80kAIkv+iezFUTBiGU0qHhHes= +github.com/aws/aws-sdk-go v1.55.3 h1:0B5hOX+mIx7I5XPOrjrHlKSDQV/+ypFZpIHOx5LOk3E= +github.com/aws/aws-sdk-go v1.55.3/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY= +github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= +github.com/aws/aws-sdk-go-v2/config v1.27.27 h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90= +github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10 h1:orAIBscNu5aIjDOnKIrjO+IUFPMLKj3Lp0bPf4chiPc= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.14.10/go.mod h1:GNjJ8daGhv10hmQYCnmkV8HuY6xXOXV4vzBssSjEIlU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9 h1:TC2vjvaAv1VNl9A0rm+SeuBjrzXnrlwk6Yop+gKRi38= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.9/go.mod h1:WPv2FRnkIOoDv/8j2gSUsI4qDc7392w5anFB/I89GZ8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4 h1:utG3S4T+X7nONPIpRoi1tVcQdAdJxntiVS2yolPJyXc= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.4/go.mod h1:q9vzW3Xr1KEXa8n4waHiFt1PrppNDlMymlYP+xpsFbY= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3 h1:r27/FnxLPixKBRIlslsvhqscBuMK8uysCYG9Kfgm098= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.22.3/go.mod h1:jqOFyN+QSWSoQC+ppyc4weiO8iNQXbzRbxDjQ1ayYd4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17/go.mod h1:oBtcnYua/CgzCWYN7NZ5j7PotFDaFSUjCYVTtfyn7vw= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16 h1:lhAX5f7KpgwyieXjbDnRTjPEUI0l3emSRyxXj1PXP8w= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.16/go.mod h1:AblAlCwvi7Q/SFowvckgN+8M3uFPlopSYeLlbNDArhA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 h1:246A4lSTXWJw/rmlQI+TT2OcqeDMKBdyjEQrafMaQdA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15/go.mod h1:haVfg3761/WF7YPuJOER2MP0k4UAXyHaLclKXB6usDg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2 h1:sZXIzO38GZOU+O0C+INqbH7C2yALwfMWpd64tONS/NE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.58.2/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ= +github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= +github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/beltran/gohive v1.7.0 h1:Jvz6yrWuAAUWZ1Y84+24NjMcWYkUZZBUE7/sTWtLKY0= +github.com/beltran/gohive v1.7.0/go.mod h1:IgDi0gD1c73aKKQyS+3j1+NWSNn5NUK7rDcg/Rr6mTs= +github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66 h1:n0oppIiuivyic1ER0KPR6atp3xouMWt1tEtqM4OyvnI= +github.com/beltran/gosasl v0.0.0-20240525201126-ea45571eeb66/go.mod h1:Qx8cW6jkI8riyzmklj80kAIkv+iezFUTBiGU0qHhHes= github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab h1:ayfcn60tXOSYy5zUN1AMSTQo4nJCf7hrdzAVchpPst4= github.com/beltran/gssapi v0.0.0-20200324152954-d86554db4bab/go.mod h1:GLe4UoSyvJ3cVG+DVtKen5eAiaD8mAJFuV5PT3Eeg9Q= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -353,140 +786,151 @@ 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/bippio/go-impala v2.1.0+incompatible h1:H/N1Ms5KhVa2IoRZ6NO9ZzBryfTGhNiLG/zmNXS0CHY= github.com/bippio/go-impala v2.1.0+incompatible/go.mod h1:lcyV/9s/ri5lFj3zdyyneQwDso8/Fd62fELt05Wts8g= +github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE= +github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/btnguyen2k/consu/checksum v0.1.2/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670= -github.com/btnguyen2k/consu/checksum v1.1.0 h1:1Sqa48s9WJsejwmVUfmSsSBG0z7sPfgSQa8atKCiMqY= -github.com/btnguyen2k/consu/checksum v1.1.0/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670= -github.com/btnguyen2k/consu/gjrc v0.1.1/go.mod h1:jOTI8M8Kkly9fHyeSoBTw3o2Q9ayQEEYTHQfedIEqzE= -github.com/btnguyen2k/consu/gjrc v0.2.1 h1:RUgbgs1NDpuUDfY7PSyva8AShyui+ds1MOzmi2k0SfM= -github.com/btnguyen2k/consu/gjrc v0.2.1/go.mod h1:+aPcD9tY5x8gHH5+RdCqBDvEO4hw4kXruUz+lBG01QI= +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/btnguyen2k/consu/checksum v1.1.1 h1:kdIJGk3yl83Nn1HxZRk3bXJM0xvlwTcTYUmZ8BiloPU= +github.com/btnguyen2k/consu/checksum v1.1.1/go.mod h1:/zZ8EXdphDYEkBFua51hK9y3rODCPIkiZYnCDlHT670= +github.com/btnguyen2k/consu/g18 v0.1.0 h1:IoS5w5QlOfkcrNOHJyICD6PgqLh+J5fIDqy3vRBVcVM= +github.com/btnguyen2k/consu/g18 v0.1.0/go.mod h1:gTPcr87XdCLDISusRQyDey22/ZOw6bLh6EChxTLx6/c= +github.com/btnguyen2k/consu/gjrc v0.2.2 h1:CAY8xPgvtWc7EMTE9gxam/BxMgTRRpc4Hs9QEyYxRUc= +github.com/btnguyen2k/consu/gjrc v0.2.2/go.mod h1:Sc0NehbI0i8V6FAY9qX1we9XXbWNnrMOb9jNpYqGBWk= github.com/btnguyen2k/consu/olaf v0.1.3 h1:0dWWmN5nOB/9pJdo7o1S3wR2+l3kG7pXHv3Vwki8uNM= github.com/btnguyen2k/consu/olaf v0.1.3/go.mod h1:6ybEnJcdcK/PNiSfkKnMoxYuKyH2vJPBvHRuuZpPvD8= -github.com/btnguyen2k/consu/reddo v0.1.4/go.mod h1:6L2l4rRFQlyGWlKxt9SiwYs/wB6SE70oxFcrTo/YLPY= -github.com/btnguyen2k/consu/reddo v0.1.6/go.mod h1:6L2l4rRFQlyGWlKxt9SiwYs/wB6SE70oxFcrTo/YLPY= github.com/btnguyen2k/consu/reddo v0.1.7/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg= -github.com/btnguyen2k/consu/reddo v0.1.8 h1:pEAkB6eadp/q+ONy97/JkAAyj058uIgkSu8b862Fwug= github.com/btnguyen2k/consu/reddo v0.1.8/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg= -github.com/btnguyen2k/consu/semita v0.1.4/go.mod h1:EmOAKM4o+iljiR2kShq3MlIvGrzALnUW4IkgI292p10= +github.com/btnguyen2k/consu/reddo v0.1.9 h1:NZyEzRcDXzksNMnvZVZyJmGN6ZQQmHg4hIPCPbfsCBE= +github.com/btnguyen2k/consu/reddo v0.1.9/go.mod h1:pdY5oIVX3noZIaZu3nvoKZ59+seXL/taXNGWh9xJDbg= github.com/btnguyen2k/consu/semita v0.1.5 h1:fu71xNJTbCV8T+6QPJdJu3bxtmLWvTjCepkvujF74+I= github.com/btnguyen2k/consu/semita v0.1.5/go.mod h1:fksCe3L4kxiJVnKKhUXKI8mcFdB9974mtedwUVVFu1M= -github.com/btnguyen2k/gocosmos v0.3.0 h1:218OaZpnWRuXoHiLA8DuSf80xL0If7n9Yt8N6t2JWvI= -github.com/btnguyen2k/gocosmos v0.3.0/go.mod h1:eToVV+1+mpht97WvC/EzTOb+4kHTUc/9Z2zNUSKbCUI= -github.com/btnguyen2k/godynamo v0.4.0 h1:LRZP+zUJTmjdiiw79nYeROL7DYgOnMfDgQ8HT6TqjYg= -github.com/btnguyen2k/godynamo v0.4.0/go.mod h1:bSdMy6LEfgRW6X3tOOEKS6xfuQgSmaMYIzFU59NqP2k= +github.com/btnguyen2k/consu/semver v0.2.1 h1:le0FzrM7u0IOR4MnOyBySHpZ/p3vV4JjofAhPB7edWE= +github.com/btnguyen2k/consu/semver v0.2.1/go.mod h1:jxK/nwIWTXcWlcWcfkhPfLWq9b5dVzAtJLycySBFHTc= +github.com/btnguyen2k/gocosmos v1.1.0 h1:16OIhDTAK6ChyjQMjG+yHEO/MGdO8UsCeJ/2xiY9eRE= +github.com/btnguyen2k/gocosmos v1.1.0/go.mod h1:g599FZ7hAt6XZ108baotFrBr4U/r5xoyyQ8VyAZerL8= +github.com/btnguyen2k/godynamo v1.3.0 h1:8Ri9gVWMvBWlD5P04AEVrl2QcmMQR7KgC3zSCl/YLWw= +github.com/btnguyen2k/godynamo v1.3.0/go.mod h1:vNE48BoUAZS4F5ohrZ7suhw61DmCiXSClKrJfr2maTo= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 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 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 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/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2 h1:vLtnPMqbTuTQcnfn5EDipZI0PISMSn7AMmz6HhAu+GU= +github.com/chaisql/chai v0.16.1-0.20240218103834-23e406360fd2/go.mod h1:ix/NVvPO+dv6wsmln8R5H22yJb0iIj6KrGpouHaJmrE= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= 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 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 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 h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= 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-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +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-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= -github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a h1:f52TdbU4D5nozMAhO9TvTJ2ZMCXtN4VIAmfrrZ0JXQ4= +github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a h1:i6xm42ImQ7wEqCJKrdasK7QXiV8kc6IP2R2hfylniHU= -github.com/cockroachdb/pebble v0.0.0-20230718183418-628c4107d05a/go.mod h1:FN5O47SBEz5+kO9fG8UTR64g2WS1u5ZFCgTvxGjoSks= +github.com/cockroachdb/pebble v1.1.1 h1:XnKU22oiCLy2Xn8vp1re67cXg4SAasg/WDt1NtcRFaw= +github.com/cockroachdb/pebble v1.1.1/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 h1:DJK8W/iB+s/qkTtmXSrHA49lp5O3OsR7E6z4byOLy34= -github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.7.7 h1:QOC2K4A42RQpcrZyptP6z9EJZnlHfHJUfZrAAHe15q4= -github.com/containerd/containerd v1.7.7/go.mod h1:3c4XZv6VeT9qgf9GMTxNTMFxGJrGpI2vz1yk4ye+YY8= -github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= -github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= -github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= +github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= +github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/couchbase/go-couchbase v0.1.1 h1:ClFXELcKj/ojyoTYbsY34QUrrYCBi/1G749sXSCkdhk= github.com/couchbase/go-couchbase v0.1.1/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A= github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d h1:jOxYt3U9z+tj2WDvacvBhXmHXDt+EUR5Hbu56wTw6QY= github.com/couchbase/go_n1ql v0.0.0-20220303011133-0ed4bf93e31d/go.mod h1:Rn19fO9CVfhJkqyIED9ixL5Kh5XuH7hXgDTxyfGY7hM= -github.com/couchbase/gomemcached v0.2.1 h1:lDONROGbklo8pOt4Sr4eV436PVEaKDr3o9gUlhv9I2U= -github.com/couchbase/gomemcached v0.2.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= +github.com/couchbase/gomemcached v0.3.1 h1:jfspNuQIXgWy+5GUPQrsQ6yC5uJCfMmd/JKvK6C26r8= +github.com/couchbase/gomemcached v0.3.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= github.com/couchbase/goutils v0.1.2 h1:gWr8B6XNWPIhfalHNog3qQKfGiYyh4K4VhO3P2o9BCs= github.com/couchbase/goutils v0.1.2/go.mod h1:h89Ek/tiOxxqjz30nPPlwZdQbdB8BwgnuBxeoUe/ViE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= -github.com/databendcloud/databend-go v0.4.6 h1:WeSXOwtwkYGVtPvDQwwTra9EZi55xICRKf0I2bDW6ss= -github.com/databendcloud/databend-go v0.4.6/go.mod h1:gc59O5283qi8NyzAJ1le0SEZb5p/SL7nwvrB9p6lxDw= -github.com/databricks/databricks-sql-go v1.5.2 h1:y7dpPiaZTr2+rDbo72jXjyQjU0uB9rJfXolyKzg96b4= -github.com/databricks/databricks-sql-go v1.5.2/go.mod h1:8aNP4vhhfBJZhc4n7LcSAvtJsZ+Dc25Q6mGxM1/8WaY= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/databricks/databricks-sql-go v1.5.7 h1:UIbzDhKjmtCc0ia9jg0s7tITjXUnkA3+Nl1ukxXfunk= +github.com/databricks/databricks-sql-go v1.5.7/go.mod h1:8aNP4vhhfBJZhc4n7LcSAvtJsZ+Dc25Q6mGxM1/8WaY= +github.com/datafuselabs/databend-go v0.6.8 h1:BiQTCBR1VXREo2MBKzfWRed868DTW/cPxYJ/RkUrK5M= +github.com/datafuselabs/databend-go v0.6.8/go.mod h1:h/sGUBZs7EqJgqnZ3XB0KHfyUlpGvfNrw2lWcdDJVIw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= -github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dlclark/regexp2 v1.11.2 h1:/u628IuisSTwri5/UKloiIsH8+qF2Pu7xEQX+yIKg68= +github.com/dlclark/regexp2 v1.11.2/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= -github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M= -github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/cli v26.0.1+incompatible h1:eZDuplk2jYqgUkNLDYwTBxqmY9cM3yHnmN6OIUEjL3U= +github.com/docker/cli v26.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v26.1.1+incompatible h1:oI+4kkAgIwwb54b9OC7Xc3hSgu1RlJA/Lln/DF72djQ= +github.com/docker/docker v26.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5 h1:ZRqTaoW9WZ2DqeOQGhK9q73eCb47SEs30GV2IRHT9bo= +github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5/go.mod h1:o31y53rb/qiIAONF7w3FHJZRqqP3fzHUr1HqanthByw= +github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf h1:2JoVYP9iko8uuIW33BQafzaylDixXbdXCRw/vCoxL+s= +github.com/dop251/goja_nodejs v0.0.0-20240418154818-2aae10d4cbcf/go.mod h1:bhGPmCgCCTSRfiMYWjpS46IDo9EUZXlsuUaPXSWGbv0= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= -github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= -github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= +github.com/elastic/go-sysinfo v1.14.0 h1:dQRtiqLycoOOla7IflZg3aN213vqJmP0lpVpKQ9lUEY= +github.com/elastic/go-sysinfo v1.14.0/go.mod h1:FKUXnZWhnYI0ueO7jhsGV3uQJ5hiz8OqM5b3oGyaRr8= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= +github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI= +github.com/elastic/go-windows v1.0.2/go.mod h1:bGcDpBzXgYSqM0Gx3DM4+UxFj300SZLixie9u9ixLM8= 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= @@ -496,93 +940,112 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m 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.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +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.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/exasol/error-reporting-go v0.2.0 h1:nKIe4zYiTHbYrKJRlSNJcmGjTJCZredDh5akVHfIbRs= github.com/exasol/error-reporting-go v0.2.0/go.mod h1:lUzRJqKLiSuYpqRUN2LVyj08WeHzhMEC/8Gmgtuqh1Y= -github.com/exasol/exasol-driver-go v1.0.4 h1:HCkfWztr/Ml43e0OpEgkQ+h1qOa3PoY41gg0Y9infrg= -github.com/exasol/exasol-driver-go v1.0.4/go.mod h1:TfWZbDQ6cOheE5g8SHfH/sXmnJbbVF/TqbjuXF/Ymos= -github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.4 h1:HlA5nlIu8fZveE9NwsoKH2/5aMMao9GoCnb8X+oCPC4= -github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.4/go.mod h1:cP/zgvSSXK6h15k+GoL6PfaFWGvQN/FU5wRvZnQGbwQ= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8= -github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fyne-io/mobile v0.1.2-0.20201127155338-06aeb98410cc/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY= -github.com/fyne-io/mobile v0.1.2/go.mod h1:/kOrWrZB6sasLbEy2JIvr4arEzQTXBTZGb3Y96yWbHY= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/genjidb/genji v0.15.2 h1:5cPRZPvBkLrG+auuCdkiWSg848mz4gVNCZ9gD/ig7lo= -github.com/genjidb/genji v0.15.2/go.mod h1:cyZtbarUfeyJcywXhuP9kf3HfUqEwl8lv1MsUQl+nWo= -github.com/getsentry/sentry-go v0.22.0 h1:XNX9zKbv7baSEI65l+H1GEJgSeIC1c7EN5kluWaP6dM= -github.com/getsentry/sentry-go v0.22.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/exasol/exasol-driver-go v1.0.9 h1:+2YdE4U8TVf3ipH0TRRGQnihKmm9pIoxwdsSpihdkWU= +github.com/exasol/exasol-driver-go v1.0.9/go.mod h1:+9xRz3cv55TWG364piTJEliivmE0M2JaefXx0o+rRW4= +github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.9 h1:vkOiwqum2hOK1WHgBop3TZrRGiygDRTvet8lzxP7Gl4= +github.com/exasol/exasol-test-setup-abstraction-server/go-client v0.3.9/go.mod h1:g0gO9UJh2LOYlwJIzrw7c1QZJqEBSvYnAaOycu7M5/c= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +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/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= +github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.7.0 h1:UnD/xusnfUgtEYkgRZohqL2AfmPTwv13NAJwwFFaNYc= -github.com/go-faster/errors v0.7.0/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= +github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= +github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= +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/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-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-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo= -github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-gorp/gorp v2.2.0+incompatible h1:xAUh4QgEeqPPhK3vxZN+bzrim1z5Av6q837gtjUlshc= +github.com/go-gorp/gorp v2.2.0+incompatible/go.mod h1:7IfkAQnO7jfT/9IQ3R9wL1dFhukN6aQxzKTHnkxzA/E= +github.com/go-jose/go-jose/v4 v4.0.3 h1:o8aphO8Hv6RPmH+GfzVuyf7YXSBibp+8YyHdOoDESGo= +github.com/go-jose/go-jose/v4 v4.0.3/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +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.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= -github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +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-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= +github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gocql/gocql v0.0.0-20200815110948-5378c8f664e9/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.40.4 h1:X1e7hUd02GDaLWKZj40Z7L0CP0W9TrGgmPQZw6+anBg= -github.com/godror/godror v0.40.4/go.mod h1:i8YtVTHUJKfFT3wTat4A9UoqScUtZXiYB9Rf3SVARgc= -github.com/godror/knownpb v0.1.1 h1:A4J7jdx7jWBhJm18NntafzSC//iZDHkDi1+juwQ5pTI= -github.com/godror/knownpb v0.1.1/go.mod h1:4nRFbQo1dDuwKnblRXDxrfCFYeT4hjg3GjMqef58eRE= +github.com/godror/godror v0.44.2 h1:uacQ3BFwbqPisMNBcltqysXSbg6ZUGWkz15lcUBOahE= +github.com/godror/godror v0.44.2/go.mod h1:nlshc6+MRQqNP5tp9l5du20PXR62qo4SRO1cBYyedTM= +github.com/godror/knownpb v0.1.2 h1:icMyYsYVpGmzhoVA01xyd0o4EaubR31JPK1UxQWe4kM= +github.com/godror/knownpb v0.1.2/go.mod h1:zs9hH+lwj7mnPHPnKCcxdOGz38Axa9uT+97Ng+Nnu5s= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c h1:yE35fKFwcelIte3q5q1/cPiY7pI7vvf5/j/0ddxNCKs= github.com/gohxs/readline v0.0.0-20171011095936-a780388e6e7c/go.mod h1:9S/fKAutQ6wVHqm1jnp9D9sc5hu689s9AaTWFS92LaU= -github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= 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-jwt/jwt/v5 v5.1.0 h1:UGKbA/IPjtS6zLcdB7i5TyACMgSbOTiR8qzXgw8HWQU= -github.com/golang-jwt/jwt/v5 v5.1.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-module/carbon/v2 v2.3.12 h1:VC1DwN1kBwJkh5MjXmTFryjs5g4CWyoM8HAHffZPX/k= +github.com/golang-module/carbon/v2 v2.3.12/go.mod h1:HNsedGzXGuNciZImYP2OMnpiwq/vhIstR/vn45ib5cI= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +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.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +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/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 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= @@ -615,8 +1078,9 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -625,6 +1089,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW 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 v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215 h1:HA3/6NDG1q6qLD2sCqDFT/ua/1/wctoLo7leuFcFdSE= github.com/google/flatbuffers/go v0.0.0-20230110200425-62e4d2e5b215/go.mod h1:qmRCJW6OqZkfBt584Cmq1im0f4367CLrdABrq5lMOWo= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -646,15 +1112,17 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f h1:7MmqygqdeJtziBUpm4Z9ThROFZUaVGaePMfcDnluf1E= github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f/go.mod h1:n1ej5+FqyEytMt/mugVDZLIiqTMO+vsrgY+kM6ohzN0= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 h1:CVuJwN34x4xM2aT4sIKhmeib40NeBPhRihNjQmpJsA4= +github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= 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 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 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= @@ -664,26 +1132,29 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf 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-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/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8 h1:ssNFCCVmib/GQSzx3uCWyfMgOamLGWuGqlMS77Y1m3Y= +github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.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/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -695,29 +1166,37 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 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.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/go-sql-spanner v1.1.1 h1:Z5kRckvrSNokM/x21BBy23kg9b0e9ikkderuuLVXfGY= -github.com/googleapis/go-sql-spanner v1.1.1/go.mod h1:e12AKZmltQH/2XGqR/2SAPWPKshc5+WF4W7OGD9YcAw= +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.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/go-sql-spanner v1.6.0 h1:AtTZkUNCQamrhj/RPpG/A3qTErtiT+eBjZydWy6tV90= +github.com/googleapis/go-sql-spanner v1.6.0/go.mod h1:8oVX0dqU+K4tPNlqOiL3EjUNyJ91IwTNkm+G4r99Wcc= 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/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= 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/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= -github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -726,58 +1205,27 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/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/icholy/digest v0.1.22 h1:dRIwCjtAcXch57ei+F0HSb5hmprL873+q7PoVojdMzM= -github.com/icholy/digest v0.1.22/go.mod h1:uLAeDdWKIWNFMH0wqbwchbTQOmJWhzSnL7zmqSPqEEc= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.14.1 h1:smbxIaZA08n6YuxEX1sDyjV/qkbtUtkH20qLkR9MUR4= -github.com/jackc/pgconn v1.14.1/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/icholy/digest v0.1.23 h1:4hX2pIloP0aDx7RJW0JewhPPy3R8kU+vWKdxPsCCGtY= +github.com/icholy/digest v0.1.23/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= -github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -790,14 +1238,16 @@ github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh6 github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173 h1:jOONCXyzHWM+ukp+weX77o//U3pMeOj62CNxChJLxIU= -github.com/jeandeaual/go-locale v0.0.0-20220711133428-7de61946b173/go.mod h1:uO/uctjf8AcWhNfp5Ili6oPtyFrAoQXEtVY3N798VkQ= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 h1:Po+wkNdMmN+Zj1tDsJQy7mJlPlwGNQd9JZoPjObagf8= +github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49/go.mod h1:YiutDnxPRLk5DLUFj6Rw4pRBBURZY07GFr54NdV9mQg= github.com/jedib0t/go-pretty/v6 v6.2.7/go.mod h1:FMkOpgGD3EZ91cW8g/96RfxoV7bdeJyzXPYgz1L1ln0= -github.com/jedib0t/go-pretty/v6 v6.4.9 h1:vZ6bjGg2eBSrJn365qlxGcaWu09Id+LHtrfDWlB2Usc= -github.com/jedib0t/go-pretty/v6 v6.4.9/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= +github.com/jedib0t/go-pretty/v6 v6.5.9 h1:ACteMBRrrmm1gMsXe9PSTOClQ63IXDUt03H5U+UV8OU= +github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 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= @@ -805,79 +1255,78 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmrobles/h2go v0.5.0 h1:r+V3J1+8z5tExKHcVc8u0tXJfov391zEffJYALWKhA0= github.com/jmrobles/h2go v0.5.0/go.mod h1:p7Vjfu/9f7g2RI1CkpwXnwqskV+47HviBg4C4FlW8eI= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= -github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= 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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +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/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -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/kenshaw/rasterm v0.1.10 h1:cMCTpBHfqmftt/VqeT6B+9Td+mYi+ZtziN+XBdrTQfA= +github.com/kenshaw/rasterm v0.1.10/go.mod h1:kL4DCN+wOlQ4BPBCxA+itiVwiObRAj0Hkze7SbCyYaw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng= -github.com/marcboeker/go-duckdb v1.5.4 h1:Cv6gzgrzPnmqJKJiTT2CJM3eUqIT5in9DNyxAn+okgA= -github.com/marcboeker/go-duckdb v1.5.4/go.mod h1:wm91jO2GNKa6iO9NTcjXIRsW+/ykPoJbQcHSXhdAl28= +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/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/marcboeker/go-duckdb v1.7.0 h1:c9DrS13ta+gqVgg9DiEW8I+PZBE85nBMLL/YMooYoUY= +github.com/marcboeker/go-duckdb v1.7.0/go.mod h1:WtWeqqhZoTke/Nbd7V9lnBx7I2/A/q0SAq/urGzPCMs= github.com/mattn/go-adodb v0.0.1 h1:g/pk3V8m/WFX2IQRI58wAC24OQUFFXEiNsvs7dQ1WKg= github.com/mattn/go-adodb v0.0.1/go.mod h1:jaSTRde4bohMuQgYQPxW3xRTPtX/cZKyxPrFVseJULo= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= -github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= -github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sixel v0.0.5 h1:55w2FR5ncuhKhXrM5ly1eiqMQfZsnAHIpYNGZX03Cv8= +github.com/mattn/go-sixel v0.0.5/go.mod h1:h2Sss+DiUEHy0pUqcIB6PFXo5Cy8sTQEFr3a9/5ZLNw= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/sio v0.3.1 h1:d59r5RTHb1OsQaSl1EaTWurzMMDRLA5fgNmjzD4eVu4= -github.com/minio/sio v0.3.1/go.mod h1:S0ovgVgc+sTlQyhiXA1ppBLv7REM7TYi5yyq2qL/Y6o= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -892,120 +1341,149 @@ github.com/mithrandie/go-text v1.6.0 h1:8gOXTMPbMY8DJbKMTv8kHhADcJlDWXqS/YQH4SyW github.com/mithrandie/go-text v1.6.0/go.mod h1:xCgj1xiNbI/d4xA9sLVvXkjh5B2tNx2ZT2/3rpmh8to= github.com/mithrandie/ternary v1.1.1 h1:k/joD6UGVYxHixYmSR8EGgDFNONBMqyD373xT4QRdC4= github.com/mithrandie/ternary v1.1.1/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= -github.com/nakagami/firebirdsql v0.9.6 h1:WF1JyCoKGtQCrkwyRfZVwe526dB9HO6Y6bcm/vZYUDI= -github.com/nakagami/firebirdsql v0.9.6/go.mod h1:q1YKPKX8lOiGP0slQJgbpde8x4JgVpgEOtQDaQ+lRTo= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nakagami/firebirdsql v0.9.10 h1:7Y73BiH3j/f8faIaryZvDZ3nEo0L7c6S5pg+qWoZ91c= +github.com/nakagami/firebirdsql v0.9.10/go.mod h1:ei91eXUYcMkWJOr4rK6Sta+BVmi3K+WvYR4yASlq/kY= github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d h1:NqRhLdNVlozULwM1B3VaHhcXYSgrOAv8V5BE65om+1Q= github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d/go.mod h1:cxIIfNMTwff8f/ZvRouvWYF6wOoO7nj99neWSx2q/Es= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/nicksnyder/go-i18n/v2 v2.1.1/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc= github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= -github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= -github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= -github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= -github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= +github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +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/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= 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/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e h1:7QFNKeWEIpUyue+VSSpiPjh2zXLd632oLnYcOkyPv0E= -github.com/prestodb/presto-go-client v0.0.0-20230524183650-a1a0bac0f63e/go.mod h1:9mH1KvIoMeUe/OIs6WCJGvrR15FvC0y+SSMkIQQkF3M= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783 h1:1/uuAh1vatqywFmudA7PHVUc/Iu5W4iFft1r7MVubf8= +github.com/prestodb/presto-go-client v0.0.0-20240426182841-905ac40a1783/go.mod h1:9mH1KvIoMeUe/OIs6WCJGvrR15FvC0y+SSMkIQQkF3M= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/proullon/ramsql v0.1.4 h1:yTFRTn46gFH/kPbzCx+mGjuFlyTBUeDr3h2ldwxddl0= +github.com/proullon/ramsql v0.1.4/go.mod h1:CFGqeQHQpdRfWqYmWD3yXqPTEaHkF4zgXy1C6qDWc9E= +github.com/rekby/fixenv v0.6.1 h1:jUFiSPpajT4WY2cYuc++7Y1zWrnCxnovGCIX72PZniM= +github.com/rekby/fixenv v0.6.1/go.mod h1:/b5LRc06BYJtslRtHKxsPWFT/ySpHV+rWvzTg+XWk4c= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 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/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= -github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.1.0/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/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sijms/go-ora/v2 v2.7.24 h1:0env7GgMxPHw0K92umvmLQZXRPenUBnIiyNNKJUGyWA= -github.com/sijms/go-ora/v2 v2.7.24/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sijms/go-ora/v2 v2.8.19 h1:7LoKZatDYGi18mkpQTR/gQvG9yOdtc7hPAex96Bqisc= +github.com/sijms/go-ora/v2 v2.8.19/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8 h1:7BgZHyMXUUPcvC7rm+gsOoC23xFI6SgaPGpBA1tMX34= -github.com/snowflakedb/gosnowflake v1.7.1-0.20231129120718-15fac293e1b8/go.mod h1:JI3eRZL8CpimPek6CJO0aTbDQjDGOt7Rxv9A/ti4f5c= +github.com/snowflakedb/gosnowflake v1.10.1 h1:VGeQxsQj5s3hP0cRmtNYozhUvs2Y7Reu5Pk5pKuRGpI= +github.com/snowflakedb/gosnowflake v1.10.1/go.mod h1:hvc58mU03qg78mSz5z17/qnzI56hOdYYK2txWbM0hN0= +github.com/soniakeys/quant v1.0.0 h1:N1um9ktjbkZVcywBVAAYpZYSHxEfJGzshHCxx/DaI0Y= +github.com/soniakeys/quant v1.0.0/go.mod h1:HI1k023QuVbD4H8i9YdfZP2munIHU4QpjsImz6Y6zds= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4= -github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU= +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/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 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.2.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/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1013,32 +1491,30 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 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.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= github.com/thda/tds v0.1.7 h1:s29kbnJK0agL3ps85A/sb9XS2uxgKF5UJ6AZjbyqXX4= github.com/thda/tds v0.1.7/go.mod h1:isLIF1oZdXfkqVMJM8RyNrsjlHPlTKnPlnsBs7ngZcM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/trinodb/trino-go-client v0.313.0 h1:lp8N9JKTqMuZ9LlAwLjgUtkwDnJc8fjpJmunpZ3afjk= -github.com/trinodb/trino-go-client v0.313.0/go.mod h1:YpZf2WAClFhU+n0ZhdkmMbugYaMRM/mjywiQru0wpeQ= +github.com/trinodb/trino-go-client v0.315.0 h1:9mU+42VGw9Hnp9R1hkhWlIrQp9o+V01Gx1KlHjTkM1c= +github.com/trinodb/trino-go-client v0.315.0/go.mod h1:ND1s5JuAHWUXnllV3dvt/pYKhlrc0G51l6LvVFD2bJ4= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber-go/tally v3.3.17+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= -github.com/uber-go/tally v3.5.8+incompatible h1:Z2vK6ib6G/r6bAGu7lAI/98cLPLUOtdHrY2bBikk4wg= -github.com/uber-go/tally v3.5.8+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= -github.com/uber/athenadriver v1.1.14 h1:dC+wiJWBUUD12rSHnoqdq3Y+KOoOoVePN+Asr/qi/+M= -github.com/uber/athenadriver v1.1.14/go.mod h1:RnKD7+9Aup8iuFfhK+I26U+z137IXWeoLaEZDepd0Eg= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uber-go/tally v3.5.10+incompatible h1:PDkAMvnVYOdJtvyCZQURmHtOakCiWAWFVKejrrvOMBo= +github.com/uber-go/tally v3.5.10+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= +github.com/uber/athenadriver v1.1.15 h1:z/hivAcXmGgUCVoXgVvwwIzc4auTeF3TCmwyFTtd8NE= +github.com/uber/athenadriver v1.1.15/go.mod h1:RnKD7+9Aup8iuFfhK+I26U+z137IXWeoLaEZDepd0Eg= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= @@ -1049,21 +1525,25 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -github.com/xo/dburl v0.19.1 h1:z/K2i8zVf6aRwQ8Szz7MGEUw0VC2472D9SlBqdHDQCU= -github.com/xo/dburl v0.19.1/go.mod h1:B7/G9FGungw6ighV8xJNwWYQPMfn3gsi2sn5SE8Bzco= +github.com/xo/dburl v0.23.2 h1:Fl88cvayrgE56JA/sqhNMLljCW/b7RmG1mMkKMZUFgA= +github.com/xo/dburl v0.23.2/go.mod h1:uazlaAQxj4gkshhfuuYyvwCBouOmNnG2aDxTCFZpmL4= +github.com/xo/echartsgoja v0.1.1 h1:9ZH7rhjovE/caGzWTFw1X5GItCsPw5eFV2Qwfgmjt7M= +github.com/xo/echartsgoja v0.1.1/go.mod h1:u2iiKyIA1H3URjh9+8Nltj8cP33R19JHasXhSz/tWHI= +github.com/xo/resvg v0.6.0 h1:GsovErv9JuOnGttOA8RhQcBI7DEEVpEiIEKBuJVRS4g= +github.com/xo/resvg v0.6.0/go.mod h1:xsIgOmL6UD2xRHIm2Laepjm/b4auoPMxAAqOHkvbSes= github.com/xo/tblfmt v0.0.0-20190609041254-28c54ec42ce8/go.mod h1:3U5kKQdIhwACye7ml3acccHmjGExY9WmUGU7rnDWgv0= -github.com/xo/tblfmt v0.10.3 h1:Fb2Le5wvzBjOwA/KFRpP5bZo+iR9cZnzSAN3tULoUPI= -github.com/xo/tblfmt v0.10.3/go.mod h1:W6oqhxtqDOEMkrS2GPO0zmcww7ozM2E6BRv3kNfXd24= +github.com/xo/tblfmt v0.13.2 h1:GzHsRYduJxKqwNekczv2ZJwpznsSU89Dr2L+qVyW63Y= +github.com/xo/tblfmt v0.13.2/go.mod h1:BLPC+dRy68cgSK/mPgQRfFQ/xLg231Fyic178ybjB34= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xo/vegagoja v0.1.0 h1:jnIeXVM6HTzWyt2HHmJMkhgK1zjZMIdhdI+MBFjkF54= +github.com/xo/vegagoja v0.1.0/go.mod h1:2DGNf2X4fnAw2h5zSVIdF1inbmEpoE+rSbzzYBYjTAY= github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ= github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= -github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE= -github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= -github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA= -github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7 h1:nL8XwD6fSst7xFUirkaWJmE7kM0CdWRYgu6+YQer1d4= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240528144234-5d5a685e41f7/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2 h1:thrbvktqKA6LFZTnZrGuQi8LQVel1J2dDfoQFsgvcYs= +github.com/ydb-platform/ydb-go-sdk/v3 v3.75.2/go.mod h1:QMmT1fMKZnpid73USXLJawh+32bKySSE2WtEnBUIKd8= github.com/yookoala/realpath v1.0.0 h1:7OA9pj4FZd+oZDsyvXWQvjn5oBdcHRTV44PpdMSuImQ= github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= @@ -1078,7 +1558,6 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4= @@ -1094,17 +1573,27 @@ 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 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= -go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +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.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -1117,55 +1606,71 @@ go.uber.org/fx v1.12.0/go.mod h1:egT3Kyg1JFYQkvKLZ3EsykxkNrZxgXS+gKoKo7abERY= go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 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-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +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-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-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= -golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +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= @@ -1189,9 +1694,18 @@ 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.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -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/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.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1204,7 +1718,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR 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-20190813141303-74dc4d7220e7/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= @@ -1229,6 +1742,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v 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-20210503060351-7fd8e65b6420/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= @@ -1243,12 +1757,21 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug 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.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +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.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.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +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.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= 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= @@ -1274,9 +1797,12 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri 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.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +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.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1290,31 +1816,27 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ 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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.1.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.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190403152447-81d4e9dc473e/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-20190606203320-7fc4e5ec1444/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-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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-20191115151921-52ab43148777/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-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1330,7 +1852,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200720211630-cb9d2d5c5666/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= @@ -1338,29 +1859,27 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-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-20210616045830-e2b7044e8c71/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-20210906170528-6f6e22806c34/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-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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= @@ -1379,23 +1898,40 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc 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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.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/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.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/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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-20220526004731-065cf7ba2467/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.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +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.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= 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= @@ -1406,35 +1942,44 @@ 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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +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.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= 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/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +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-20190425163242-31fd60d6bfdc/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-20190624222133-a101b041ded4/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-20190802003818-e9bb7d36c060/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/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-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1459,7 +2004,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK 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-20200328031815-3db5fc6bac03/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 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= @@ -1471,22 +2015,29 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc 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-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-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/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.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= 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= @@ -1495,10 +2046,18 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T 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= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +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/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= +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= @@ -1547,8 +2106,17 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ 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.152.0 h1:t0r1vPnfMc260S2Ci+en7kfCZaLOPs5KI0sVV/6jZrY= -google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +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.189.0 h1:equMo30LypAkdkLMBqfeIqtyAnlyig1JSZArl4XPwdI= +google.golang.org/api v0.189.0/go.mod h1:FLWGJKb0hb+pU2j+rJqwbnsF+ym+fQs73rbJ+KAUgy8= 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= @@ -1556,8 +2124,6 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww 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/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= 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= @@ -1593,7 +2159,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D 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= @@ -1626,6 +2194,7 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 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= @@ -1656,13 +2225,43 @@ google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar 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-20231127180814-3a041ad873d4 h1:W12Pwm4urIbRdGhMEg2NM9O3TWKjNcxQhs46V0ypf/k= -google.golang.org/genproto v0.0.0-20231127180814-3a041ad873d4/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= -google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4 h1:ZcOkrmX74HbKFYnpPY8Qsw93fC29TbJXspYKaBkSXDQ= -google.golang.org/genproto/googleapis/api v0.0.0-20231127180814-3a041ad873d4/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +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-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f h1:htT2I9bZvGm+110zq8bIErMX+WgBWxCzV3ChwbvnKnc= +google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Sk3mLpoDFTAp6R4OvlcUgaG4ISTspKeFsIAXMn9Bm4Y= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk= +google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f h1:RARaIm8pxYuxyNPbBQf5igT7XdOyCNtat1qAT2ZxjU4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= 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= @@ -1689,6 +2288,7 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD 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= @@ -1698,8 +2298,13 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu 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.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.3/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.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= 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= @@ -1716,8 +2321,10 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ 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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/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.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1726,9 +2333,10 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8 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/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= @@ -1746,23 +2354,23 @@ 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.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.0/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= gorm.io/driver/bigquery v1.2.0 h1:E94oEXErYb4uImcR8oiCjE1SP2VdnrL5f3d78PtFWNk= gorm.io/driver/bigquery v1.2.0/go.mod h1:/5kcyb6RVIk/seff6YANAjB5aisE4oqY35x0Ix9iwXY= +gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= +gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gotest.tools/gotestsum v1.8.2 h1:szU3TaSz8wMx/uG+w/A2+4JUPwH903YYaMI9yOOYAyI= -gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gotest.tools/gotestsum v1.12.0 h1:CmwtaGDkHxrZm4Ib0Vob89MTfpc3GrEFMJKovliPwGk= +gotest.tools/gotestsum v1.12.0/go.mod h1:fAvqkSptospfSbQw26CTYzNwnsE/ztqLeyhP0h67ARY= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= 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= @@ -1770,42 +2378,67 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= +howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/b v1.1.0 h1:sFmr2MlofAtx5R0NC0btblNww5dqIHxXyT0SEiaTSIk= modernc.org/b v1.1.0/go.mod h1:yF+wmBAFjebNdVqZNTeNfmnLaLqq91wozvDLcuXz+ck= -modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= -modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= -modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= -modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +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/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +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.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v4 v4.20.4 h1:3pPOlMcblnu5CBU3w1BFtepwBnLezGjPYTH8xBeYZM8= +modernc.org/ccgo/v4 v4.20.4/go.mod h1:meYiLeaGpKQmHBw8roW4DXLkDvusG+MD7LJ/kYyAouU= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/db v1.0.10 h1:Vy2Db368/WfWxQWzS8MECgEOZ5c0gtUHfVny4JleMsk= modernc.org/db v1.0.10/go.mod h1:P4R9V+DHFTxL0JYYdGhXkVCxEFS2mA4d7cWzl6Zy7Cs= modernc.org/file v1.0.8 h1:xt7OV1pn+KNBb46KzV497Igx94wlH+bt4Hb+VR1mto0= modernc.org/file v1.0.8/go.mod h1:v0ae8/gLTK8QR+eyuV504kYZ/nsoe5JRDcHZFZecfxM= modernc.org/fileutil v1.1.2/go.mod h1:HdjlliqRHrMAI4nVOvvpYVzVgvRSK7WnoCiG0GUWJNo= -modernc.org/fileutil v1.2.0 h1:c7fsfzHf9WfUFXvv/RY9sStAr+VAKXYGKiAhBQQNoT4= -modernc.org/fileutil v1.2.0/go.mod h1:0rLMFc17WSz6Bm/GtHeme7TOX8pNRhFN2NkfBlOZhrQ= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.3 h1:Ik4ZcMbC7aY4ZDPUhzXVXi7GMub9QcXLTfXn3mWpNw8= +modernc.org/gc/v2 v2.4.3/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e h1:WPC4v0rNIFb2PY+nBBEEKyugPPRHPzUgyN3xZPpGK58= +modernc.org/gc/v3 v3.0.0-20240722195230-4a140ff9c08e/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/golex v1.1.0 h1:dmSaksHMd+y6NkBsRsCShNPRaSNCNH+abrVm5/gZic8= modernc.org/golex v1.1.0/go.mod h1:2pVlfqApurXhR1m0N+WDYu6Twnc4QuvO4+U8HnwoiRA= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/internal v1.0.8/go.mod h1:km71QBJPWkc1+LUldg2U9TJsKT6Q2QKHIykdEeCy/jw= modernc.org/internal v1.1.0 h1:hYRxTXjPPzzqxXaFyC9UALxi0+v1jgwZAktvZwwgnTE= modernc.org/internal v1.1.0/go.mod h1:IFhfxUE81NbN8Riy+oHylA3PIYgAvIQ5eMufNzg7/QU= -modernc.org/libc v1.34.11 h1:hQDcIUlSG4QAOkXCIQKkaAOV5ptXvkOx4ddbXzgW2JU= -modernc.org/libc v1.34.11/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +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/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.55.4 h1:iWzZ96v1Iut2Sm4lEp0yzFde20M9zpcI0wY3DFcb+8g= +modernc.org/libc v1.55.4/go.mod h1:GPuVtbWvXUo590z/xfVIQcOqnugb1WovSfMJWMe0ZfA= modernc.org/lldb v1.0.8 h1:gM0Lpmgtw0h/ylWQSxABvzJ++TZKhf1Q/uPAGBAM6aU= modernc.org/lldb v1.0.8/go.mod h1:ybOcsZ/RNZo3q8fiGadQFRnD+1Jc+RWGcTPdeilCnUk= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +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/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +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/ql v1.4.7 h1:dnGGGL5tHmPwVhMAylnLlwrnIrtk8PPb5KRfMvfgJzE= @@ -1813,20 +2446,23 @@ modernc.org/ql v1.4.7/go.mod h1:I900l6z8ckpPy1y9VR0gu4pZ9hl9AhmQla4F8KERzdc= modernc.org/sortutil v1.1.1/go.mod h1:DTj/8BqjEBLZFVPYvEGDfFFg94SsfPxQ70R+SQJ98qA= modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= -modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= -modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs= +modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= modernc.org/zappy v1.0.9/go.mod h1:y2c4Hv5jzyBP179SxNmx5H/BM6cVgNIXPQv2bCeR6IM= modernc.org/zappy v1.1.0 h1:cAf9HrymATNo2hYMc9c37y0tiZJYuKM2xa1ZAP8THUw= modernc.org/zappy v1.1.0/go.mod h1:cxC0dWAgZuyMsJ+KL3ZBgo3twyKGBB/0By/umSZE2bQ= 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= sqlflow.org/gohive v0.0.0-20231130013447-c9657f0f21f9 h1:MJVi9OnD/tKNXdRlw3gNEDPNV72I4xwkaBBQdeHNayo= diff --git a/handler/errors.go b/handler/errors.go deleted file mode 100644 index 6b77444da6f..00000000000 --- a/handler/errors.go +++ /dev/null @@ -1,25 +0,0 @@ -package handler - -// Error wraps handler errors -type Error struct { - Buf string - Err error -} - -// WrapErr wraps an error using the specified driver when err is not nil. -func WrapErr(buf string, err error) error { - if err == nil { - return nil - } - // avoid double wrapping error - if _, ok := err.(*Error); ok { - return err - } - return &Error{buf, err} -} - -// Error satisfies the error interface, returning the original error message -func (e *Error) Error() string { return e.Err.Error() } - -// Unwrap returns the original error -func (e *Error) Unwrap() error { return e.Err } diff --git a/handler/handler.go b/handler/handler.go index 4929d7c5b7c..ba9a24a2fcc 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -28,14 +28,18 @@ import ( "github.com/alecthomas/chroma/v2" "github.com/alecthomas/chroma/v2/formatters" "github.com/alecthomas/chroma/v2/styles" + "github.com/go-git/go-billy/v5" "github.com/xo/dburl" "github.com/xo/dburl/passfile" + "github.com/xo/echartsgoja" + "github.com/xo/resvg" "github.com/xo/tblfmt" "github.com/xo/usql/drivers" "github.com/xo/usql/drivers/completer" "github.com/xo/usql/drivers/metadata" "github.com/xo/usql/env" "github.com/xo/usql/metacmd" + "github.com/xo/usql/metacmd/charts" "github.com/xo/usql/rline" "github.com/xo/usql/stmt" ustyles "github.com/xo/usql/styles" @@ -53,7 +57,11 @@ import ( type Handler struct { l rline.IO user *user.User - wd string + // wd is the working directoyr. + wd string + // charts is the charts filesystem. + charts billy.Filesystem + // nopw indicates not asking for password. nopw bool // timing of every command executed timing bool @@ -68,6 +76,8 @@ type Handler struct { // batch batch bool batchEnd string + // bind are bound values for exec statements + bind []interface{} // connection u *dburl.URL db *sql.DB @@ -77,7 +87,7 @@ type Handler struct { } // New creates a new input handler. -func New(l rline.IO, user *user.User, wd string, nopw bool) *Handler { +func New(l rline.IO, user *user.User, wd string, charts billy.Filesystem, nopw bool) *Handler { f, iactive := l.Next, l.Interactive() if iactive { f = func() ([]rune, error) { @@ -92,14 +102,16 @@ func New(l rline.IO, user *user.User, wd string, nopw bool) *Handler { } } h := &Handler{ - l: l, - user: user, - wd: wd, - nopw: nopw, - buf: stmt.New(f), + l: l, + user: user, + wd: wd, + charts: charts, + nopw: nopw, + buf: stmt.New(f), } if iactive { l.SetOutput(h.outputHighlighter) + l.Completer(completer.NewDefaultCompleter(completer.WithConnStrings(h.connStrings()))) } return h } @@ -225,9 +237,16 @@ var helpQuitExitRE = regexp.MustCompile(fmt.Sprintf(`(?im)^(%s|%s|%s)\s*$`, text func (h *Handler) Run() error { stdout, stderr, iactive := h.l.Stdout(), h.l.Stderr(), h.l.Interactive() // display welcome info - if iactive { - fmt.Fprintln(h.l.Stdout(), text.WelcomeDesc) - fmt.Fprintln(h.l.Stdout()) + if iactive && env.Get("QUIET") == "off" { + // logo + if typ := env.TermGraphics(); typ.Available() { + if err := typ.Encode(stdout, text.Logo); err != nil { + return err + } + } + // welcome text + fmt.Fprintln(stdout, text.WelcomeDesc) + fmt.Fprintln(stdout) } var lastErr error for { @@ -374,7 +393,7 @@ func (h *Handler) Run() error { out = h.out } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) - if err = h.Execute(ctx, out, opt, h.lastPrefix, h.last, forceBatch); err != nil { + if err = h.Execute(ctx, out, opt, h.lastPrefix, h.last, forceBatch, h.unbind()...); err != nil { lastErr = WrapErr(h.last, err) if env.All()["ON_ERROR_STOP"] == "on" { if iactive { @@ -396,7 +415,7 @@ func (h *Handler) Run() error { } // Execute executes a query against the connected database. -func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, forceTrans bool) error { +func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, forceTrans bool, bind ...interface{}) error { if h.db == nil { return text.ErrNotConnected } @@ -411,16 +430,18 @@ func (h *Handler) Execute(ctx context.Context, w io.Writer, opt metacmd.Option, return err } } - f := h.execSingle + f := h.doExecSingle switch opt.Exec { case metacmd.ExecExec: - f = h.execExec + f = h.doExecExec case metacmd.ExecSet: - f = h.execSet + f = h.doExecSet case metacmd.ExecWatch: - f = h.execWatch + f = h.doExecWatch + case metacmd.ExecChart: + f = h.doExecChart } - if err = drivers.WrapErr(h.u.Driver, f(ctx, w, opt, prefix, sqlstr, qtyp)); err != nil { + if err = drivers.WrapErr(h.u.Driver, f(ctx, w, opt, prefix, sqlstr, qtyp, bind)); err != nil { if forceTrans { defer h.tx.Rollback() h.tx = nil @@ -439,6 +460,18 @@ func (h *Handler) Reset(r []rune) { h.last, h.lastPrefix, h.lastRaw, h.batch, h.batchEnd = "", "", "", false, "" } +// Bind sets the bind parameters for the next query execution. +func (h *Handler) Bind(bind []interface{}) { + h.bind = bind +} + +// unbind returns the bind parameters. +func (h *Handler) unbind() []interface{} { + v := h.bind + h.bind = nil + return v +} + // Prompt parses a prompt. // // NOTE: the documentation below is INCORRECT, as it is just copied from @@ -711,19 +744,21 @@ func (h *Handler) Highlight(w io.Writer, buf string) error { // an appropriate driver (mysql, postgres, sqlite3) depending on the type (unix // domain socket, directory, or regular file, respectively). func (h *Handler) Open(ctx context.Context, params ...string) error { - // build a list of all possible connStrings for the completer - connStrings := h.connStrings() if len(params) == 0 || params[0] == "" { - h.l.Completer(completer.NewDefaultCompleter(completer.WithConnStrings(connStrings))) return nil } if h.tx != nil { return text.ErrPreviousTransactionExists } + if len(params) == 1 { + if v, ok := env.Cget(params[0]); ok { + params = v + } + } if len(params) < 2 { - urlstr := params[0] + dsn := params[0] // parse dsn - u, err := dburl.Parse(urlstr) + u, err := dburl.Parse(dsn) if err != nil { return err } @@ -738,7 +773,7 @@ func (h *Handler) Open(ctx context.Context, params ...string) error { } // open connection var err error - h.db, err = drivers.Open(ctx, h.u, h.GetOutput, h.IO().Stderr) + h.db, err = drivers.Open(ctx, h.u, h.GetOutput, h.l.Stderr) if err != nil && !drivers.IsPasswordErr(h.u, err) { defer h.Close() return err @@ -748,7 +783,6 @@ func (h *Handler) Open(ctx context.Context, params ...string) error { // force error/check connection if err == nil { if err = drivers.Ping(ctx, h.u, h.db); err == nil { - h.l.Completer(drivers.NewCompleter(ctx, h.u, h.db, readerOpts(), completer.WithConnStrings(connStrings))) return h.Version(ctx) } } @@ -804,6 +838,9 @@ func (h *Handler) connStrings() []string { } names = append(names, fmt.Sprintf("%s://%s%s%s%s", entry.Protocol, user, host, port, dbname)) } + for name := range env.Call() { + names = append(names, name) + } sort.Strings(names) return names } @@ -830,8 +867,13 @@ func (h *Handler) forceParams(u *dburl.URL) { // Password collects a password from input, and returns a modified DSN // including the collected password. func (h *Handler) Password(dsn string) (string, error) { - if dsn == "" { + switch v, ok := env.Cget(dsn); { + case dsn == "": return "", text.ErrMissingDSN + case ok && len(v) < 2: + return "", text.ErrNamedConnectionIsNotAURL + case ok: + dsn = v[0] } u, err := dburl.Parse(dsn) if err != nil { @@ -954,38 +996,39 @@ func (h *Handler) ChangePassword(user string) (string, error) { // Version prints the database version information after a successful connection. func (h *Handler) Version(ctx context.Context) error { - if env.Get("SHOW_HOST_INFORMATION") != "true" { + if env.Get("SHOW_HOST_INFORMATION") != "true" || !h.l.Interactive() { return nil } if h.db == nil { return text.ErrNotConnected } ver, err := drivers.Version(ctx, h.u, h.DB()) - if err != nil { + switch { + case err != nil: ver = fmt.Sprintf("", err) + case ver == "": + ver = "" } - if ver != "" { - h.Print(text.ConnInfo, h.u.Driver, ver) - } + h.Print(text.ConnInfo, h.u.Driver, ver) return nil } // Print formats according to a format specifier and writes to handler's standard output. -func (h *Handler) Print(format string, a ...interface{}) { +func (h *Handler) Print(s string, v ...interface{}) { if env.Get("QUIET") == "on" { return } - fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(format, a...)) + fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...)) } -// execWatch repeatedly executes a query against the database. -func (h *Handler) execWatch(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool) error { +// doExecWatch repeatedly executes a query against the database. +func (h *Handler) doExecWatch(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error { for { - // this is the actual output that psql has: "Mon Jan 2006 3:04:05 PM MST" + // the actual output that psql has: "Mon Jan 2006 3:04:05 PM MST" -- which is _slightly_ different than RFC1123 // fmt.Fprintf(w, "%s (every %fs)\n\n", time.Now().Format("Mon Jan 2006 3:04:05 PM MST"), float64(opt.Watch)/float64(time.Second)) fmt.Fprintf(w, "%s (every %v)\n", time.Now().Format(time.RFC1123), opt.Watch) fmt.Fprintln(w) - if err := h.execSingle(ctx, w, opt, prefix, sqlstr, qtyp); err != nil { + if err := h.doExecSingle(ctx, w, opt, prefix, sqlstr, qtyp, bind); err != nil { return err } select { @@ -999,21 +1042,111 @@ func (h *Handler) execWatch(ctx context.Context, w io.Writer, opt metacmd.Option } } -// execSingle executes a single query against the database based on its query type. -func (h *Handler) execSingle(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool) error { +// doExecChart executes a single query against the database, displaying its output as a chart. +func (h *Handler) doExecChart(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error { + stdout, _, _ := h.l.Stdout(), h.l.Stderr(), h.l.Interactive() + typ := env.TermGraphics() + if !typ.Available() { + return text.ErrGraphicsNotSupported + } + if _, ok := opt.Params["help"]; ok { + fmt.Fprintln(stdout, text.ChartUsage) + return nil + } + cfg, err := charts.ParseArgs(opt.Params) + if err != nil { + return err + } + start := time.Now() + // query + rows, err := h.DB().QueryContext(ctx, sqlstr, bind...) + if err != nil { + return err + } + // get cols + cols, err := drivers.Columns(h.u, rows) + if err != nil { + return err + } + // process row(s) + transposed := make([][]string, len(cols)) + clen, tfmt := len(cols), env.GoTime() + for rows.Next() { + row, err := h.scan(rows, clen, tfmt) + if err != nil { + return err + } + for i := range row { + transposed[i] = append(transposed[i], row[i]) + } + } + // display + c, err := charts.MakeChart(cfg, cols, transposed) + if err != nil { + return err + } + data, err := c.ToEcharts() + if err != nil { + return err + } + echarts := echartsgoja.New(echartsgoja.WithWidthHeight(cfg.W, cfg.H)) + res, err := echarts.RenderOptions(ctx, data) + if err != nil { + return err + } + if cfg.File != "" { + fmt.Println("writing to", cfg.File) + return os.WriteFile(cfg.File, []byte(res), 0o644) + } + img, err := resvg.Render([]byte(res), resvg.WithBackground(cfg.Background)) + if err != nil { + return err + } + if err := typ.Encode(stdout, img); err != nil { + return err + } + if h.timing { + d := time.Since(start) + s := text.TimingDesc + v := []interface{}{float64(d.Microseconds()) / 1000} + if d > 1*time.Second { + s += " (%v)" + v = append(v, d.Round(1*time.Millisecond)) + } + fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...)) + } + return nil +} + +// doExecSingle executes a single query against the database based on its query type. +func (h *Handler) doExecSingle(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error { // exec or query - f := h.exec + f := h.doExec if qtyp { - f = h.query + f = h.doQuery } // exec - return f(ctx, w, opt, prefix, sqlstr) + start := time.Now() + if err := f(ctx, w, opt, prefix, sqlstr, bind); err != nil { + return err + } + if h.timing { + d := time.Since(start) + s := text.TimingDesc + v := []interface{}{float64(d.Microseconds()) / 1000} + if d > 1*time.Second { + s += " (%v)" + v = append(v, d.Round(1*time.Millisecond)) + } + fmt.Fprintln(h.l.Stdout(), fmt.Sprintf(s, v...)) + } + return nil } -// execSet executes a SQL query, setting all returned columns as variables. -func (h *Handler) execSet(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, _ bool) error { +// doExecSet executes a SQL query, setting all returned columns as variables. +func (h *Handler) doExecSet(ctx context.Context, w io.Writer, opt metacmd.Option, prefix, sqlstr string, _ bool, bind []interface{}) error { // query - rows, err := h.DB().QueryContext(ctx, sqlstr) + rows, err := h.DB().QueryContext(ctx, sqlstr, bind...) if err != nil { return err } @@ -1049,32 +1182,31 @@ func (h *Handler) execSet(ctx context.Context, w io.Writer, opt metacmd.Option, return nil } -// execExec executes a query and re-executes all columns of all rows as if they +// doExecExec executes a query and re-executes all columns of all rows as if they // were their own queries. -func (h *Handler) execExec(ctx context.Context, w io.Writer, _ metacmd.Option, prefix, sqlstr string, qtyp bool) error { +func (h *Handler) doExecExec(ctx context.Context, w io.Writer, _ metacmd.Option, prefix, sqlstr string, qtyp bool, bind []interface{}) error { // query - rows, err := h.DB().QueryContext(ctx, sqlstr) + rows, err := h.DB().QueryContext(ctx, sqlstr, bind...) if err != nil { return err } - // execRows - if err := h.execRows(ctx, w, rows); err != nil { + // exec resulting rows + if err := h.doExecRows(ctx, w, rows); err != nil { return err } // check for additional result sets ... for rows.NextResultSet() { - if err := h.execRows(ctx, w, rows); err != nil { + if err := h.doExecRows(ctx, w, rows); err != nil { return err } } return nil } -// query executes a query against the database. -func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, typ, sqlstr string) error { - start := time.Now() +// doQuery executes a doQuery against the database. +func (h *Handler) doQuery(ctx context.Context, w io.Writer, opt metacmd.Option, typ, sqlstr string, bind []interface{}) error { // run query - rows, err := h.DB().QueryContext(ctx, sqlstr) + rows, err := h.DB().QueryContext(ctx, sqlstr, bind...) if err != nil { return err } @@ -1093,7 +1225,7 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty } if pipeName != "" { if pipeName[0] == '|' { - pipe, cmd, err = env.Pipe(pipeName[1:]) + pipe, cmd, err = env.Pipe(h.l.Stdout(), h.l.Stderr(), pipeName[1:]) } else { pipe, err = os.OpenFile(pipeName, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0o644) } @@ -1105,25 +1237,28 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty } else if opt.Exec != metacmd.ExecWatch { params["pager_cmd"] = env.All()["PAGER"] } - useColumnTypes := drivers.UseColumnTypes(h.u) - // wrap query with crosstab + // set up column type config + var extra []tblfmt.Option + switch f := drivers.ColumnTypes(h.u); { + case f != nil: + extra = append(extra, tblfmt.WithColumnTypesFunc(f)) + case drivers.UseColumnTypes(h.u): + extra = append(extra, tblfmt.WithUseColumnTypes(true)) + } resultSet := tblfmt.ResultSet(rows) + // wrap query with crosstab if opt.Exec == metacmd.ExecCrosstab { var err error - resultSet, err = tblfmt.NewCrosstabView(rows, tblfmt.WithParams(opt.Crosstab...), tblfmt.WithUseColumnTypes(useColumnTypes)) - if err != nil { + if resultSet, err = tblfmt.NewCrosstabView(rows, append(extra, tblfmt.WithParams(opt.Crosstab...))...); err != nil { return err } - useColumnTypes = false + extra = nil } if drivers.LowerColumnNames(h.u) { params["lower_column_names"] = "true" } - if useColumnTypes { - params["use_column_types"] = "true" - } // encode and handle error conditions - switch err := tblfmt.EncodeAll(w, resultSet, params); { + switch err := tblfmt.EncodeAll(w, resultSet, params, extra...); { case err != nil && cmd != nil && errors.Is(err, syscall.EPIPE): // broken pipe means pager quit before consuming all data, which might be expected return nil @@ -1136,16 +1271,6 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty case params["format"] == "aligned": fmt.Fprintln(w) } - if h.timing { - d := time.Since(start) - format := text.TimingDesc - v := []interface{}{float64(d.Microseconds()) / 1000} - if d > 1*time.Second { - format += " (%v)" - v = append(v, d.Round(1*time.Millisecond)) - } - h.Print(format, v...) - } if pipe != nil { pipe.Close() if cmd != nil { @@ -1155,8 +1280,8 @@ func (h *Handler) query(ctx context.Context, w io.Writer, opt metacmd.Option, ty return err } -// execRows executes all the columns in the row. -func (h *Handler) execRows(ctx context.Context, w io.Writer, rows *sql.Rows) error { +// doExecRows executes all the columns in the row. +func (h *Handler) doExecRows(ctx context.Context, w io.Writer, rows *sql.Rows) error { // get columns cols, err := drivers.Columns(h.u, rows) if err != nil { @@ -1237,9 +1362,9 @@ func (h *Handler) scan(rows *sql.Rows, clen int, tfmt string) ([]string, error) return row, nil } -// exec does a database exec. -func (h *Handler) exec(ctx context.Context, w io.Writer, _ metacmd.Option, typ, sqlstr string) error { - res, err := h.DB().ExecContext(ctx, sqlstr) +// doExec does a database exec. +func (h *Handler) doExec(ctx context.Context, w io.Writer, _ metacmd.Option, typ, sqlstr string, bind []interface{}) error { + res, err := h.DB().ExecContext(ctx, sqlstr, bind...) if err != nil { _ = env.Set("ROW_COUNT", "0") return err @@ -1251,12 +1376,14 @@ func (h *Handler) exec(ctx context.Context, w io.Writer, _ metacmd.Option, typ, return err } // print name - fmt.Fprint(w, typ) - // print count - if count > 0 { - fmt.Fprint(w, " ", count) + if env.Get("QUIET") == "off" { + fmt.Fprint(w, typ) + // print count + if count > 0 { + fmt.Fprint(w, " ", count) + } + fmt.Fprintln(w) } - fmt.Fprintln(w) return env.Set("ROW_COUNT", strconv.FormatInt(count, 10)) } @@ -1360,7 +1487,7 @@ func (h *Handler) Include(path string, relative bool) error { Err: h.l.Stderr(), Pw: h.l.Password, } - p := New(l, h.user, filepath.Dir(path), h.nopw) + p := New(l, h.user, filepath.Dir(path), h.charts, h.nopw) p.db, p.u = h.db, h.u drivers.ConfigStmt(p.u, p.buf) err = p.Run() @@ -1392,6 +1519,35 @@ func (h *Handler) SetOutput(o io.WriteCloser) { h.out = o } +// FS is the filesystem interface. +type FS interface{} + +// Error wraps handler errors. +type Error struct { + Buf string + Err error +} + +// WrapErr wraps an [error] using the specified driver when err is not nil. +func WrapErr(buf string, err error) error { + if err == nil { + return nil + } + // avoid double wrapping error + if _, ok := err.(*Error); ok { + return err + } + return &Error{buf, err} +} + +// Error satisfies the [error] interface, returning the original error message. +func (e *Error) Error() string { + return e.Err.Error() +} + +// Unwrap returns the original error. +func (e *Error) Unwrap() error { return e.Err } + func readerOpts() []metadata.ReaderOption { var opts []metadata.ReaderOption envs := env.All() @@ -1448,3 +1604,27 @@ func grab(r []rune, i, end int) rune { } return 0 } + +// linetermRE is the end of line terminal. +var linetermRE = regexp.MustCompile(`(?:\r?\n)+$`) + +// empty reports whether s contains at least one printable, non-space character. +func empty(s string) bool { + i := strings.IndexFunc(s, func(r rune) bool { + return unicode.IsPrint(r) && !unicode.IsSpace(r) + }) + return i == -1 +} + +var ansiRE = regexp.MustCompile(`\x1b[[0-9]+([:;][0-9]+)*m`) + +// lastcolor returns the last defined color in s, if any. +func lastcolor(s string) string { + if i := strings.LastIndex(s, "\n"); i != -1 { + s = s[:i] + } + if i := strings.LastIndex(s, "\x1b[0m"); i != -1 { + s = s[i+4:] + } + return strings.Join(ansiRE.FindAllString(s, -1), "") +} diff --git a/handler/util.go b/handler/util.go deleted file mode 100644 index a8bb9e9038b..00000000000 --- a/handler/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package handler - -import ( - "regexp" - "strings" - "unicode" -) - -// linetermRE is the end of line terminal. -var linetermRE = regexp.MustCompile(`(?:\r?\n)+$`) - -// empty reports whether s contains at least one printable, non-space character. -func empty(s string) bool { - i := strings.IndexFunc(s, func(r rune) bool { - return unicode.IsPrint(r) && !unicode.IsSpace(r) - }) - return i == -1 -} - -var ansiRE = regexp.MustCompile(`\x1b[[0-9]+([:;][0-9]+)*m`) - -// lastcolor returns the last defined color in s, if any. -func lastcolor(s string) string { - if i := strings.LastIndex(s, "\n"); i != -1 { - s = s[:i] - } - if i := strings.LastIndex(s, "\x1b[0m"); i != -1 { - s = s[i+4:] - } - return strings.Join(ansiRE.FindAllString(s, -1), "") -} diff --git a/internal/chai.go b/internal/chai.go new file mode 100644 index 00000000000..e4046188c52 --- /dev/null +++ b/internal/chai.go @@ -0,0 +1,9 @@ +//go:build (all || most || chai) && !no_chai + +package internal + +// Code generated by gen.go. DO NOT EDIT. + +import ( + _ "github.com/xo/usql/drivers/chai" // ChaiSQL driver +) diff --git a/internal/genji.go b/internal/genji.go deleted file mode 100644 index 6ca29185ea9..00000000000 --- a/internal/genji.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build (bad || genji) && !no_genji - -package internal - -// Code generated by gen.go. DO NOT EDIT. - -import ( - _ "github.com/xo/usql/drivers/genji" // Genji driver -) diff --git a/internal/internal.go b/internal/internal.go index 843a9a9ccf4..e73096bd575 100644 --- a/internal/internal.go +++ b/internal/internal.go @@ -13,18 +13,18 @@ func KnownBuildTags() map[string]string { "avatica": "avatica", // github.com/apache/calcite-avatica-go/v5 "bigquery": "bigquery", // gorm.io/driver/bigquery/driver "cassandra": "cql", // github.com/MichaelS11/go-cql-driver + "chai": "chai", // github.com/chaisql/chai/driver "clickhouse": "clickhouse", // github.com/ClickHouse/clickhouse-go/v2 "cosmos": "cosmos", // github.com/btnguyen2k/gocosmos "couchbase": "n1ql", // github.com/couchbase/go_n1ql "csvq": "csvq", // github.com/mithrandie/csvq-driver - "databend": "databend", // github.com/databendcloud/databend-go + "databend": "databend", // github.com/datafuselabs/databend-go "databricks": "databricks", // github.com/databricks/databricks-sql-go "duckdb": "duckdb", // github.com/marcboeker/go-duckdb "dynamodb": "dynamodb", // github.com/btnguyen2k/godynamo "exasol": "exasol", // github.com/exasol/exasol-driver-go "firebird": "firebirdsql", // github.com/nakagami/firebirdsql "flightsql": "flightsql", // github.com/apache/arrow/go/v12/arrow/flight/flightsql/driver - "genji": "genji", // github.com/genjidb/genji/driver "godror": "godror", // github.com/godror/godror "h2": "h2", // github.com/jmrobles/h2go "hive": "hive", // sqlflow.org/gohive @@ -42,6 +42,7 @@ func KnownBuildTags() map[string]string { "postgres": "postgres", // github.com/lib/pq "presto": "presto", // github.com/prestodb/presto-go-client/presto "ql": "ql", // modernc.org/ql + "ramsql": "ramsql", // github.com/proullon/ramsql/driver "sapase": "tds", // github.com/thda/tds "saphana": "hdb", // github.com/SAP/go-hdb/driver "snowflake": "snowflake", // github.com/snowflakedb/gosnowflake diff --git a/internal/ramsql.go b/internal/ramsql.go new file mode 100644 index 00000000000..0039a521a14 --- /dev/null +++ b/internal/ramsql.go @@ -0,0 +1,9 @@ +//go:build (all || most || ramsql) && !no_ramsql + +package internal + +// Code generated by gen.go. DO NOT EDIT. + +import ( + _ "github.com/xo/usql/drivers/ramsql" // RamSQL driver +) diff --git a/main.go b/main.go index c2ab6b4a5f1..41bcbeb6b6b 100644 --- a/main.go +++ b/main.go @@ -9,11 +9,9 @@ import ( "fmt" "io" "os" - "os/user" "strings" "github.com/xo/usql/drivers" - "github.com/xo/usql/env" "github.com/xo/usql/handler" "github.com/xo/usql/internal" "github.com/xo/usql/rline" @@ -35,19 +33,11 @@ func main() { if _, ok := available[n]; ok { out = 1 } - fmt.Fprintf(os.Stdout, "%d", out) + fmt.Fprint(os.Stdout, out) return } - // load current user - cur, err := user.Current() - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - args := NewArgs() // run - err = run(args, cur) - if err != nil && err != io.EOF && err != rline.ErrInterrupt { + if err := New(os.Args).ExecuteContext(context.Background()); err != nil && err != io.EOF && err != rline.ErrInterrupt { var he *handler.Error if !errors.As(err, &he) { fmt.Fprintf(os.Stderr, "error: %v\n", err) @@ -66,114 +56,16 @@ func main() { if text.CommandVersion == "0.0.0-dev" || strings.Contains(text.CommandVersion, "-") { rev = "master" } - fmt.Fprintf(os.Stderr, "\ntry:\n\n go install -tags %s github.com/xo/usql@%s\n\n", tag, rev) - } - os.Exit(1) - } -} - -// run processes args, processing args.CommandOrFiles if non-empty, if -// specified, otherwise launch an interactive readline from stdin. -func run(args *Args, u *user.User) error { - // get working directory - wd, err := os.Getwd() - if err != nil { - return err - } - // handle variables - for _, v := range args.Variables { - if i := strings.Index(v, "="); i != -1 { - _ = env.Set(v[:i], v[i+1:]) - } else { - _ = env.Unset(v) - } - } - for _, v := range args.PVariables { - if i := strings.Index(v, "="); i != -1 { - vv := v[i+1:] - if c := vv[0]; c == '\'' || c == '"' { - var err error - vv, err = env.Dequote(vv, c) - if err != nil { - return err - } - } - if _, err = env.Pset(v[:i], vv); err != nil { - return err - } - } else { - if _, err = env.Ptoggle(v, ""); err != nil { - return err - } + fmt.Fprintf(os.Stderr, "\ntry:\n\n go install -tags 'most %s' github.com/xo/usql@%s\n\n", tag, rev) } - } - // create input/output - l, err := rline.New(len(args.CommandOrFiles) != 0, args.Out, env.HistoryFile(u)) - if err != nil { - return err - } - defer l.Close() - // create handler - h := handler.New(l, u, wd, args.NoPassword) - // force a password ... - dsn := args.DSN - if args.ForcePassword { - dsn, err = h.Password(dsn) - if err != nil { - return err + switch estr := err.Error(); { + case err == text.ErrWrongNumberOfArguments, + strings.HasPrefix(estr, "unknown flag:"), + strings.HasPrefix(estr, "unknown shorthand flag:"), + strings.HasPrefix(estr, "bad flag syntax:"), + strings.HasPrefix(estr, "flag needs an argument:"): + fmt.Fprintln(os.Stderr, text.CommandHelpHint) } - } - // open dsn - if err = h.Open(context.Background(), dsn); err != nil { - return err - } - // start transaction - if args.SingleTransaction { - if h.IO().Interactive() { - return text.ErrSingleTransactionCannotBeUsedWithInteractiveMode - } - if err = h.BeginTx(context.Background(), nil); err != nil { - return err - } - } - // rc file - if rc := env.RCFile(u); !args.NoRC && rc != "" { - if err = h.Include(rc, false); err != nil && err != text.ErrNoSuchFileOrDirectory { - return err - } - } - // setup runner - f := h.Run - if len(args.CommandOrFiles) != 0 { - f = runCommandOrFiles(h, args.CommandOrFiles) - } - // run - if err = f(); err != nil { - return err - } - // commit - if args.SingleTransaction { - return h.Commit() - } - return nil -} - -// runCommandOrFiles processes all the supplied commands or files. -func runCommandOrFiles(h *handler.Handler, commandsOrFiles []CommandOrFile) func() error { - return func() error { - for _, x := range commandsOrFiles { - h.SetSingleLineMode(x.Command) - if x.Command { - h.Reset([]rune(x.Value)) - if err := h.Run(); err != nil { - return err - } - } else { - if err := h.Include(x.Value, false); err != nil { - return err - } - } - } - return nil + os.Exit(1) } } diff --git a/metacmd/charts/charts.go b/metacmd/charts/charts.go new file mode 100644 index 00000000000..734ba4b57fb --- /dev/null +++ b/metacmd/charts/charts.go @@ -0,0 +1,300 @@ +package charts + +import ( + "encoding/json" + "fmt" + "image/color" + "math" + "strconv" + "strings" + + "github.com/kenshaw/colors" + "github.com/xo/usql/text" +) + +type ChartConfig struct { + Title string + Subtitle string + W, H int + Background color.Color + Type string + Prec int + + File string +} + +func ParseArgs(opts map[string]string) (ChartConfig, error) { + cfg := ChartConfig{ + Title: opts["title"], + Subtitle: opts["subtitle"], + W: 800, + H: 600, + Background: color.White, + Type: opts["type"], + } + if size, ok := opts["size"]; ok { + b, a, ok := strings.Cut(size, "x") + if !ok { + return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", "provide size as NxN") + } + var err error + cfg.W, err = strconv.Atoi(b) + if err != nil { + return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", err) + } + cfg.H, err = strconv.Atoi(a) + if err != nil { + return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "size", err) + } + } + if c, ok := opts["bg"]; ok { + var err error + cfg.Background, err = colors.Parse(c) + if err != nil { + return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "bg", err) + } + } + if prec, ok := opts["prec"]; ok { + p, err := strconv.Atoi(prec) + if err != nil { + return ChartConfig{}, fmt.Errorf(text.ChartParseFailed, "prec", err) + } + cfg.Prec = p + } + if file, ok := opts["file"]; ok { + cfg.File = file + } + return cfg, nil +} + +type Chart struct { + Title string + Subtitle string + Legend []string + XAxis Series + YAxis Series + Series []Series +} + +type Series struct { + Name string + Type string + Data any +} + +func MakeChart(cfg ChartConfig, cols []string, transposed [][]string) (*Chart, error) { + numCols := make([][]float64, len(cols)) + for i, col := range transposed { + for _, v := range col { + f, err := parseFloat(v, cfg.Prec) + if err != nil { + numCols[i] = nil + break + } + if numCols[i] == nil { + // don't allocate slice unless we have at least some valid data + numCols[i] = make([]float64, 0, len(col)) + } + numCols[i] = append(numCols[i], f) + } + } + firstReg, firstNumeric := -1, -1 + for i, c := range numCols { + if firstReg == -1 && c == nil { + firstReg = i + } + if firstNumeric == -1 && c != nil { + firstNumeric = i + } + } + c := &Chart{ + Title: cfg.Title, + Subtitle: cfg.Subtitle, + } + var x int + var chartType string + switch { + case firstNumeric == -1: + return nil, text.ErrNoNumericColumns + case firstReg >= 0: + x = firstReg + chartType = "bar" + default: + x = firstNumeric + chartType = "line" + } + if cfg.Type != "" { + chartType = cfg.Type + } + c.XAxis = Series{ + Name: cols[x], + Type: "category", + Data: transposed[x], + } + c.YAxis = Series{ + Type: "value", + } + for i, col := range cols { + if i == x { + continue + } + c.Legend = append(c.Legend, col) + c.Series = append(c.Series, Series{ + Name: col, + Type: chartType, + Data: numCols[i], + }) + } + return c, nil +} + +/* echarts */ + +type echarts struct { + Title *echartsTitle `json:"title,omitempty"` + Legend *echartsLegend `json:"legend,omitempty"` + XAxis *echartsAxis `json:"xAxis,omitempty"` + YAxis *echartsAxis `json:"yAxis,omitempty"` + Series []echartsAxis `json:"series,omitempty"` +} + +type echartsTitle struct { + Title string `json:"text,omitempty"` + Subtext string `json:"subtext,omitempty"` +} + +type echartsLegend struct { + Data []string `json:"data,omitempty"` +} + +type echartsAxis struct { + Name string `json:"name,omitempty"` + Type string `json:"type,omitempty"` + Data any `json:"data,omitempty"` +} + +func (c Chart) ToEcharts() (string, error) { + ec := echarts{} + if c.Title != "" || c.Subtitle != "" { + ec.Title = &echartsTitle{c.Title, c.Subtitle} + } + if len(c.Legend) > 0 { + ec.Legend = &echartsLegend{c.Legend} + } + if c.XAxis.Data != nil || c.YAxis.Type != "" { + ec.XAxis = &echartsAxis{ + Name: c.XAxis.Name, + Type: c.XAxis.Type, + Data: c.XAxis.Data, + } + } + if c.YAxis.Data != nil || c.YAxis.Type != "" { + ec.YAxis = &echartsAxis{ + Name: c.YAxis.Name, + Type: c.YAxis.Type, + Data: c.YAxis.Data, + } + } + if len(c.Series) > 0 { + ec.Series = make([]echartsAxis, 0, len(c.Series)) + for _, s := range c.Series { + ec.Series = append(ec.Series, echartsAxis{ + Name: s.Name, + Type: s.Type, + Data: s.Data, + }) + } + } + buf, err := json.Marshal(ec) + if err != nil { + return "", err + } + return string(buf), nil +} + +func parseFloat(v string, prec int) (f float64, err error) { + f, err = strconv.ParseFloat(v, 64) + if err != nil || prec == 0 { + return + } + r := math.Pow(10, float64(prec)) + return math.Round(f*r) / r, nil +} + +const basicBarTemplate = ` +{ + "title": { + "text": {{ printf "%q" .Title }}, + "subtext": {{ printf "%q" .Subtitle }} + }, + {{- if .Legend }} + "legend": { + "data": [ + {{ range .Legend }}{{ printf "%q" . }}{{ end }} + ] + }, + {{- end }} + "xAxis": [ + { + "type": "category", + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "yAxis": [ + { + "type": "value" + } + ], + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ], + }, + { + "name": "Evaporation", + "type": "bar", + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ], + } + ] +} +` diff --git a/metacmd/cmds.go b/metacmd/cmds.go index 4bc170c9522..4c6df90d730 100644 --- a/metacmd/cmds.go +++ b/metacmd/cmds.go @@ -7,25 +7,24 @@ import ( "fmt" "io" "os" + "os/exec" "os/signal" "sort" "strconv" "strings" "time" - "github.com/alecthomas/kingpin/v2" "github.com/xo/dburl" "github.com/xo/usql/drivers" "github.com/xo/usql/env" "github.com/xo/usql/text" + "golang.org/x/exp/maps" ) // Cmd is a command implementation. type Cmd struct { Section Section - Name string - Desc Desc - Aliases map[string]Desc + Descs []Desc Process func(*Params) error } @@ -42,36 +41,48 @@ func init() { cmds = []Cmd{ Question: { Section: SectionHelp, - Name: "?", - Desc: Desc{"show help on backslash commands", "[commands]"}, - Aliases: map[string]Desc{ - "?": {"show help on " + text.CommandName + " command-line options", "options"}, - "? ": {"show help on special variables", "variables"}, + Descs: []Desc{ + {"?", "[commands]", "show help on backslash commands"}, + {"?", "options", "show help on " + text.CommandName + " command-line options"}, + {"?", "variables", "show help on special " + text.CommandName + " variables"}, }, Process: func(p *Params) error { name, err := p.Get(false) if err != nil { return err } - switch name { + stdout, stderr := p.Handler.IO().Stdout(), p.Handler.IO().Stderr() + var cmd *exec.Cmd + var wc io.WriteCloser + if pager := env.Get("PAGER"); p.Handler.IO().Interactive() && pager != "" { + if wc, cmd, err = env.Pipe(stdout, stderr, pager); err != nil { + return err + } + stdout = wc + } + switch name = strings.TrimSpace(strings.ToLower(name)); { + case name == "options": + Usage(stdout, true) + case name == "variables": + env.Listing(stdout) default: - Listing(p.Handler.IO().Stdout()) - case "commands": - Listing(p.Handler.IO().Stdout()) - case "options": - // FIXME: decouple - kingpin.Usage() - case "variables": - env.Listing(p.Handler.IO().Stdout()) + Listing(stdout) + } + if cmd != nil { + if err := wc.Close(); err != nil { + return err + } + return cmd.Wait() } return nil }, }, Quit: { Section: SectionGeneral, - Name: "q", - Desc: Desc{"quit " + text.CommandName, ""}, - Aliases: map[string]Desc{"quit": {}}, + Descs: []Desc{ + {"q", "", "quit " + text.CommandName}, + {"quit", "", ""}, + }, Process: func(p *Params) error { p.Option.Quit = true return nil @@ -79,32 +90,48 @@ func init() { }, Copyright: { Section: SectionGeneral, - Name: "copyright", - Desc: Desc{"show " + text.CommandName + " usage and distribution terms", ""}, + Descs: []Desc{ + {"copyright", "", "show " + text.CommandName + " usage and distribution terms"}, + }, Process: func(p *Params) error { - p.Handler.Print(text.Copyright) + stdout := p.Handler.IO().Stdout() + if typ := env.TermGraphics(); typ.Available() { + typ.Encode(stdout, text.Logo) + } + fmt.Fprintln(stdout, text.Copyright) return nil }, }, ConnectionInfo: { Section: SectionConnection, - Name: "conninfo", - Desc: Desc{"display information about the current database connection", ""}, + Descs: []Desc{ + {"conninfo", "", "display information about the current database connection"}, + }, Process: func(p *Params) error { + s := text.NotConnected if db, u := p.Handler.DB(), p.Handler.URL(); db != nil && u != nil { - p.Handler.Print(text.ConnInfo, u.Driver, u.DSN) - } else { - p.Handler.Print(text.NotConnected) + s = fmt.Sprintf(text.ConnInfo, u.Driver, u.DSN) } + fmt.Fprintln(p.Handler.IO().Stdout(), s) return nil }, }, Drivers: { Section: SectionGeneral, - Name: "drivers", - Desc: Desc{"display information about available database drivers", ""}, + Descs: []Desc{ + {"drivers", "", "display information about available database drivers"}, + }, Process: func(p *Params) error { - out := p.Handler.IO().Stdout() + stdout, stderr := p.Handler.IO().Stdout(), p.Handler.IO().Stderr() + var cmd *exec.Cmd + var wc io.WriteCloser + if pager := env.Get("PAGER"); p.Handler.IO().Interactive() && pager != "" { + var err error + if wc, cmd, err = env.Pipe(stdout, stderr, pager); err != nil { + return err + } + stdout = wc + } available := drivers.Available() names := make([]string, len(available)) var z int @@ -113,7 +140,7 @@ func init() { z++ } sort.Strings(names) - fmt.Fprintln(out, text.AvailableDrivers) + fmt.Fprintln(stdout, text.AvailableDrivers) for _, n := range names { s := " " + n driver, aliases := dburl.SchemeDriverAndAliases(n) @@ -125,18 +152,23 @@ func init() { s += " [" + strings.Join(aliases, ", ") + "]" } } - fmt.Fprintln(out, s) + fmt.Fprintln(stdout, s) + } + if cmd != nil { + if err := wc.Close(); err != nil { + return err + } + return cmd.Wait() } return nil }, }, Connect: { Section: SectionConnection, - Name: "c", - Desc: Desc{"connect to database url", "DSN"}, - Aliases: map[string]Desc{ - "c": {"connect to database with driver and parameters", "DRIVER PARAMS..."}, - "connect": {}, + Descs: []Desc{ + {"c", "DSN", "connect to database url"}, + {"c", "DRIVER PARAMS...", "connect to database with driver and parameters"}, + {"connect", "", ""}, }, Process: func(p *Params) error { vals, err := p.GetAll(true) @@ -148,20 +180,50 @@ func init() { return p.Handler.Open(ctx, vals...) }, }, + SetConnVar: { + Section: SectionConnection, + Descs: []Desc{ + {"cset", "[NAME [DSN]]", "set named connection, or list all if no parameters"}, + {"cset", "NAME DRIVER PARAMS...", "define named connection for database driver"}, + }, + Process: func(p *Params) error { + ok, n, err := p.GetOK(true) + switch { + case err != nil: + return err + case ok: + vals, err := p.GetAll(true) + if err != nil { + return err + } + return env.Cset(n, vals...) + } + vals := env.Call() + keys := maps.Keys(vals) + sort.Strings(keys) + out := p.Handler.IO().Stdout() + for _, k := range keys { + fmt.Fprintln(out, k, "=", "'"+strings.Join(vals[k], " ")+"'") + } + return nil + }, + }, Disconnect: { Section: SectionConnection, - Name: "Z", - Desc: Desc{"close database connection", ""}, - Aliases: map[string]Desc{"disconnect": {}}, + Descs: []Desc{ + {"Z", "", "close database connection"}, + {"disconnect", "", ""}, + }, Process: func(p *Params) error { return p.Handler.Close() }, }, Password: { Section: SectionConnection, - Name: "password", - Desc: Desc{"change the password for a user", "[USERNAME]"}, - Aliases: map[string]Desc{"passwd": {}}, + Descs: []Desc{ + {"password", "[USERNAME]", "change the password for a user"}, + {"passwd", "", ""}, + }, Process: func(p *Params) error { username, err := p.Get(true) if err != nil { @@ -180,15 +242,15 @@ func init() { }, Exec: { Section: SectionQueryExecute, - Name: "g", - Desc: Desc{"execute query (and send results to file or |pipe)", "[(OPTIONS)] [FILE] or ;"}, - Aliases: map[string]Desc{ - "gexec": {"execute query and execute each value of the result", ""}, - "gset": {"execute query and store results in " + text.CommandName + " variables", "[PREFIX]"}, - "gx": {`as \g, but forces expanded output mode`, `[(OPTIONS)] [FILE]`}, - "G": {`as \g, but forces vertical output mode`, `[(OPTIONS)] [FILE]`}, - "crosstabview": {"execute query and display results in crosstab", "[(OPTIONS)] [COLUMNS]"}, - "watch": {"execute query every specified interval", "[(OPTIONS)] [DURATION]"}, + Descs: []Desc{ + {"g", "[(OPTIONS)] [FILE] or ;", "execute query (and send results to file or |pipe)"}, + {"G", "[(OPTIONS)] [FILE]", "as \\g, but forces vertical output mode"}, + {"gx", "[(OPTIONS)] [FILE]", "as \\g, but forces expanded output mode"}, + {"gexec", "", "execute query and execute each value of the result"}, + {"gset", "[PREFIX]", "execute query and store results in " + text.CommandName + " variables"}, + {"crosstabview", "[(OPTIONS)] [COLUMNS]", "execute query and display results in crosstab"}, + {"chart", "CHART [(OPTIONS)]", "execute query and display results as a chart"}, + {"watch", "[(OPTIONS)] [DURATION]", "execute query every specified interval"}, }, Process: func(p *Params) error { p.Option.Exec = ExecOnly @@ -234,6 +296,32 @@ func init() { break } } + case "chart": + p.Option.Exec = ExecChart + if p.Option.Params == nil { + p.Option.Params = make(map[string]string, 1) + } + params, err := p.GetAll(true) + if err != nil { + return err + } + for i := 0; i < len(params); i++ { + param := params[i] + if param == "help" { + p.Option.Params["help"] = "" + return nil + } + equal := strings.IndexByte(param, '=') + switch { + case equal == -1 && i >= len(params)-1: + return text.ErrWrongNumberOfArguments + case equal == -1: + i++ + p.Option.Params[param] = params[i] + default: + p.Option.Params[param[:equal]] = param[equal+1:] + } + } case "watch": p.Option.Exec = ExecWatch p.Option.Watch = 2 * time.Second @@ -257,11 +345,33 @@ func init() { return nil }, }, + Bind: { + Section: SectionQueryExecute, + Descs: []Desc{ + {"bind", "[PARAM]...", "set query parameters"}, + }, + Process: func(p *Params) error { + bind, err := p.GetAll(true) + if err != nil { + return err + } + var v []interface{} + if n := len(bind); n != 0 { + v = make([]interface{}, len(bind)) + for i := 0; i < n; i++ { + v[i] = bind[i] + } + } + p.Handler.Bind(v) + return nil + }, + }, Edit: { Section: SectionQueryBuffer, - Name: "e", - Desc: Desc{"edit the query buffer (or file) with external editor", "[FILE] [LINE]"}, - Aliases: map[string]Desc{"edit": {}}, + Descs: []Desc{ + {"e", "[FILE] [LINE]", "edit the query buffer (or file) with external editor"}, + {"edit", "", ""}, + }, Process: func(p *Params) error { // get last statement s, buf := p.Handler.Last(), p.Handler.Buf() @@ -289,11 +399,10 @@ func init() { }, Print: { Section: SectionQueryBuffer, - Name: "p", - Desc: Desc{"show the contents of the query buffer", ""}, - Aliases: map[string]Desc{ - "print": {}, - "raw": {"show the raw (non-interpolated) contents of the query buffer", ""}, + Descs: []Desc{ + {"p", "", "show the contents of the query buffer"}, + {"print", "", ""}, + {"raw", "", "show the raw (non-interpolated) contents of the query buffer"}, }, Process: func(p *Params) error { // get last statement @@ -326,56 +435,59 @@ func init() { }, Reset: { Section: SectionQueryBuffer, - Name: "r", - Desc: Desc{"reset (clear) the query buffer", ""}, - Aliases: map[string]Desc{"reset": {}}, + Descs: []Desc{ + {"r", "", "reset (clear) the query buffer"}, + {"reset", "", ""}, + }, Process: func(p *Params) error { p.Handler.Reset(nil) - fmt.Fprintln(p.Handler.IO().Stdout(), text.QueryBufferReset) + p.Handler.Print(text.QueryBufferReset) return nil }, }, Echo: { Section: SectionInputOutput, - Name: "echo", - Desc: Desc{"write string to standard output (-n for no newline)", "[-n] [STRING]"}, - Aliases: map[string]Desc{ - "qecho": {"write string to \\o output stream (-n for no newline)", "[-n] [STRING]"}, - "warn": {"write string to standard error (-n for no newline)", "[-n] [STRING]"}, + Descs: []Desc{ + {"echo", "[-n] [STRING]", "write string to standard output (-n for no newline)"}, + {"qecho", "[-n] [STRING]", "write string to \\o output stream (-n for no newline)"}, + {"warn", "[-n] [STRING]", "write string to standard error (-n for no newline)"}, }, Process: func(p *Params) error { - nl := "\n" - var vals []string ok, n, err := p.GetOptional(true) if err != nil { return err } - if ok && n == "n" { - nl = "" - } else if ok { + f := fmt.Fprintln + var vals []string + switch { + case ok && n == "n": + f = fmt.Fprint + case ok: vals = append(vals, "-"+n) - } else { + default: vals = append(vals, n) } v, err := p.GetAll(true) if err != nil { return err } - out := io.Writer(p.Handler.IO().Stdout()) - if o := p.Handler.GetOutput(); p.Name == "qecho" && o != nil { + out := p.Handler.IO().Stdout() + switch o := p.Handler.GetOutput(); { + case p.Name == "qecho" && o != nil: out = o - } else if p.Name == "warn" { + case p.Name == "warn": out = p.Handler.IO().Stderr() } - fmt.Fprint(out, strings.Join(append(vals, v...), " ")+nl) + f(out, strings.Join(append(vals, v...), " ")) return nil }, }, Write: { Section: SectionQueryBuffer, - Name: "w", - Desc: Desc{"write query buffer to file", "FILE"}, - Aliases: map[string]Desc{"write": {}}, + Descs: []Desc{ + {"w", "FILE", "write query buffer to file"}, + {"write", "", ""}, + }, Process: func(p *Params) error { // get last statement s, buf := p.Handler.Last(), p.Handler.Buf() @@ -391,8 +503,9 @@ func init() { }, ChangeDir: { Section: SectionOperatingSystem, - Name: "cd", - Desc: Desc{"change the current working directory", "[DIR]"}, + Descs: []Desc{ + {"cd", "[DIR]", "change the current working directory"}, + }, Process: func(p *Params) error { dir, err := p.Get(true) if err != nil { @@ -401,10 +514,35 @@ func init() { return env.Chdir(p.Handler.User(), dir) }, }, + GetEnv: { + Section: SectionOperatingSystem, + Descs: []Desc{ + {"getenv", "VARNAME ENVVAR", "fetch environment variable"}, + }, + Process: func(p *Params) error { + n, err := p.Get(true) + switch { + case err != nil: + return err + case n == "": + return text.ErrMissingRequiredArgument + } + v, err := p.Get(true) + switch { + case err != nil: + return err + case v == "": + return text.ErrMissingRequiredArgument + } + value, _ := env.Getenv(v) + return env.Set(n, value) + }, + }, SetEnv: { Section: SectionOperatingSystem, - Name: "setenv", - Desc: Desc{"set or unset environment variable", "NAME [VALUE]"}, + Descs: []Desc{ + {"setenv", "NAME [VALUE]", "set or unset environment variable"}, + }, Process: func(p *Params) error { n, err := p.Get(true) if err != nil { @@ -419,8 +557,9 @@ func init() { }, Timing: { Section: SectionOperatingSystem, - Name: "timing", - Desc: Desc{"toggle timing of commands", "[on|off]"}, + Descs: []Desc{ + {"timing", "[on|off]", "toggle timing of commands"}, + }, Process: func(p *Params) error { v, err := p.Get(true) if err != nil { @@ -451,21 +590,21 @@ func init() { }, Shell: { Section: SectionOperatingSystem, - Name: "!", - Desc: Desc{"execute command in shell or start interactive shell", "[COMMAND]"}, + Descs: []Desc{ + {"!", "[COMMAND]", "execute command in shell or start interactive shell"}, + }, Process: func(p *Params) error { return env.Shell(p.GetRaw()) }, }, Out: { Section: SectionInputOutput, - Name: "o", - Desc: Desc{"send all query results to file or |pipe", "[FILE]"}, - Aliases: map[string]Desc{"out": {}}, + Descs: []Desc{ + {"o", "[FILE]", "send all query results to file or |pipe"}, + {"out", "", ""}, + }, Process: func(p *Params) error { - if out := p.Handler.GetOutput(); out != nil { - p.Handler.SetOutput(nil) - } + p.Handler.SetOutput(nil) params, err := p.GetAll(true) if err != nil { return err @@ -476,7 +615,7 @@ func init() { } var out io.WriteCloser if pipe[0] == '|' { - out, _, err = env.Pipe(pipe[1:]) + out, _, err = env.Pipe(p.Handler.IO().Stdout(), p.Handler.IO().Stderr(), pipe[1:]) } else { out, err = os.OpenFile(pipe, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0o644) } @@ -489,12 +628,11 @@ func init() { }, Include: { Section: SectionInputOutput, - Name: "i", - Desc: Desc{"execute commands from file", "FILE"}, - Aliases: map[string]Desc{ - "ir": {`as \i, but relative to location of current script`, `FILE`}, - "include": {}, - "include_relative": {}, + Descs: []Desc{ + {"i", "FILE", "execute commands from file"}, + {"ir", "FILE", "as \\i, but relative to location of current script"}, + {"include", "", ""}, + {"include_relative", "", ""}, }, Process: func(p *Params) error { path, err := p.Get(true) @@ -510,13 +648,12 @@ func init() { }, Transact: { Section: SectionTransaction, - Name: "begin", - Desc: Desc{"begin a transaction", ""}, - Aliases: map[string]Desc{ - "begin": {"begin a transaction with isolation level", "[-read-only] [ISOLATION]"}, - "commit": {"commit current transaction", ""}, - "rollback": {"rollback (abort) current transaction", ""}, - "abort": {}, + Descs: []Desc{ + {"begin", "", "begin a transaction"}, + {"begin", "[-read-only] [ISOLATION]", "begin a transaction with isolation level"}, + {"commit", "", "commit current transaction"}, + {"rollback", "", "rollback (abort) current transaction"}, + {"abort", "", ""}, }, Process: func(p *Params) error { switch p.Name { @@ -571,8 +708,9 @@ func init() { }, Prompt: { Section: SectionVariables, - Name: "prompt", - Desc: Desc{"prompt user to set variable", "[-TYPE] [PROMPT]"}, + Descs: []Desc{ + {"prompt", "[-TYPE] VAR [PROMPT]", "prompt user to set variable"}, + }, Process: func(p *Params) error { typ := "string" ok, n, err := p.GetOptional(true) @@ -605,39 +743,36 @@ func init() { }, SetVar: { Section: SectionVariables, - Name: "set", - Desc: Desc{"set internal variable, or list all if no parameters", "[NAME [VALUE]]"}, + Descs: []Desc{ + {"set", "[NAME [VALUE]]", "set internal variable, or list all if no parameters"}, + }, Process: func(p *Params) error { ok, n, err := p.GetOK(true) - if err != nil { + switch { + case err != nil: return err - } - if !ok { - vals := env.All() - out := p.Handler.IO().Stdout() - n := make([]string, len(vals)) - var i int - for k := range vals { - n[i] = k - i++ - } - sort.Strings(n) - for _, k := range n { - fmt.Fprintln(out, k, "=", "'"+vals[k]+"'") + case ok: + vals, err := p.GetAll(true) + if err != nil { + return err } - return nil + return env.Set(n, strings.Join(vals, " ")) } - vals, err := p.GetAll(true) - if err != nil { - return err + vals := env.All() + keys := maps.Keys(vals) + sort.Strings(keys) + out := p.Handler.IO().Stdout() + for _, k := range keys { + fmt.Fprintln(out, k, "=", "'"+vals[k]+"'") } - return env.Set(n, strings.Join(vals, "")) + return nil }, }, Unset: { Section: SectionVariables, - Name: "unset", - Desc: Desc{"unset (delete) internal variable", "NAME"}, + Descs: []Desc{ + {"unset", "NAME", "unset (delete) internal variable"}, + }, Process: func(p *Params) error { n, err := p.Get(true) if err != nil { @@ -646,18 +781,17 @@ func init() { return env.Unset(n) }, }, - SetFormatVar: { + SetPrintVar: { Section: SectionFormatting, - Name: "pset", - Desc: Desc{"set table output option", "[NAME [VALUE]]"}, - Aliases: map[string]Desc{ - "a": {"toggle between unaligned and aligned output mode", ""}, - "C": {"set table title, or unset if none", "[STRING]"}, - "f": {"show or set field separator for unaligned query output", "[STRING]"}, - "H": {"toggle HTML output mode", ""}, - "T": {"set HTML
tag attributes, or unset if none", "[STRING]"}, - "t": {"show only rows", "[on|off]"}, - "x": {"toggle expanded output", "[on|off|auto]"}, + Descs: []Desc{ + {"pset", "[NAME [VALUE]]", "set table output option"}, + {"a", "", "toggle between unaligned and aligned output mode"}, + {"C", "[STRING]", "set table title, or unset if none"}, + {"f", "[STRING]", "show or set field separator for unaligned query output"}, + {"H", "", "toggle HTML output mode"}, + {"T", "[STRING]", "set HTML
tag attributes, or unset if none"}, + {"t", "[on|off]", "show only rows"}, + {"x", "[on|off|auto]", "toggle expanded output"}, }, Process: func(p *Params) error { var ok bool @@ -736,19 +870,18 @@ func init() { }, Describe: { Section: SectionInformational, - Name: "d[S+]", - Desc: Desc{"list tables, views, and sequences or describe table, view, sequence, or index", "[NAME]"}, - Aliases: map[string]Desc{ - "da[S+]": {"list aggregates", "[PATTERN]"}, - "df[S+]": {"list functions", "[PATTERN]"}, - "dm[S+]": {"list materialized views", "[PATTERN]"}, - "dv[S+]": {"list views", "[PATTERN]"}, - "ds[S+]": {"list sequences", "[PATTERN]"}, - "dn[S+]": {"list schemas", "[PATTERN]"}, - "dt[S+]": {"list tables", "[PATTERN]"}, - "di[S+]": {"list indexes", "[PATTERN]"}, - "dp[S]": {"list table, view, and sequence access privileges", "[PATTERN]"}, - "l[+]": {"list databases", ""}, + Descs: []Desc{ + {"d[S+]", "[NAME]", "list tables, views, and sequences or describe table, view, sequence, or index"}, + {"da[S+]", "[PATTERN]", "list aggregates"}, + {"df[S+]", "[PATTERN]", "list functions"}, + {"di[S+]", "[PATTERN]", "list indexes"}, + {"dm[S+]", "[PATTERN]", "list materialized views"}, + {"dn[S+]", "[PATTERN]", "list schemas"}, + {"dp[S]", "[PATTERN]", "list table, view, and sequence access privileges"}, + {"ds[S+]", "[PATTERN]", "list sequences"}, + {"dt[S+]", "[PATTERN]", "list tables"}, + {"dv[S+]", "[PATTERN]", "list views"}, + {"l[+]", "", "list databases"}, }, Process: func(p *Params) error { ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) @@ -788,8 +921,9 @@ func init() { }, Stats: { Section: SectionInformational, - Name: "ss[+]", - Desc: Desc{"show stats for a table or a query", "[TABLE|QUERY] [k]"}, + Descs: []Desc{ + {"ss[+]", "[TABLE|QUERY] [k]", "show stats for a table or a query"}, + }, Process: func(p *Params) error { ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() @@ -826,10 +960,9 @@ func init() { }, Copy: { Section: SectionInputOutput, - Name: "copy", - Desc: Desc{"copy query from source url to table on destination url", "SRC DST QUERY TABLE"}, - Aliases: map[string]Desc{ - "copy": {"copy query from source url to columns of table on destination url", "SRC DST QUERY TABLE(A,...)"}, + Descs: []Desc{ + {"copy", "SRC DST QUERY TABLE", "copy query from source url to table on destination url"}, + {"copy", "SRC DST QUERY TABLE(A,...)", "copy query from source url to columns of table on destination url"}, }, Process: func(p *Params) error { ctx := context.Background() @@ -893,7 +1026,7 @@ func init() { if mc == None { continue } - name := c.Name + name := c.Descs[0].Name if pos := strings.IndexRune(name, '['); pos != -1 { mods := strings.TrimRight(name[pos+1:], "]") name = name[:pos] @@ -905,19 +1038,23 @@ func init() { } } cmdMap[name] = mc - for alias := range c.Aliases { - if pos := strings.IndexRune(alias, '['); pos != -1 { - mods := strings.TrimRight(alias[pos+1:], "]") - alias = alias[:pos] - cmdMap[alias+mods] = mc + for _, d := range c.Descs { + if pos := strings.IndexRune(d.Name, '['); pos != -1 { + mods := strings.TrimRight(d.Name[pos+1:], "]") + d.Name = d.Name[:pos] + cmdMap[d.Name+mods] = mc if len(mods) > 1 { for _, r := range mods { - cmdMap[alias+string(r)] = mc + cmdMap[d.Name+string(r)] = mc } } } - cmdMap[alias] = mc + cmdMap[d.Name] = mc } sectMap[c.Section] = append(sectMap[c.Section], mc) } } + +// Usage is used by the [Question] command to display command line options. +var Usage = func(io.Writer, bool) { +} diff --git a/metacmd/metacmd.go b/metacmd/metacmd.go index 397f3fc8a43..0960260fd3f 100644 --- a/metacmd/metacmd.go +++ b/metacmd/metacmd.go @@ -1,4 +1,4 @@ -// Package metacmd contains meta information and implentation for usql's +// Package metacmd contains meta information and implementation for usql's // backslash (\) commands. package metacmd @@ -40,6 +40,8 @@ const ( Copyright // Connect is the connect meta command (\c, \connect). Connect + // SetConnVar is the set conn var command (\cset). + SetConnVar // Copy is the copy meta command (\copy). Copy // Disconnect is the disconnect meta command (\Z). @@ -54,6 +56,8 @@ const ( Describe // Exec is the execute meta command (\g and variants). Exec + // Bind is the bind meta command (\bind). + Bind // Edit is the edit query buffer meta command (\e). Edit // Print is the print query buffer meta command (\p, \print, \raw). @@ -66,6 +70,8 @@ const ( Write // ChangeDir is the system change directory meta command (\cd). ChangeDir + // GetEnv is the system get environment variable meta command (\getenv). + GetEnv // SetEnv is the system set environment variable meta command (\setenv). SetEnv // Shell is the system shell exec meta command (\!). @@ -82,8 +88,8 @@ const ( SetVar // Unset is the variable unset meta command (\unset). Unset - // SetFormatVar is the set format variable meta commands (\pset, \a, \C, \f, \H, \t, \T, \x). - SetFormatVar + // SetPrintVar is the set print variable meta commands (\pset, \a, \C, \f, \H, \t, \T, \x). + SetPrintVar // Timing is the timing meta command (\timing). Timing // Stats is the show stats meta command (\ss and variants). diff --git a/metacmd/section.go b/metacmd/section.go index 6c9d743ea54..0fbd7ca6d8f 100644 --- a/metacmd/section.go +++ b/metacmd/section.go @@ -3,14 +3,14 @@ package metacmd import ( "fmt" "io" - "sort" "strings" ) // Desc holds information about a command or alias description. type Desc struct { - Desc string + Name string Params string + Desc string } // Section is a meta command section. @@ -39,10 +39,17 @@ func (s Section) String() string { // SectionOrder is the order of sections to display via Listing. var SectionOrder = []Section{ - SectionGeneral, SectionQueryExecute, SectionQueryBuffer, SectionHelp, - SectionInputOutput, SectionInformational, SectionFormatting, + SectionGeneral, + SectionQueryExecute, + SectionQueryBuffer, + SectionHelp, + SectionInputOutput, + SectionInformational, + SectionFormatting, SectionTransaction, - SectionConnection, SectionOperatingSystem, SectionVariables, + SectionConnection, + SectionOperatingSystem, + SectionVariables, } // Listing writes the formatted command listing to w, separated into different @@ -54,32 +61,24 @@ func Listing(w io.Writer) { var descs [][]string for _, c := range sectMap[section] { cmd := cmds[c] - s, opts := optText(cmd.Desc) - descs, plen = add(descs, ` \`+cmd.Name+opts, s, plen) - // sort aliases - var aliases []string - for alias, desc := range cmd.Aliases { - if desc.Desc == "" && desc.Params == "" { + for i, d := range cmd.Descs { + if d.Desc == "" && d.Params == "" { continue } - aliases = append(aliases, alias) - } - sort.Slice(aliases, func(i, j int) bool { - return strings.ToLower(aliases[i]) < strings.ToLower(aliases[j]) - }) - for _, alias := range aliases { - s, opts := optText(cmd.Aliases[alias]) - descs, plen = add(descs, ` \`+strings.TrimSpace(alias)+opts, s, plen) + s, opts := optText(cmd.Descs[i]) + descs, plen = add(descs, ` \`+strings.TrimSpace(d.Name)+opts, s, plen) } } sectionDescs[section] = descs } - for _, section := range SectionOrder { + for i, section := range SectionOrder { + if i != 0 { + fmt.Fprintln(w) + } fmt.Fprintln(w, section) for _, line := range sectionDescs[section] { fmt.Fprintln(w, rpad(line[0], plen), "", line[1]) } - fmt.Fprintln(w) } } diff --git a/metacmd/types.go b/metacmd/types.go index 8c7597cf4a0..2b7d3b1ab79 100644 --- a/metacmd/types.go +++ b/metacmd/types.go @@ -35,6 +35,8 @@ type Handler interface { Buf() *stmt.Stmt // Reset resets the last and current query buffer. Reset([]rune) + // Bind binds query parameters. + Bind([]interface{}) // Open opens a database connection. Open(context.Context, ...string) error // Close closes the current database connection. @@ -97,6 +99,8 @@ const ( ExecExec // ExecCrosstab indicates execution using crosstabview (\crosstabview). ExecCrosstab + // ExecChart indicates execution using chart (\chart). + ExecChart // ExecWatch indicates repeated execution with a fixed time interval. ExecWatch ) diff --git a/rline/rline.go b/rline/rline.go index 0bb155d3602..334df4c8fd0 100644 --- a/rline/rline.go +++ b/rline/rline.go @@ -7,7 +7,6 @@ import ( "os" "github.com/gohxs/readline" - isatty "github.com/mattn/go-isatty" ) var ( @@ -130,10 +129,7 @@ func (l *Rline) SetOutput(f func(string) string) { } // New creates a new readline input/output handler. -func New(forceNonInteractive bool, out, histfile string) (IO, error) { - // determine if interactive - interactive := isatty.IsTerminal(os.Stdout.Fd()) && isatty.IsTerminal(os.Stdin.Fd()) - cygwin := isatty.IsCygwinTerminal(os.Stdout.Fd()) && isatty.IsCygwinTerminal(os.Stdin.Fd()) +func New(interactive, cygwin, forceNonInteractive bool, out, histfile string) (IO, error) { var closers []func() error // configure stdin var stdin io.ReadCloser diff --git a/run.go b/run.go new file mode 100644 index 00000000000..a6a8472b029 --- /dev/null +++ b/run.go @@ -0,0 +1,560 @@ +package main + +import ( + "context" + "errors" + "fmt" + "io" + "os" + "os/user" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/memfs" + "github.com/go-git/go-billy/v5/osfs" + "github.com/mattn/go-isatty" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/spf13/viper" + "github.com/xo/dburl" + "github.com/xo/usql/env" + "github.com/xo/usql/handler" + "github.com/xo/usql/metacmd" + "github.com/xo/usql/rline" + "github.com/xo/usql/text" +) + +// ContextExecutor is the command context. +type ContextExecutor interface { + ExecuteContext(context.Context) error +} + +// New builds the command context. +func New(cliargs []string) ContextExecutor { + args := &Args{} + var ( + bashCompletion bool + zshCompletion bool + fishCompletion bool + powershellCompletion bool + noDescriptions bool + badHelp bool + ) + v := viper.New() + c := &cobra.Command{ + Use: text.CommandName + " [flags]... [DSN]", + Short: text.Short(), + Version: text.CommandVersion, + SilenceErrors: true, + SilenceUsage: true, + DisableAutoGenTag: true, + DisableSuggestions: true, + Args: func(_ *cobra.Command, cliargs []string) error { + if len(cliargs) > 1 { + return text.ErrWrongNumberOfArguments + } + return nil + }, + PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { + commandUpper := text.CommandUpper() + configFile := strings.TrimSpace(os.Getenv(commandUpper + "_CONFIG")) + cmd.Flags().VisitAll(func(f *pflag.Flag) { + if s := strings.TrimSpace(f.Value.String()); f.Name == "config" && s != "" { + configFile = s + } + }) + if configFile != "" { + v.SetConfigFile(configFile) + } else { + v.SetConfigName(text.ConfigName) + if configDir, err := os.UserConfigDir(); err == nil { + v.AddConfigPath(filepath.Join(configDir, text.CommandName)) + } + } + if err := v.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); !ok { + return err + } + } + v.SetEnvPrefix(commandUpper) + v.AutomaticEnv() + cmd.Flags().VisitAll(func(f *pflag.Flag) { + if f.Name == "config" { + return + } + _ = v.BindEnv(f.Name, commandUpper+"_"+strings.ToUpper(strings.ReplaceAll(f.Name, "-", "_"))) + if !f.Changed && v.IsSet(f.Name) { + _ = cmd.Flags().Set(f.Name, fmt.Sprintf("%v", v.Get(f.Name))) + } + }) + // unhide params + switch { + case bashCompletion, + zshCompletion, + fishCompletion, + powershellCompletion, + cmd.Name() == "__complete": + flags := cmd.Root().Flags() + for _, name := range []string{"no-psqlrc", "no-usqlrc", "var", "variable"} { + flags.Lookup(name).Hidden = false + } + } + return nil + }, + RunE: func(cmd *cobra.Command, cliargs []string) error { + // completions and short circuits + switch { + case bashCompletion: + return cmd.GenBashCompletionV2(os.Stdout, !noDescriptions) + case zshCompletion: + if noDescriptions { + return cmd.GenZshCompletionNoDesc(os.Stdout) + } + return cmd.GenZshCompletion(os.Stdout) + case fishCompletion: + return cmd.GenFishCompletion(os.Stdout, !noDescriptions) + case powershellCompletion: + if noDescriptions { + return cmd.GenPowerShellCompletion(os.Stdout) + } + return cmd.GenPowerShellCompletionWithDesc(os.Stdout) + case badHelp: + return errors.New("unknown shorthand flag: 'h' in -h") + } + // run + if len(cliargs) > 0 { + args.DSN = cliargs[0] + } + // create charts chroot + var err error + if args.Charts, err = chartsFS(v); err != nil { + return err + } + // fmt.Fprintf(os.Stderr, "\n\n%v\n\n", args.Charts) + args.Connections = v.GetStringMap("connections") + args.Init = v.GetString("init") + return Run(cmd.Context(), args) + }, + } + + c.SetVersionTemplate("{{ .Name }} {{ .Version }}\n") + c.SetArgs(cliargs[1:]) + c.SetUsageTemplate(text.UsageTemplate) + + flags := c.Flags() + flags.SortFlags = false + + // completions / short circuits + flags.BoolVar(&bashCompletion, "completion-script-bash", false, "output bash completion script and exit") + flags.BoolVar(&zshCompletion, "completion-script-zsh", false, "output zsh completion script and exit") + flags.BoolVar(&fishCompletion, "completion-script-fish", false, "output fish completion script and exit") + flags.BoolVar(&powershellCompletion, "completion-script-powershell", false, "output powershell completion script and exit") + flags.BoolVar(&noDescriptions, "no-descriptions", false, "disable descriptions in completion scripts") + flags.BoolVarP(&badHelp, "bad-help", "h", false, "bad help") + + // command / file flags + flags.VarP(commandOrFile{args, true}, "command", "c", "run only single command (SQL or internal) and exit") + flags.VarP(commandOrFile{args, false}, "file", "f", "execute commands from file and exit") + + // general flags + flags.BoolVarP(&args.NoPassword, "no-password", "w", false, "never prompt for password") + flags.BoolVarP(&args.NoInit, "no-init", "X", false, "do not execute initialization scripts (aliases: --no-rc --no-psqlrc --no-usqlrc)") + flags.BoolVar(&args.NoInit, "no-rc", false, "do not read startup file") + flags.BoolVar(&args.NoInit, "no-psqlrc", false, "do not read startup file") + flags.BoolVar(&args.NoInit, "no-usqlrc", false, "do not read startup file") + flags.VarP(filevar{&args.Out}, "out", "o", "output file") + flags.BoolVarP(&args.ForcePassword, "password", "W", false, "force password prompt (should happen automatically)") + flags.BoolVarP(&args.SingleTransaction, "single-transaction", "1", false, "execute as a single transaction (if non-interactive)") + + ss := func(v *[]string, name, short, usage, placeholder string, vals ...string) { + f := flags.VarPF(vs{v, vals, placeholder}, name, short, usage) + if placeholder == "" { + f.DefValue, f.NoOptDefVal = "true", "true" + } + } + // set + ss(&args.Vars, "set", "v", `set variable NAME to VALUE (see \set command, aliases: --var --variable)`, "NAME=VALUE") + ss(&args.Vars, "var", "", "set variable NAME to VALUE", "NAME=VALUE") + ss(&args.Vars, "variable", "", "set variable NAME to VALUE", "NAME=VALUE") + // cset + ss(&args.Cvars, "cset", "N", `set named connection NAME to DSN (see \cset command)`, "NAME=DSN") + // pset + ss(&args.Pvars, "pset", "P", `set printing option VAR to ARG (see \pset command)`, "VAR=ARG") + // pset flags + ss(&args.Pvars, "field-separator", "F", `field separator for unaligned and CSV output (default "|" and ",")`, "FIELD-SEPARATOR", "fieldsep=%q", "csv_fieldsep=%q") + ss(&args.Pvars, "record-separator", "R", `record separator for unaligned and CSV output (default \n)`, "RECORD-SEPARATOR", "recordsep=%q") + ss(&args.Pvars, "table-attr", "T", "set HTML table tag attributes (e.g., width, border)", "TABLE-ATTR", "tableattr=%q") + // pset bools + ss(&args.Pvars, "no-align", "A", "unaligned table output mode", "", "format=unaligned") + ss(&args.Pvars, "html", "H", "HTML table output mode", "", "format=html") + ss(&args.Pvars, "tuples-only", "t", "print rows only", "", "tuples_only=on") + ss(&args.Pvars, "expanded", "x", "turn on expanded table output", "", "expanded=on") + ss(&args.Pvars, "field-separator-zero", "z", "set field separator for unaligned and CSV output to zero byte", "", "fieldsep_zero=on") + ss(&args.Pvars, "record-separator-zero", "0", "set record separator for unaligned and CSV output to zero byte", "", "recordsep_zero=on") + ss(&args.Pvars, "json", "J", "JSON output mode", "", "format=json") + ss(&args.Pvars, "csv", "C", "CSV output mode", "", "format=csv") + ss(&args.Pvars, "vertical", "G", "vertical output mode", "", "format=vertical") + // set bools + ss(&args.Vars, "quiet", "q", "run quietly (no messages, only query output)", "", "QUIET=on") + + // app config + _ = flags.StringP("config", "", "", "config file") + + // manually set --version, see github.com/spf13/cobra/command.go + _ = flags.BoolP("version", "V", false, "output version information, then exit") + _ = flags.SetAnnotation("version", cobra.FlagSetByCobraAnnotation, []string{"true"}) + + // manually set --help, see github.com/spf13/cobra/command.go + _ = flags.BoolP("help", "?", false, "show this help, then exit") + _ = c.Flags().SetAnnotation("help", cobra.FlagSetByCobraAnnotation, []string{"true"}) + + // mark hidden + for _, name := range []string{ + "no-rc", "no-psqlrc", "no-usqlrc", "var", "variable", + "completion-script-bash", "completion-script-zsh", "completion-script-fish", + "completion-script-powershell", "no-descriptions", + "bad-help", + } { + flags.Lookup(name).Hidden = true + } + + // expose to metacmd + metacmd.Usage = func(w io.Writer, banner bool) { + s := c.UsageString() + if banner { + s = text.Short() + "\n\n" + s + } + _, _ = w.Write([]byte(s)) + } + return c +} + +// Run runs the application. +func Run(ctx context.Context, args *Args) error { + // get user + u, err := user.Current() + if err != nil { + return err + } + // get working directory + wd, err := os.Getwd() + if err != nil { + return err + } + + // determine if interactive + interactive := isatty.IsTerminal(os.Stdout.Fd()) && isatty.IsTerminal(os.Stdin.Fd()) + cygwin := isatty.IsCygwinTerminal(os.Stdout.Fd()) && isatty.IsCygwinTerminal(os.Stdin.Fd()) + forceNonInteractive := len(args.CommandOrFiles) != 0 + + // enable term graphics + if !forceNonInteractive && interactive && !cygwin { + // NOTE: this is done here and not in the env.init() package, because + // NOTE: we need to determine if it is interactive first, otherwise it + // NOTE: could mess up the non-interactive output with control characters + var typ string + if s, _ := env.Getenv(text.CommandUpper()+"_TERM_GRAPHICS", "TERM_GRAPHICS"); s != "" { + typ = s + } + if err := env.Set("TERM_GRAPHICS", typ); err != nil { + return err + } + } + + // configured named connections + for name, v := range args.Connections { + if err := setConn(name, v); err != nil && !forceNonInteractive && interactive { + fmt.Fprintln(os.Stderr, fmt.Sprintf(text.InvalidNamedConnection, name, err)) + } + } + + // fmt.Fprintf(os.Stdout, "VARS: %v\nCVARS: %v\nPVARS: %v\n", args.Vars, args.Cvars, args.Pvars) + + // set vars + for _, v := range args.Vars { + if i := strings.Index(v, "="); i != -1 { + _ = env.Set(v[:i], v[i+1:]) + } else { + _ = env.Unset(v) + } + } + // set cvars + for _, v := range args.Cvars { + if i := strings.Index(v, "="); i != -1 { + s := v[i+1:] + if c := s[0]; c == '\'' || c == '"' { + if s, err = env.Dequote(s, c); err != nil { + return err + } + } + if err = env.Cset(v[:i], s); err != nil { + return err + } + } else { + if err = env.Cset(v, ""); err != nil { + return err + } + } + } + // set pvars + for _, v := range args.Pvars { + if i := strings.Index(v, "="); i != -1 { + s := v[i+1:] + if c := s[0]; c == '\'' || c == '"' { + if s, err = env.Dequote(s, c); err != nil { + return err + } + } + if _, err = env.Pset(v[:i], s); err != nil { + return err + } + } else { + if _, err = env.Ptoggle(v, ""); err != nil { + return err + } + } + } + // create input/output + l, err := rline.New(interactive, cygwin, forceNonInteractive, args.Out, env.HistoryFile(u)) + if err != nil { + return err + } + defer l.Close() + // create handler + h := handler.New(l, u, wd, args.Charts, args.NoPassword) + // force password + dsn := args.DSN + if args.ForcePassword { + if dsn, err = h.Password(dsn); err != nil { + return err + } + } + // open dsn + if err = h.Open(ctx, dsn); err != nil { + return err + } + // start transaction + if args.SingleTransaction { + if h.IO().Interactive() { + return text.ErrSingleTransactionCannotBeUsedWithInteractiveMode + } + if err = h.BeginTx(ctx, nil); err != nil { + return err + } + } + // init script + if !args.NoInit { + // rc file + if rc := env.RCFile(u); rc != "" { + if err = h.Include(rc, false); err != nil && err != text.ErrNoSuchFileOrDirectory { + return err + } + } + if s := strings.TrimSpace(args.Init); s != "" { + h.Reset([]rune(s + "\n")) + } + } + // setup runner + f := h.Run + if len(args.CommandOrFiles) != 0 { + f = runCommandOrFiles(h, args.CommandOrFiles) + } + // run + if err = f(); err != nil { + return err + } + // commit + if args.SingleTransaction { + return h.Commit() + } + return nil +} + +// Args are the command line arguments. +type Args struct { + DSN string + CommandOrFiles []CommandOrFile + Out string + ForcePassword bool + NoPassword bool + NoInit bool + SingleTransaction bool + Vars []string + Cvars []string + Pvars []string + Charts billy.Filesystem + Connections map[string]interface{} + Init string +} + +// CommandOrFile is a special type to deal with interspersed -c, -f, +// command-line options, to ensure proper order execution. +type CommandOrFile struct { + Command bool + Value string +} + +// commandOrFile provides a [pflag.Value] to wrap the command or file value in +// [Args]. +type commandOrFile struct { + args *Args + command bool +} + +// Set satisfies the [pflag.Value] interface. +func (c commandOrFile) Set(value string) error { + c.args.CommandOrFiles = append(c.args.CommandOrFiles, CommandOrFile{ + Command: c.command, + Value: value, + }) + return nil +} + +// String satisfies the [pflag.Value] interface. +func (c commandOrFile) String() string { + return "" +} + +// Type satisfies the [pflag.Value] interface. +func (c commandOrFile) Type() string { + if c.command { + return "COMMAND" + } + return "FILE" +} + +// vs handles setting vars with predefined values. +type vs struct { + vars *[]string + vals []string + typ string +} + +// Set satisfies the [pflag.Value] interface. +func (p vs) Set(value string) error { + if len(p.vals) != 0 { + for _, v := range p.vals { + if strings.Contains(v, "%") { + *p.vars = append(*p.vars, fmt.Sprintf(v, value)) + } else { + *p.vars = append(*p.vars, v) + } + } + } else { + *p.vars = append(*p.vars, value) + } + return nil +} + +// String satisfies the [pflag.Value] interface. +func (vs) String() string { + return "" +} + +// Type satisfies the [pflag.Value] interface. +func (p vs) Type() string { + if p.typ == "" { + return "bool" + } + return p.typ +} + +// filevar is a file var. +type filevar struct { + v *string +} + +// Set satisfies the [pflag.Value] interface. +func (p filevar) Set(value string) error { + *p.v = value + return nil +} + +// String satisfies the [pflag.Value] interface. +func (filevar) String() string { + return "" +} + +// Type satisfies the [pflag.Value] interface. +func (filevar) Type() string { + return "FILE" +} + +// chartsFS creates a filesystem for charts. +func chartsFS(v *viper.Viper) (billy.Filesystem, error) { + var configDir string + if s := v.ConfigFileUsed(); s != "" { + configDir = filepath.Dir(s) + } else { + var err error + if configDir, err = os.UserConfigDir(); err != nil { + return nil, err + } + configDir = filepath.Join(configDir, text.CommandName) + } + chartsPath := "charts" + if s := v.GetString("charts_path"); s != "" { + chartsPath = s + } + fs := osfs.New(configDir, osfs.WithBoundOS()) + switch fi, err := fs.Stat(chartsPath); { + case err != nil && os.IsNotExist(err) && chartsPath == "charts": + return memfs.New(), nil + case err != nil && os.IsNotExist(err): + fmt.Fprintln(os.Stderr, fmt.Sprintf(text.ChartsPathDoesNotExist, chartsPath)) + return memfs.New(), nil + case err != nil: + return nil, err + case !fi.IsDir(): + fmt.Fprintln(os.Stderr, fmt.Sprintf(text.ChartsPathIsNotADirectory, chartsPath)) + return memfs.New(), nil + } + return fs.Chroot(chartsPath) +} + +// setConn sets a named connection. +func setConn(name string, v interface{}) error { + switch x := v.(type) { + case string: + return env.Cset(name, x) + case []interface{}: + return env.Cset(name, convSlice(x)...) + case map[string]interface{}: + urlstr, err := dburl.BuildURL(x) + if err != nil { + return err + } + return env.Cset(name, urlstr) + } + return text.ErrInvalidConfig +} + +// runCommandOrFiles processes all the supplied commands or files. +func runCommandOrFiles(h *handler.Handler, commandsOrFiles []CommandOrFile) func() error { + return func() error { + for _, c := range commandsOrFiles { + h.SetSingleLineMode(c.Command) + if c.Command { + h.Reset([]rune(c.Value)) + if err := h.Run(); err != nil { + return err + } + } else { + if err := h.Include(c.Value, false); err != nil { + return err + } + } + } + return nil + } +} + +// convSlice converts a generic slice to a string slice. +func convSlice(v []interface{}) []string { + s := make([]string, len(v)) + for i, x := range v { + s[i] = fmt.Sprintf("%s", x) + } + return s +} diff --git a/stmt/stmt.go b/stmt/stmt.go index bee209ebb99..87006644de2 100644 --- a/stmt/stmt.go +++ b/stmt/stmt.go @@ -220,7 +220,7 @@ parse: case c == '\'' || c == '"': b.quote = c // start of dollar quoted string literal (postgres) - case b.allowDollar && c == '$': + case b.allowDollar && c == '$' && (next == '$' || next == '_' || unicode.IsLetter(next)): var id string id, i, ok = readDollarAndTag(b.r, i, b.rlen) if ok { diff --git a/stmt/stmt_test.go b/stmt/stmt_test.go index 731c8a5fa89..8ab9c1adfd6 100644 --- a/stmt/stmt_test.go +++ b/stmt/stmt_test.go @@ -184,6 +184,10 @@ func TestNextResetState(t *testing.T) { {`select 1\g '\g `, []string{`select 1`}, []string{`\g| '\g `}, "=", nil}, {`select 1\g "\g `, []string{`select 1`}, []string{`\g| "\g `}, "=", nil}, {"select 1\\g `\\g ", []string{`select 1`}, []string{"\\g| `\\g "}, "=", nil}, + {"select $$\\g$$\\g", []string{`select $$\g$$`}, []string{`\g|`}, "=", nil}, + {"select $1\\bind a b c\\g", []string{`select $1`}, []string{`\bind| a b c`, `\g|`}, "=", nil}, + {"select $1 \\bind a b c \\g", []string{`select $1 `}, []string{`\bind| a b c `, `\g|`}, "=", nil}, + {"select $2, $a$ foo $a$, $1 \\bind a b \\g", []string{`select $2, $a$ foo $a$, $1 `}, []string{`\bind| a b `, `\g|`}, "=", nil}, } for i, test := range tests { b := New(sp(test.s, "\n"), WithAllowDollar(true), WithAllowMultilineComments(true), WithAllowCComments(true)) diff --git a/testcli.go b/testcli.go index 9ac0721eeb6..6900afa24d5 100644 --- a/testcli.go +++ b/testcli.go @@ -70,43 +70,43 @@ func cliTests() ([]Test, error) { { "complex/postgres", "./contrib/postgres/test.sql", - []string{"pgsql://postgres:P4ssw0rd@localhost", "--pset=pager=off"}, + []string{"pgsql://postgres:P4ssw0rd@localhost", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "complex/mysql", "./contrib/mysql/test.sql", - []string{"my://root:P4ssw0rd@localhost", "--pset=pager=off"}, + []string{"my://root:P4ssw0rd@localhost", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "complex/sqlite3", "./contrib/sqlite3/test.sql", - []string{"sqlite:./testdata/sqlite3_test.db", "--pset=pager=off"}, + []string{"sqlite:./testdata/sqlite3_test.db", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "complex/moderncsqlite", "./contrib/sqlite3/test.sql", - []string{"mq:./testdata/moderncsqlite_test.db", "--pset=pager=off"}, + []string{"mq:./testdata/moderncsqlite_test.db", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "complex/sqlserver", "./contrib/sqlserver/test.sql", - []string{"sqlserver://sa:Adm1nP@ssw0rd@localhost/", "--pset=pager=off"}, + []string{"sqlserver://sa:Adm1nP@ssw0rd@localhost/", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "complex/cassandra", "./contrib/cassandra/test.sql", - []string{"ca://cassandra:cassandra@localhost", "--pset=pager=off"}, + []string{"ca://cassandra:cassandra@localhost", "--set=PAGER=''", "--pset=pager=off"}, env, }, { "copy/a_bit_of_everything", "./testdata/copy.sql", - []string{"--pset=pager=off"}, + []string{"--set=PAGER=''", "--pset=pager=off"}, env, }, }, nil @@ -139,7 +139,6 @@ func (test Test) do(ctx context.Context, binpath string, timeout time.Duration) defer exp.Close() return err } - return exp.Close() } type noopWriteCloser struct { diff --git a/testdata/numbers.sql b/testdata/numbers.sql new file mode 100644 index 00000000000..23a679df285 --- /dev/null +++ b/testdata/numbers.sql @@ -0,0 +1,4 @@ +select '1251258098.1555901285'::numeric; +select '1251258098.1555901285'::float4; +select '1251258098.1555901285'::float8; +select '1251258098.1555901285'::double precision; diff --git a/text/errors.go b/text/errors.go index 519b0203e41..832917064c5 100644 --- a/text/errors.go +++ b/text/errors.go @@ -55,6 +55,12 @@ var ( ErrInvalidFormatLineStyle = errors.New(`\pset: allowed line styles are ascii, old-ascii, unicode`) // ErrInvalidFormatBorderLineStyle is the invalid format border line style error. ErrInvalidFormatBorderLineStyle = errors.New(`\pset: allowed Unicode border line styles are single, double`) + // ErrInvalidTimezoneLocation is the invalid timezone location error. + ErrInvalidTimezoneLocation = errors.New(`\pset: invalid timezone location`) + // ErrGraphicsNotSupported is the graphics not supported error. + ErrGraphicsNotSupported = errors.New(`\chart: graphics not supported in terminal`) + // ErrNoNumericColumns is the no numeric columns error. + ErrNoNumericColumns = errors.New(`\chart: no numeric columns found`) // ErrInvalidQuotedString is the invalid quoted string error. ErrInvalidQuotedString = errors.New(`invalid quoted string`) // ErrInvalidFormatOption is the invalid format option error. @@ -71,4 +77,8 @@ var ( ErrWrongNumberOfArguments = errors.New("wrong number of arguments") // ErrUnknownFileType is the unknown file type error. ErrUnknownFileType = errors.New("unknown file type") + // ErrNamedConnectionIsNotAURL is the named connection is not a url error. + ErrNamedConnectionIsNotAURL = errors.New("named connection is not a url") + // ErrInvalidConfig is the invalid config error. + ErrInvalidConfig = errors.New("invalid config") ) diff --git a/text/license.go b/text/license.go index b412d3bed3b..b0c6c2ba704 100644 --- a/text/license.go +++ b/text/license.go @@ -5,7 +5,7 @@ package text // License contains the license text for usql. const License = `The MIT License (MIT) -Copyright (c) 2016-2023 Kenneth Shaw +Copyright (c) 2016-2024 Kenneth Shaw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/text/logo.png b/text/logo.png new file mode 100644 index 00000000000..b9c9fb22dd9 Binary files /dev/null and b/text/logo.png differ diff --git a/text/text.go b/text/text.go index c60eae3eaf3..59154f25b84 100644 --- a/text/text.go +++ b/text/text.go @@ -3,6 +3,10 @@ package text import ( + "bytes" + _ "embed" + "image" + "image/png" "regexp" "strings" ) @@ -12,7 +16,9 @@ var ( CommandName = `usql` CommandVersion = `0.0.0-dev` PassfileName = CommandName + `pass` + ConfigName = "config" Banner = `the universal command-line interface for SQL databases` + CommandHelpHint = `hint: try "` + CommandName + ` --help" for more information.` NotConnected = `(not connected)` HelpPrefix = `help` QuitPrefix = `quit` @@ -34,6 +40,7 @@ var ( ConfirmPassword = `Confirm password: ` PasswordChangeFailed = `\password for %q failed: %v` CouldNotSetVariable = `could not set variable %q` + ChartParseFailed = `\chart: invalid argument for %q: %v` // PasswordChangeSucceeded = `\password succeeded for %q` HelpDesc string HelpDescShort = `Use \? for help or press control-C to clear the input buffer.` @@ -79,15 +86,40 @@ var ( `tableattr`: `Table attributes unset.`, `title`: `Title is unset.`, } - TimingSet = `Timing is %s.` - TimingDesc = `Time: %0.3f ms` - InvalidValue = `invalid -%s value %q: %s` - NotSupportedByDriver = `%s not supported by %s driver` - RelationNotFound = `Did not find any relation named "%s".` - InvalidOption = `invalid option %q` - NotificationReceived = `Asynchronous notification %q %sreceived from server process with PID %d.` - NotificationPayload = `with payload %q ` - UnknownShortAlias = `(unk)` + TimingSet = `Timing is %s.` + TimingDesc = `Time: %0.3f ms` + InvalidValue = `invalid -%s value %q: %s` + NotSupportedByDriver = `%s not supported by %s driver` + RelationNotFound = `Did not find any relation named "%s".` + InvalidOption = `invalid option %q` + NotificationReceived = `Asynchronous notification %q %sreceived from server process with PID %d.` + NotificationPayload = `with payload %q ` + UnknownShortAlias = `(unk)` + InvalidNamedConnection = `warning: named connection %q was not defined: %v` + ChartsPathDoesNotExist = `warning: charts_path %q does not exist` + ChartsPathIsNotADirectory = `warning: charts_path %q is not a directory` + UsageTemplate = `Usage: + {{.UseLine}} + +Arguments: + DSN database url or connection name + +Flags: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}} +` + ChartUsage = `\chart: create and display charts from SQL data +usage: \chart [opts] + +available options: + +help +title [title] chart title +subtitle [subtitle] chart subtitle +size NxN chart size (width x height) +bg [color] chart background color +type [bar|line] chart type +prec [num] data decimal precision +file [path] write chart to file (svg)` ) func init() { @@ -118,18 +150,22 @@ var CommandUpper = func() string { return strings.ToUpper(Command()) } -// UsageTemplate returns the usage template. -var UsageTemplate = func() string { - n := CommandLower() - return n + `, ` + Banner + ` +// Short returns the command name and banner. +var Short = func() string { + return Command() + ", " + Banner +} -Usage: - ` + n + ` [OPTIONS]... [DSN] +// Logo is the logo. +var Logo image.Image -Arguments: - DSN database url +// LogoPng is the embedded logo. +// +//go:embed logo.png +var LogoPng []byte -{{if .Context.Flags}}\ -Options: -{{.Context.Flags|FlagsToTwoColumns|FormatTwoColumns}}{{end}}` +func init() { + var err error + if Logo, err = png.Decode(bytes.NewReader(LogoPng)); err != nil { + panic(err) + } }