Android API Diff
gkd-kit/gkd
Looks up Android framework Java and AIDL APIs across versions with the android-api-diff CLI: signatures, availability, source files and hidden-API access code.
Rules and reliable local tests for keeping Campfire's foss flavor F-Droid-compatible — a clean source scan (using scandelete, never scanignore) and a byte-for-byte reproducible build.
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install r0adkll/Campfire fdroid-reproducible-foss --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .claude/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .claude/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-fossType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install r0adkll/Campfire fdroid-reproducible-foss --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .agents/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .agents/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install r0adkll/Campfire fdroid-reproducible-foss --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .cursor/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .cursor/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/r0adkll/Campfire.git --path .claude/skills/fdroid-reproducible-foss--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install r0adkll/Campfire fdroid-reproducible-foss --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .gemini/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .gemini/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install r0adkll/Campfire fdroid-reproducible-fossInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .github/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .github/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install r0adkll/Campfire fdroid-reproducible-foss --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/r0adkll/Campfire.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/fdroid-reproducible-foss .opencode/skills/fdroid-reproducible-foss && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fdroid-reproducible-foss" agent skill from https://github.com/r0adkll/Campfire/tree/main/.claude/skills/fdroid-reproducible-foss into .opencode/skills/fdroid-reproducible-foss/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fdroid-reproducible-foss", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fdroid-reproducible-fossRules and reliable local tests for keeping Campfire's foss flavor F-Droid-compatible — a clean source scan (using scandelete, never scanignore) and a byte-for-byte reproducible build.
Fdroid Reproducible Foss is an agent skill from r0adkll/Campfire. Rules and reliable local tests for keeping Campfire's foss flavor F-Droid-compatible — a clean source scan (using scandelete, never scanignore) and a byte-for-byte reproducible build. Trigger when editing the fdroiddata metadata; adding, removing, or moving a proprietary dependency / Gradle plugin / custom Maven repository; changing anything the foss flavor builds (app/android, gradle/build-logic, settings.gradle.kts, baseline profiles, R8/ProGuard); cutting a release F-Droid mirrors; or when asked to "check the…
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `scan-source.sh`).
It sits in Mobile, covering Reproducible research. It works with Gradle and Android. The repository describes itself as: A KMP Compose app for Audiobookshelf. The licence is GPL-3.0.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8348ab0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Shell), which the agent can run.
Shell commands in SKILL.md call:
gitapt-getdockercurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
gitlab.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fdroid Reproducible Foss loads about 2.7k tokens when it runs. Until then it costs about 154 tokens; SKILL.md has 1,062 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from r0adkll/Campfire at commit 8348ab0, republished under its GPL-3.0 licence (© r0adkll). 1,062 words, ~2,673 tokens.
.claude/skills/fdroid-reproducible-foss/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.foss flavorTwo independent hard requirements. Both must hold or the fdroiddata pipeline goes red:
scandelete has run. Maintainers disallow scanignore (F-Droid docs: it is only "where there is a very good reason"); the sanctioned mechanism is scandelete, which deletes files not needed by the build before scanning.assembleFossRelease from the release tag and it must match our published campfire-foss-release.apk exactly, so F-Droid ships our-signed APK (AllowedAPKSigningKeys).The MR: https://gitlab.com/fdroid/fdroiddata/-/merge_requests/46619 (metadata metadata/app.campfire.android.yml).
standard* / alpha* / beta* configurations only — never foss* (see app/android/build.gradle.kts). If you add a proprietary integration, follow the same pattern, and put its build files where F-Droid can scandelete them (see below)..gradle/.gradle.kts. The scanner flags any maven(...) / maven { url … } call whose URL isn't on F-Droid's allow-list — and it captures whatever is inside the parens, so even maven(someVariable) is flagged as unknown maven repo 'someVariable)'. Reading the URL from a property does not help. Custom repos must live in a scandelete-able standalone script (see the emulator.wtf pattern).Project.normalizeFossReleasePgMapId() (in gradle/build-logic/convention/.../Reproducible.kt), called from app/android/build.gradle.kts — zeroes R8's pg-map-id in the foss DEX (the one thing that varied per build environment).baselineProfile { variants { create("foss") { dexLayoutOptimization = false } } } in app/android/build.gradle.kts — keeps the baseline profile but drops the non-deterministic startup DEX layout for foss only.campfire.version / campfire.versionCode stay in lockstep (MMmmppRR, asserted by verifyVersionCode + scripts/release). F-Droid's UpdateCheckData reads campfire.versionCode from gradle.properties on the tag.Source: fdroidserver/scanner.py, scan_source(). F-Droid CI runs fdroidserver master (installed from the tarball on debian:trixie-slim, not pip), so test against master.
.java (DexClassLoader only), .gradle / .gradle.kts (usual-suspects + maven-URL), and binaries (.apk/.jar/.aar/.class/.dex/.so/.zip/.gz/.wasm, extensionless/.bin/.out/.exe, executables). gradle.properties, .kt, .py, and shell scripts are NOT scanned for repos or suspects — confirmed by reading the dispatch and by A/B test.libs.* version-catalog accessors through libs.versions.toml, so libs.firebase.crashlytics.gradlePlugin in a .gradle.kts is flagged even though the coordinate is in the TOML. // comments are ignored; only real implementation(...)-style lines match.scandelete deletes listed paths before the scan runs, so a flagged file that the foss build doesn't need is removed and never scanned. This is why the isolated files below can each carry the flagged content.Firebase's plugins can't sit in build.gradle.kts (root) or gradle/build-logic/convention/build.gradle.kts — those are scanned and can't be deleted. So:
gradle/build-logic/firebase/ (its build.gradle.kts carries libs.firebase.*.gradlePlugin).gradle/build-logic/settings.gradle.kts includes it only if (file("firebase/build.gradle.kts").exists()).convention/build.gradle.kts does runtimeOnly(project(":firebase")) under the same if (file(...).exists()) guard.AndroidApplicationConventionPlugin) via pluginManager.apply("app.campfire.firebase"), guarded by rootProject.file("gradle/build-logic/firebase/build.gradle.kts").exists() — the same presence check, so it is never requested once scandeleted. Don't guard it on google-services.json: the plugin also adds the alpha/beta App Distribution SDK that src/preRelease compiles against, and it already skips the Firebase Gradle plugins itself when that file is missing (fork PRs, local builds).scandeletes gradle/build-logic/firebase/build.gradle.kts → module not included, plugin never applied, build-logic still compiles.Gotcha: legacy apply(plugin = "id") does NOT resolve an included-build plugin — it must be applied from inside a convention plugin (on the build-logic classpath) or via the plugins {} block.
The emulator.wtf Gradle plugin resolves from mavenCentral; only its ew-cli runner is exclusive to maven.emulator.wtf, and only when actually running on emulator.wtf (CI baseline generation) — never a foss/normal build. So:
gradle/emulatorwtf-repo.gradle.kts (a settings script adding it via dependencyResolutionManagement).settings.gradle.kts applies it only if (file("gradle/emulatorwtf-repo.gradle.kts").exists()) — the apply line has no maven call, so it isn't flagged.app/baselineprofile/build.gradle.kts sets emulatorwtf { repositoryCheckEnabled.set(rootProject.file("gradle/emulatorwtf-repo.gradle.kts").exists()) } (extension name is lowercase emulatorwtf).scandeletes gradle/emulatorwtf-repo.gradle.kts → deleted before scan (0 errors), apply skipped, repo check off. Any real emulator.wtf use just needs the file present — no extra flags.Use this same shape for any future third-party repo that only serves build/test tooling.
Commit your changes first (the scanner test archives a git ref). Then:
.claude/skills/fdroid-reproducible-foss/scan-source.sh # scans HEAD
.claude/skills/fdroid-reproducible-foss/scan-source.sh <git-ref> # scans a refIt exports the ref, applies the same scandelete list the metadata declares, runs fdroidserver master scan_source() in Docker, and prints SCAN COUNT + each error. Must be 0. Keep the script's SCANDELETE list identical to the metadata's scandelete: block.
git worktree add --detach /tmp/fdsim <git-ref>
cd /tmp/fdsim && rm <the scandelete files> # + ensure no app/android/google-services.json
./gradlew :app:android:assembleFossRelease --dry-run --console=plain # expect BUILD SUCCESSFUL
cd - && git worktree remove --force /tmp/fdsim(Use a worktree, not git archive | tar — the latter drops the gradlew exec bit and munges permissions.)
The pg-map-id in the published campfire-foss-release.apk must be all-zeros:
unzip -p campfire-foss-release.apk classes.dex | grep -a -o '"pg-map-id":"[0-9a-f]*"' | head
# expect "pg-map-id":"0000…0000"After F-Droid's pipeline runs, the fdroid build job log should say "compared built binary to supplied reference binary successfully". If it differs, pull the job log and diffoscope our APK against F-Droid's …_<versionCode>.binary.apk artifact to find the delta.
scandelete: list in sync with scan-source.sh (currently 6 files; see scandelete-metadata-companion.yml in the session scratchpad for the canonical block).versionName / versionCode / commit to the release tag; AllowedAPKSigningKeys stays 4a3be90f…; keep Binaries, AutoUpdateMode: Version, UpdateCheckMode: Tags, UpdateCheckData.rewritemeta/lint will reformat differently than your local pip install:docker run --rm -v "$PWD":/repo -w /repo debian:trixie-slim bash -c '
apt-get update -qq && apt-get install -qy --no-install-recommends fdroidserver curl ca-certificates git python3-yaml
mkdir /fds && curl -s https://gitlab.com/fdroid/fdroidserver/-/archive/master/fdroidserver-master.tar.gz | tar -xz -C /fds --strip-components=1
export PATH=/fds:$PATH PYTHONPATH=/fds:/fds/examples
fdroid rewritemeta app.campfire.android && fdroid lint app.campfire.android'Co-Authored-By trailer on fdroiddata commits (they must appear to come from the user's account alone). Commit signing uses 1Password SSH; if it errors with failed to fill whole buffer, ask the user to unlock 1Password and retry.handleproblem in the scanner is silent when common.get_options() is None (no log, no JSON) but still increments the count. To surface which file/message counts, pass json_per_build=scanner.MessageStore() and set common.options (see scan-source.sh).central.sonatype.com snapshot repos in settings.gradle.kts are gated behind campfire.config.enableSnapshots and are on F-Droid's allow-list, so they don't count.// lines and only matches real dependency/maven(...) calls.dexLayoutOptimization for foss.© r0adkll, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/fdroid-reproducible-foss of r0adkll/Campfire.
Open the folder on GitHubat commit 8348ab0
Fdroid Reproducible Foss next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fdroid Reproducible Foss this skillr0adkll/Campfire | 141 | — | ~2.7k | Automated safety check: Pass | GPL-3.0 | |
| Android API Diffgkd-kit/gkd | 43k | — | ~796 | Automated safety check: Pass | GPL-3.0 | |
| Android Developmentdpconde/claude-android-skill | 336 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Run Jetpack Android Appwordpress-mobile/WordPress-Android | 3.2k | — | ~886 | Automated safety check: Pass | GPL-2.0 | |
| Orca Android Emulator Controlstablyai/orca | 89k | — | ~558 | Automated safety check: Pass | Apache-2.0 | |
| Claude Android NinjaDrjacky/claude-android-ninja | 124 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 |
gkd-kit/gkd
Looks up Android framework Java and AIDL APIs across versions with the android-api-diff CLI: signatures, availability, source files and hidden-API access code.
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
wordpress-mobile/WordPress-Android
Builds the Jetpack debug app with Gradle and installs it on a connected Android device or an emulator started from an available AVD.
stablyai/orca
Android device and emulator control from inside Orca over adb, with the live device view in Orca's emulator pane. Use when driving an adb-connected emulator…
Drjacky/claude-android-ninja
Build and migrate Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), Navigation3, and multi-module Gradle.
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
r0adkll/Campfire
Open, describe, and maintain pull requests in Campfire, especially stacks of dependent PRs (each branch built on the one before).
r0adkll/Campfire
Enforce the Compose guideline that every @Composable function must declare modifier: Modifier = Modifier as its first optional parameter and apply it to the root layout.
r0adkll/Campfire
Extract hardcoded user-facing string literals from a Jetpack Compose / Compose Multiplatform file into the owning module's composeResources/values/<modulestrings.xml, then replace each call site…
r0adkll/Campfire
Enforce the Campfire IconButton accessibility convention — every IconButton (and its derivatives) must be wrapped with IconButtonTooltip and given a localized action label.
r0adkll/Campfire
Enforce the Campfire pattern for feature modules to react to Audiobookshelf socket events.
r0adkll/Campfire
Campfire Compose UI conventions. An agent skill from r0adkll/Campfire.
Categories
Rules and reliable local tests for keeping Campfire's foss flavor F-Droid-compatible — a clean source scan (using scandelete, never scanignore) and a byte-for-byte reproducible build. Fdroid Reproducible Foss is an agent skill from r0adkll/Campfire. Rules and reliable local tests for keeping Campfire's foss flavor F-Droid-compatible — a clean source scan (using scandelete, never scanignore) and a byte-for-byte reproducible build.
Fdroid Reproducible Foss fits situations like: editing the fdroiddata metadata; moving a proprietary dependency / Gradle plugin / custom Maven repository; changing anything the foss flavor builds (app/android; gradle/build-logic.
Run `npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a claude-code`. Or copy the skill folder (.claude/skills/fdroid-reproducible-foss in r0adkll/Campfire) into .claude/skills/fdroid-reproducible-foss in your project. Claude Code loads it when a task matches its description.
Run `npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a codex`. Or copy the skill folder (.claude/skills/fdroid-reproducible-foss in r0adkll/Campfire) into .agents/skills/fdroid-reproducible-foss in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add r0adkll/Campfire --skill fdroid-reproducible-foss -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fdroid-reproducible-foss, .gemini/skills/fdroid-reproducible-foss, .github/skills/fdroid-reproducible-foss and .opencode/skills/fdroid-reproducible-foss in your project.
Going by SKILL.md and its folder, Fdroid Reproducible Foss needs a shell for the scripts in its folder and the command-line tools its instructions call (git, apt-get, docker and curl). Our summary lists: Python 3; A Bash shell; Docker.
SKILL.md names 1 domain. In commands or code: gitlab.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fdroid Reproducible Foss is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fdroid Reproducible Foss: Android API Diff (gkd-kit/gkd, 43k stars), Android Development (dpconde/claude-android-skill, 336 stars), Run Jetpack Android App (wordpress-mobile/WordPress-Android, 3.2k stars) and Orca Android Emulator Control (stablyai/orca, 89k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
r0adkll (a GitHub user) maintains it in r0adkll/Campfire, which has 141 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 11, 2026.
Source: r0adkll/Campfire on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.