osm-shortlink 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ # shellcheck disable=SC2148
2
+
3
+ use nix
@@ -0,0 +1,2 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -0,0 +1,230 @@
1
+ # This file is autogenerated by maturin v1.7.0
2
+ # To update, run
3
+ #
4
+ # maturin generate-ci github --platform all --zig
5
+ #
6
+ name: CI
7
+
8
+ on:
9
+ push:
10
+ branches:
11
+ - main
12
+ tags:
13
+ - "*"
14
+ pull_request:
15
+ branches:
16
+ - main
17
+
18
+ permissions:
19
+ contents: read
20
+
21
+ jobs:
22
+ test:
23
+ name: Run tests
24
+ runs-on: ${{ matrix.runner }}
25
+ strategy:
26
+ matrix:
27
+ runner:
28
+ - ubuntu-latest
29
+ - macos-latest
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - uses: dtolnay/rust-toolchain@stable
33
+ - uses: cachix/install-nix-action@v27
34
+ with:
35
+ nix_path: nixpkgs=channel:nixpkgs-24.05-darwin
36
+
37
+ - name: Generate cache key
38
+ run: |
39
+ nixpkgs_hash=$(egrep -o 'archive/[0-9a-f]{40}\.tar\.gz' shell.nix | cut -d'/' -f2 | cut -d'.' -f1)
40
+ echo "CACHE_KEY=${{ runner.os }}-$nixpkgs_hash" >> $GITHUB_ENV
41
+
42
+ - name: Cache Nix store
43
+ uses: actions/cache@v4
44
+ id: nix-cache
45
+ with:
46
+ key: nix-${{ env.CACHE_KEY }}
47
+ path: /tmp/nix-cache
48
+
49
+ - name: Import Nix store cache
50
+ if: steps.nix-cache.outputs.cache-hit == 'true'
51
+ run: |
52
+ nix-store --import < /tmp/nix-cache
53
+
54
+ - name: Cache Python packages
55
+ uses: actions/cache@v4
56
+ with:
57
+ key: python-${{ env.CACHE_KEY }}-${{ hashFiles('uv.lock') }}
58
+ path: ~/.cache/uv
59
+
60
+ - name: Install dependencies
61
+ run: |
62
+ nix-shell --run true
63
+
64
+ - name: Export Nix store cache
65
+ if: steps.nix-cache.outputs.cache-hit != 'true'
66
+ run: |
67
+ nix-store --export $(find /nix/store -maxdepth 1 -name '*-*') > /tmp/nix-cache
68
+
69
+ - name: Assert tag name matches version
70
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
71
+ run: |
72
+ nix-shell --pure --run "uv tree 2>&1 | grep -o 'osm-shortlink v.*' | sed 's/osm-shortlink v//' > version.txt"
73
+ version=$(cat version.txt)
74
+ tag_name=${{ github.ref_name }}
75
+ if [ "$version" != "$tag_name" ]; then
76
+ echo "Tag name mismatch: $version != $tag_name"
77
+ exit 1
78
+ fi
79
+
80
+ - name: Run tests
81
+ run: |
82
+ nix-shell --pure --run run-tests
83
+
84
+ linux:
85
+ runs-on: ${{ matrix.platform.runner }}
86
+ if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')"
87
+ needs: test
88
+ strategy:
89
+ matrix:
90
+ platform:
91
+ - runner: ubuntu-latest
92
+ target: x86_64
93
+ - runner: ubuntu-latest
94
+ target: aarch64
95
+ steps:
96
+ - uses: actions/checkout@v4
97
+ - uses: actions/setup-python@v5
98
+ with:
99
+ python-version: 3.x
100
+ - name: Build wheels
101
+ uses: PyO3/maturin-action@v1
102
+ with:
103
+ target: ${{ matrix.platform.target }}
104
+ args: --release --out dist --zig
105
+ sccache: "true"
106
+ manylinux: auto
107
+ - name: Upload wheels
108
+ uses: actions/upload-artifact@v4
109
+ with:
110
+ name: wheels-linux-${{ matrix.platform.target }}
111
+ path: dist
112
+
113
+ musllinux:
114
+ runs-on: ${{ matrix.platform.runner }}
115
+ if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')"
116
+ needs: test
117
+ strategy:
118
+ matrix:
119
+ platform:
120
+ - runner: ubuntu-latest
121
+ target: x86_64
122
+ - runner: ubuntu-latest
123
+ target: aarch64
124
+ steps:
125
+ - uses: actions/checkout@v4
126
+ - uses: actions/setup-python@v5
127
+ with:
128
+ python-version: 3.x
129
+ - name: Build wheels
130
+ uses: PyO3/maturin-action@v1
131
+ with:
132
+ target: ${{ matrix.platform.target }}
133
+ args: --release --out dist
134
+ sccache: "true"
135
+ manylinux: musllinux_1_2
136
+ - name: Upload wheels
137
+ uses: actions/upload-artifact@v4
138
+ with:
139
+ name: wheels-musllinux-${{ matrix.platform.target }}
140
+ path: dist
141
+
142
+ windows:
143
+ runs-on: ${{ matrix.platform.runner }}
144
+ if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')"
145
+ needs: test
146
+ strategy:
147
+ matrix:
148
+ platform:
149
+ - runner: windows-latest
150
+ target: x64
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ - uses: actions/setup-python@v5
154
+ with:
155
+ python-version: 3.x
156
+ architecture: ${{ matrix.platform.target }}
157
+ - name: Build wheels
158
+ uses: PyO3/maturin-action@v1
159
+ with:
160
+ target: ${{ matrix.platform.target }}
161
+ args: --release --out dist
162
+ sccache: "true"
163
+ - name: Upload wheels
164
+ uses: actions/upload-artifact@v4
165
+ with:
166
+ name: wheels-windows-${{ matrix.platform.target }}
167
+ path: dist
168
+
169
+ macos:
170
+ runs-on: ${{ matrix.platform.runner }}
171
+ if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')"
172
+ needs: test
173
+ strategy:
174
+ matrix:
175
+ platform:
176
+ - runner: macos-12
177
+ target: x86_64
178
+ - runner: macos-14
179
+ target: aarch64
180
+ steps:
181
+ - uses: actions/checkout@v4
182
+ - uses: actions/setup-python@v5
183
+ with:
184
+ python-version: 3.x
185
+ - name: Build wheels
186
+ uses: PyO3/maturin-action@v1
187
+ with:
188
+ target: ${{ matrix.platform.target }}
189
+ args: --release --out dist
190
+ sccache: "true"
191
+ - name: Upload wheels
192
+ uses: actions/upload-artifact@v4
193
+ with:
194
+ name: wheels-macos-${{ matrix.platform.target }}
195
+ path: dist
196
+
197
+ sdist:
198
+ runs-on: ubuntu-latest
199
+ needs: test
200
+ steps:
201
+ - uses: actions/checkout@v4
202
+ - name: Build sdist
203
+ uses: PyO3/maturin-action@v1
204
+ with:
205
+ command: sdist
206
+ args: --out dist
207
+ - name: Upload sdist
208
+ uses: actions/upload-artifact@v4
209
+ with:
210
+ name: wheels-sdist
211
+ path: dist
212
+
213
+ release:
214
+ name: Release
215
+ runs-on: ubuntu-latest
216
+ if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')"
217
+ needs: [linux, musllinux, windows, macos, sdist]
218
+ environment:
219
+ name: pypi
220
+ url: https://pypi.org/p/osm-shortlink
221
+ permissions:
222
+ id-token: write
223
+ steps:
224
+ - uses: actions/download-artifact@v4
225
+ with:
226
+ pattern: wheels-*
227
+ path: dist
228
+ merge-multiple: true
229
+ - name: Publish to PyPI
230
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,219 @@
1
+ # Created by https://www.toptal.com/developers/gitignore/api/direnv,python,visualstudiocode,rust
2
+ # Edit at https://www.toptal.com/developers/gitignore?templates=direnv,python,visualstudiocode,rust
3
+
4
+ ### direnv ###
5
+ .direnv
6
+ #.envrc
7
+
8
+ ### Python ###
9
+ # Byte-compiled / optimized / DLL files
10
+ __pycache__/
11
+ *.py[cod]
12
+ *$py.class
13
+
14
+ # C extensions
15
+ *.so
16
+
17
+ # Distribution / packaging
18
+ .Python
19
+ build/
20
+ develop-eggs/
21
+ dist/
22
+ downloads/
23
+ eggs/
24
+ .eggs/
25
+ lib/
26
+ lib64/
27
+ parts/
28
+ sdist/
29
+ var/
30
+ wheels/
31
+ share/python-wheels/
32
+ *.egg-info/
33
+ .installed.cfg
34
+ *.egg
35
+ MANIFEST
36
+
37
+ # PyInstaller
38
+ # Usually these files are written by a python script from a template
39
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
40
+ *.manifest
41
+ *.spec
42
+
43
+ # Installer logs
44
+ pip-log.txt
45
+ pip-delete-this-directory.txt
46
+
47
+ # Unit test / coverage reports
48
+ htmlcov/
49
+ .tox/
50
+ .nox/
51
+ .coverage
52
+ .coverage.*
53
+ .cache
54
+ nosetests.xml
55
+ coverage.xml
56
+ *.cover
57
+ *.py,cover
58
+ .hypothesis/
59
+ .pytest_cache/
60
+ cover/
61
+
62
+ # Translations
63
+ *.mo
64
+ *.pot
65
+
66
+ # Django stuff:
67
+ *.log
68
+ local_settings.py
69
+ db.sqlite3
70
+ db.sqlite3-journal
71
+
72
+ # Flask stuff:
73
+ instance/
74
+ .webassets-cache
75
+
76
+ # Scrapy stuff:
77
+ .scrapy
78
+
79
+ # Sphinx documentation
80
+ docs/_build/
81
+
82
+ # PyBuilder
83
+ .pybuilder/
84
+ target/
85
+
86
+ # Jupyter Notebook
87
+ .ipynb_checkpoints
88
+
89
+ # IPython
90
+ profile_default/
91
+ ipython_config.py
92
+
93
+ # pyenv
94
+ # For a library or package, you might want to ignore these files since the code is
95
+ # intended to run in multiple environments; otherwise, check them in:
96
+ # .python-version
97
+
98
+ # pipenv
99
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
100
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
101
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
102
+ # install all needed dependencies.
103
+ #Pipfile.lock
104
+
105
+ # poetry
106
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
107
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
108
+ # commonly ignored for libraries.
109
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
110
+ #poetry.lock
111
+
112
+ # pdm
113
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
114
+ #pdm.lock
115
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
116
+ # in version control.
117
+ # https://pdm.fming.dev/#use-with-ide
118
+ .pdm.toml
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+
139
+ # Spyder project settings
140
+ .spyderproject
141
+ .spyproject
142
+
143
+ # Rope project settings
144
+ .ropeproject
145
+
146
+ # mkdocs documentation
147
+ /site
148
+
149
+ # mypy
150
+ .mypy_cache/
151
+ .dmypy.json
152
+ dmypy.json
153
+
154
+ # Pyre type checker
155
+ .pyre/
156
+
157
+ # pytype static type analyzer
158
+ .pytype/
159
+
160
+ # Cython debug symbols
161
+ cython_debug/
162
+
163
+ # PyCharm
164
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
165
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
167
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
168
+ #.idea/
169
+
170
+ ### Python Patch ###
171
+ # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
172
+ #poetry.toml
173
+
174
+ # ruff
175
+ .ruff_cache/
176
+
177
+ # LSP config files
178
+ pyrightconfig.json
179
+
180
+ ### Rust ###
181
+ # Generated by Cargo
182
+ # will have compiled files and executables
183
+ debug/
184
+
185
+ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
186
+ # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
187
+ Cargo.lock
188
+
189
+ # These are backup files generated by rustfmt
190
+ **/*.rs.bk
191
+
192
+ # MSVC Windows builds of rustc generate these, which store debugging information
193
+ *.pdb
194
+
195
+ ### VisualStudioCode ###
196
+ .vscode/*
197
+ !.vscode/settings.json
198
+ !.vscode/tasks.json
199
+ !.vscode/launch.json
200
+ !.vscode/extensions.json
201
+ !.vscode/*.code-snippets
202
+
203
+ # Local History for Visual Studio Code
204
+ .history/
205
+
206
+ # Built Visual Studio Code Extensions
207
+ *.vsix
208
+
209
+ ### VisualStudioCode Patch ###
210
+ # Ignore all local history of files
211
+ .history
212
+ .ionide
213
+
214
+ # End of https://www.toptal.com/developers/gitignore/api/direnv,python,visualstudiocode,rust
215
+
216
+ # Python version lock
217
+ .python-version
218
+
219
+ .intentionally-empty-file.*
@@ -0,0 +1,7 @@
1
+ {
2
+ "python.testing.pytestArgs": [
3
+ "tests"
4
+ ],
5
+ "python.testing.unittestEnabled": false,
6
+ "python.testing.pytestEnabled": true
7
+ }
@@ -0,0 +1,171 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 3
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.3.0"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
10
+
11
+ [[package]]
12
+ name = "cfg-if"
13
+ version = "1.0.0"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
16
+
17
+ [[package]]
18
+ name = "heck"
19
+ version = "0.5.0"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
22
+
23
+ [[package]]
24
+ name = "indoc"
25
+ version = "2.0.5"
26
+ source = "registry+https://github.com/rust-lang/crates.io-index"
27
+ checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
28
+
29
+ [[package]]
30
+ name = "libc"
31
+ version = "0.2.158"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
34
+
35
+ [[package]]
36
+ name = "memoffset"
37
+ version = "0.9.1"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
40
+ dependencies = [
41
+ "autocfg",
42
+ ]
43
+
44
+ [[package]]
45
+ name = "once_cell"
46
+ version = "1.19.0"
47
+ source = "registry+https://github.com/rust-lang/crates.io-index"
48
+ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
49
+
50
+ [[package]]
51
+ name = "osm_shortlink"
52
+ version = "1.0.0"
53
+ dependencies = [
54
+ "pyo3",
55
+ ]
56
+
57
+ [[package]]
58
+ name = "portable-atomic"
59
+ version = "1.7.0"
60
+ source = "registry+https://github.com/rust-lang/crates.io-index"
61
+ checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265"
62
+
63
+ [[package]]
64
+ name = "proc-macro2"
65
+ version = "1.0.86"
66
+ source = "registry+https://github.com/rust-lang/crates.io-index"
67
+ checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
68
+ dependencies = [
69
+ "unicode-ident",
70
+ ]
71
+
72
+ [[package]]
73
+ name = "pyo3"
74
+ version = "0.22.2"
75
+ source = "registry+https://github.com/rust-lang/crates.io-index"
76
+ checksum = "831e8e819a138c36e212f3af3fd9eeffed6bf1510a805af35b0edee5ffa59433"
77
+ dependencies = [
78
+ "cfg-if",
79
+ "indoc",
80
+ "libc",
81
+ "memoffset",
82
+ "once_cell",
83
+ "portable-atomic",
84
+ "pyo3-build-config",
85
+ "pyo3-ffi",
86
+ "pyo3-macros",
87
+ "unindent",
88
+ ]
89
+
90
+ [[package]]
91
+ name = "pyo3-build-config"
92
+ version = "0.22.2"
93
+ source = "registry+https://github.com/rust-lang/crates.io-index"
94
+ checksum = "1e8730e591b14492a8945cdff32f089250b05f5accecf74aeddf9e8272ce1fa8"
95
+ dependencies = [
96
+ "once_cell",
97
+ "target-lexicon",
98
+ ]
99
+
100
+ [[package]]
101
+ name = "pyo3-ffi"
102
+ version = "0.22.2"
103
+ source = "registry+https://github.com/rust-lang/crates.io-index"
104
+ checksum = "5e97e919d2df92eb88ca80a037969f44e5e70356559654962cbb3316d00300c6"
105
+ dependencies = [
106
+ "libc",
107
+ "pyo3-build-config",
108
+ ]
109
+
110
+ [[package]]
111
+ name = "pyo3-macros"
112
+ version = "0.22.2"
113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
114
+ checksum = "eb57983022ad41f9e683a599f2fd13c3664d7063a3ac5714cae4b7bee7d3f206"
115
+ dependencies = [
116
+ "proc-macro2",
117
+ "pyo3-macros-backend",
118
+ "quote",
119
+ "syn",
120
+ ]
121
+
122
+ [[package]]
123
+ name = "pyo3-macros-backend"
124
+ version = "0.22.2"
125
+ source = "registry+https://github.com/rust-lang/crates.io-index"
126
+ checksum = "ec480c0c51ddec81019531705acac51bcdbeae563557c982aa8263bb96880372"
127
+ dependencies = [
128
+ "heck",
129
+ "proc-macro2",
130
+ "pyo3-build-config",
131
+ "quote",
132
+ "syn",
133
+ ]
134
+
135
+ [[package]]
136
+ name = "quote"
137
+ version = "1.0.37"
138
+ source = "registry+https://github.com/rust-lang/crates.io-index"
139
+ checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
140
+ dependencies = [
141
+ "proc-macro2",
142
+ ]
143
+
144
+ [[package]]
145
+ name = "syn"
146
+ version = "2.0.77"
147
+ source = "registry+https://github.com/rust-lang/crates.io-index"
148
+ checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
149
+ dependencies = [
150
+ "proc-macro2",
151
+ "quote",
152
+ "unicode-ident",
153
+ ]
154
+
155
+ [[package]]
156
+ name = "target-lexicon"
157
+ version = "0.12.16"
158
+ source = "registry+https://github.com/rust-lang/crates.io-index"
159
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
160
+
161
+ [[package]]
162
+ name = "unicode-ident"
163
+ version = "1.0.12"
164
+ source = "registry+https://github.com/rust-lang/crates.io-index"
165
+ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
166
+
167
+ [[package]]
168
+ name = "unindent"
169
+ version = "0.2.3"
170
+ source = "registry+https://github.com/rust-lang/crates.io-index"
171
+ checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
@@ -0,0 +1,14 @@
1
+ [package]
2
+ edition = "2021"
3
+ name = "osm_shortlink"
4
+ version = "1.0.0"
5
+
6
+ [lib]
7
+ crate-type = ["cdylib"]
8
+ name = "osm_shortlink"
9
+
10
+ [dependencies]
11
+ pyo3 = {version = "0.22.2", features = ["extension-module", "abi3-py38"]}
12
+
13
+ [profile.release]
14
+ overflow-checks = true
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org>