diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..67d2ae55 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "MD013": false +} diff --git a/README.md b/README.md index 0b1bbe78..a7614e4c 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,36 @@ You can follow development on our [Discord server](https://moonlight-stream.org/ * In moonlight-android/, create a file called ‘local.properties’. Add an ‘ndk.dir=’ property to the local.properties file and set it equal to your NDK directory. * Build the APK using Android Studio or gradle +## Building with Nix + +A `flake.nix` provides a reproducible dev environment and a fully hermetic +debug-APK build (Android SDK 34, NDK 27.0.12077973, Gradle, JDK 17). All +commands need `?submodules=1` so the `moonlight-common-c` + `enet` submodule +sources are included in the build. + +```sh +# Dev shell: ANDROID_HOME / ANDROID_NDK_ROOT / JAVA_HOME + gradle, then build by hand +nix develop '.?submodules=1' +./gradlew assembleNonRootDebug + +# Hermetic, offline build of the nonRoot debug APK (output in ./result/) +nix build '.?submodules=1#moonlight-android' +ls result/app-nonRoot-debug.apk +``` + +Maven dependencies are pinned in `deps.json` (a Nixpkgs Gradle mitm-cache +lockfile). Regenerate it after changing dependencies: + +```sh +nix build '.?submodules=1#moonlight-android.mitmCache.updateScript' && ./result +``` + +Notes: +* If your Nix is configured to offload to a remote builder, add `--builders ""` + to build locally instead of copying the multi-GB SDK closure to the remote. +* The build targets the `nonRoot` `debug` variant; it is signed with the + generated Android debug keystore (not a release key). + ## Authors * [Cameron Gutman](https://github.com/cgutman) diff --git a/app/src/main/jni/moonlight-core/moonlight-common-c b/app/src/main/jni/moonlight-core/moonlight-common-c index 8af4562a..5fa7e82c 160000 --- a/app/src/main/jni/moonlight-core/moonlight-common-c +++ b/app/src/main/jni/moonlight-core/moonlight-common-c @@ -1 +1 @@ -Subproject commit 8af4562af672dd6b9ed28553ead172984fd9a683 +Subproject commit 5fa7e82c30818d5e6dd1bf4e4dbc684966ba8886 diff --git a/deps.json b/deps.json new file mode 100644 index 00000000..a118def8 --- /dev/null +++ b/deps.json @@ -0,0 +1,748 @@ +{ + "!comment": "This is a nixpkgs Gradle dependency lockfile. For more details, refer to the Gradle section in the nixpkgs manual.", + "!version": 1, + "https://dl.google.com/dl/android/maven2": { + "androidx/databinding#databinding-common/8.5.1": { + "jar": "sha256-Zsq4JjnawPbCQzRkwJOwdNYIxLuIfsOKm4vErJgSZzI=", + "pom": "sha256-4k+S6bAybR+VBRy5+umKG/zS4WGN+QbUI+QDLdiV5VE=" + }, + "androidx/databinding#databinding-compiler-common/8.5.1": { + "jar": "sha256-K9foi27WtyImLkCZk1s2u6HfexzfL8CpWBj92Sq70ZI=", + "pom": "sha256-KfpSbWLCUOe08jPN9FVmXEsGZeIBwklRewoZp1Tc/M4=" + }, + "com/android#signflinger/8.5.1": { + "jar": "sha256-wdyixoNjTuGilCmPnHF5V4r2qG4IC9xA+WGRW8XIFC8=", + "pom": "sha256-mMXUJdbmwXv9pgH4Va/7F0gxd4eetbzpOHFfa/jn3X8=" + }, + "com/android#zipflinger/8.5.1": { + "jar": "sha256-gd1IVhilCaMjWSm56xMJHYhEUmYd5s5aRcw4scVVQhw=", + "pom": "sha256-H61GAd4ulSsxCkf1b1pRNuzb2zaNvsXzU6nQ9toXLDU=" + }, + "com/android/databinding#baseLibrary/8.5.1": { + "jar": "sha256-eUETcJ2rIbBsJis3lec8twj7rK5hcV80Nh4a9iN6GHA=", + "pom": "sha256-VOPuTKKjm4W4yNy6+AgBKFNXZX/YQN3QiOK1lwa6Cwo=" + }, + "com/android/tools#annotations/31.5.1": { + "jar": "sha256-slmV+nsiDTX7uOMl3wcfgpFpG/uv+XNMmOOPRewqc+4=", + "pom": "sha256-/C0bM+cvGl2okQQ4Iv1CnuQCkW8wUooGbVhNNMb6KBY=" + }, + "com/android/tools#common/31.5.1": { + "jar": "sha256-BkyysO4GTXFE0yeaijiytH+oNOGp+wiq0rHSFXeYgLk=", + "pom": "sha256-zJEPF3xQbSxjWRwbRbqPMwrP3R2YBDjI98lNC9DSuAI=" + }, + "com/android/tools#dvlib/31.5.1": { + "jar": "sha256-XMxJAlggKFBjDFnuy50ppshJuxfxD0ypAX22SfcuSB8=", + "pom": "sha256-e0jh13cxmf7BVC+JSn36NJ3uAadhKYROBaDiJmotoyY=" + }, + "com/android/tools#repository/31.5.1": { + "jar": "sha256-3yUz4VS3NqCpXkgEiTqlkJlVKEK/ljXNo3Ub6eiUoOI=", + "pom": "sha256-DVjUgWMnrGOvA0mmRFYDBmCCbaVldQ9EOhIuS5N8EZY=" + }, + "com/android/tools#sdk-common/31.5.1": { + "jar": "sha256-ymaZTQkxZ+OJshMkf0FOb5qUWE23jC5TyUuE+2C2C5o=", + "pom": "sha256-zN6jDCw0rHrX5J2wjkGlR43paf5vHTwyDGD5f/176/E=" + }, + "com/android/tools#sdklib/31.5.1": { + "jar": "sha256-qHx9labZwynd3oKK8/ITJTFAE1xgoL8CWpEHs8ISPyA=", + "pom": "sha256-gh7xvOfo74t462D+20X7BSGtoGSbBqoF4f24cMO+3Ww=" + }, + "com/android/tools/analytics-library#crash/31.5.1": { + "jar": "sha256-LFwmQglnZ1wHS8cUCDH+O/9burx/u8CLop/cPq3MlRA=", + "pom": "sha256-OXJrDyPv30HRxITT6LBZ+HVjy1ugDDFIJ9HhIB0Kko8=" + }, + "com/android/tools/analytics-library#protos/31.5.1": { + "jar": "sha256-F7mgPMS5aU6JAVRQIJ4T0MlYIZHdDqG48pfTbWA3ReY=", + "pom": "sha256-mIdZOvRT0we6namMYk4EnfGXn1DrlZNa0siAPbzNgWE=" + }, + "com/android/tools/analytics-library#shared/31.5.1": { + "jar": "sha256-Mk/EmDsURpqN8Z+lwswb09H9cpVUgl85EtjfrYuHNNM=", + "pom": "sha256-BiteE6o/oW+2jomPwh+0rDXWLDjAFdTopiuTItbSboY=" + }, + "com/android/tools/analytics-library#tracker/31.5.1": { + "jar": "sha256-VCxsAHCn32JUBQUy8qFKqdtVU6D8LLID/bp7chUj5xY=", + "pom": "sha256-++t2FU5ccPtD+xyuN8GpRa03y3n+/bxIktbtfijpDDM=" + }, + "com/android/tools/build#aapt2-proto/8.5.1-11315950": { + "jar": "sha256-LpmLPbtVLPSJump32hatI1R5Qf615WnZ6cPD9xCD58o=", + "module": "sha256-l0TymXwXyKW1KmBsOWK5chqepCZrqbWofrQfI3XsTUg=", + "pom": "sha256-Ss21jf5fpI7XEM9pcd0LusyJP6doMA2WWwfmmbbnIiU=" + }, + "com/android/tools/build#aaptcompiler/8.5.1": { + "jar": "sha256-Zwo5AhZc8gM7kOZKTb7YSDgJosrn1b7crOODCWDBdv0=", + "module": "sha256-bWaORgSw/1hwnkmwFezs+hLzxSBMrz5W8U6ztvVoJy4=", + "pom": "sha256-HS0jQNZ+2XLBSPKPqKCUpIdvrX7AjAN4mV6o3Uz//l8=" + }, + "com/android/tools/build#apksig/8.5.1": { + "jar": "sha256-xPb98hSEkClvQip+s3ZH6hHRw7AvHyNJwzziV/PCmx8=", + "pom": "sha256-N5IIT8RbraUNZxfhSQSNRA504lsAbAD2tP2ye9FN/H8=" + }, + "com/android/tools/build#apkzlib/8.5.1": { + "jar": "sha256-HBpn1vTxhkJ6wWbrqg3YZ/WV1RRPySUlKwX/udGhVrc=", + "pom": "sha256-a3rJuq3ifLcm8yc45sVeoMK63zpg0wIIo91Rwt4t0Eo=" + }, + "com/android/tools/build#builder-model/8.5.1": { + "jar": "sha256-ubfCzQtmkzIHr0jbd7NiRHYe0hVVxoOEnh5t21zivyc=", + "module": "sha256-QkbxfMXzC+azlxt8q9kIq9Sf7m7XveqB5lxleqa74mg=", + "pom": "sha256-TpxCn+I7+4NkICj92NZeaxC4hRDvxG67McxfdnlXBr4=" + }, + "com/android/tools/build#builder-test-api/8.5.1": { + "jar": "sha256-xfxT2D6tH0ZHsUw+u2WlRMd3UxYEzx2ARj+Y4YYHNgQ=", + "module": "sha256-PJkpNmfVudrEkqTC7n8/v4/g66ByAiSppfIiZIlAK2A=", + "pom": "sha256-C1ChK0uyXlF8Te2OHso7J1gnX2sheHDymdqHBg7MZlQ=" + }, + "com/android/tools/build#builder/8.5.1": { + "jar": "sha256-VeG9MUtrQR8lfryVUZEttov+ATcUcZP4SjLHiQ/x18I=", + "module": "sha256-tbou5mIZz6Q1vM7Bp8Jiz2XlmGZi6bL8v5/wQAArGqs=", + "pom": "sha256-zJQrbWRVtbehC+3HGYnYXpYA+3LkA1bUAM3jntnDHzc=" + }, + "com/android/tools/build#bundletool/1.16.0": { + "jar": "sha256-HqK/UnS7rHo7tWGFIdL6EfsE6QDjOopkYCnsYzL8CMg=", + "pom": "sha256-8uiq1EVaQjckYtXhiiaXPWdXEXmmdX84JfIn6Rry8ts=" + }, + "com/android/tools/build#gradle-api/8.5.1": { + "jar": "sha256-j99RbDNOCilR5EHF1KoDlkS/7vaey8uAoSAmzEMASek=", + "module": "sha256-bjognnNhBs+OI+nR+A1e81MDhexp+jQUhqG+oOuA6dA=", + "pom": "sha256-rGKHAU+sM7FlBGARgyXeGNCH387V8x4Jo1ck8hrGm0Q=" + }, + "com/android/tools/build#gradle-settings-api/8.5.1": { + "jar": "sha256-giZMHLRg/72siAls9xdicjQYt5zDMaSeVhtpUN8twa8=", + "module": "sha256-Xpr9vAKvLcxwf40N923uxZxaNsaJI+dQQQbrULoyx3w=", + "pom": "sha256-q69K2m5DEU7ZKKUBEyCVOnUpzSAT2oLBwveh16jI7b0=" + }, + "com/android/tools/build#gradle/8.5.1": { + "jar": "sha256-A3ovU83V0KLBzGZjLy/nojlFz6+3+cJ0/iKnFuyjp5Y=", + "module": "sha256-/v8j32Cwtb3zRavTBE00oa69u7Bnq/1QlmeD/95a5yE=", + "pom": "sha256-t5/zHvT310fE/wWiJi19gIm8lQQQcpUQgHd8EBcNQ3A=" + }, + "com/android/tools/build#manifest-merger/31.5.1": { + "jar": "sha256-Wv4OMmOjfBWN1CiLzMqgkVH7tMwgcf1t5wYkKvUYhH0=", + "module": "sha256-D52bVheFKmATMMs4NfTnWe50qlbJUxDBwo539S6yQY8=", + "pom": "sha256-d/VgqPsXO7Jr+wAL+Qx8gaSXEEHuv5d+gekfEasQq8w=" + }, + "com/android/tools/build/jetifier#jetifier-core/1.0.0-beta10": { + "jar": "sha256-Jqu0oTkn2QYhacUEyelP6A6a46T3tauIdasAdTapH14=", + "module": "sha256-8JF1iaQtJ2Fj8QBAq1hC6RiD3L2x1Iv9Hx/Kpywcp7c=", + "pom": "sha256-XJ1C5rfjXU2NAuCjIs8maTs+w2QrEHyPC+WnIdRaDG0=" + }, + "com/android/tools/build/jetifier#jetifier-processor/1.0.0-beta10": { + "jar": "sha256-xQZ6e5KCN6EnGl6ctXEOn4C0lzKTlFvFHjpMhk6kv+0=", + "module": "sha256-NsJVdrGZk982AXBSjMYrckbDd3bWFYFUpnzfj8LVjhM=", + "pom": "sha256-M7F/OWmJQEpJF0dIVpvI7fTjmmKkKjXOk9ylwOS6CEI=" + }, + "com/android/tools/ddms#ddmlib/31.5.1": { + "jar": "sha256-xXHAIk/j5+ZgcZbZXMMUL9wZ8BPo8VEPaMe0pobFOAk=", + "pom": "sha256-HdkRpTji7AzoZ6qd8qtM2B6hvnXl8NuFIajFDMVcP/M=" + }, + "com/android/tools/layoutlib#layoutlib-api/31.5.1": { + "jar": "sha256-knG/Cz+95l51o+nFh3AbiGXS8AnqFZ8oAbqY27yKw2A=", + "pom": "sha256-AHisaGN+NrAyh66Ux+nJZPZrbvke2TDTqWuksCYuCkA=" + }, + "com/android/tools/lint#lint-model/31.5.1": { + "jar": "sha256-rls4Rg86WcByWTDXedu7M3LwgDGhpB+qWdn4UAs+RkE=", + "pom": "sha256-We2jbeV5Y5gq2GzW/IAKF/ee270hHslHBk42mpGEcgU=" + }, + "com/android/tools/lint#lint-typedef-remover/31.5.1": { + "jar": "sha256-W09IUhXKTYbvIxn8OYtfIlHmL1RGvF/Q4AZTZI3d4xg=", + "pom": "sha256-ZMG6kvnO0A2dNczwj9PIiWWCZUYkWHzrD/C1mCEzYqU=" + }, + "com/android/tools/utp#android-device-provider-ddmlib-proto/31.5.1": { + "jar": "sha256-2p8/Pa4mVEyQZoVJWEdl1YVKh8Ql0s/ld80002AOoJc=", + "pom": "sha256-4wr767lO/YKnYsH0VzVlW2xHK4q+Y2nAWb3UhiH1eaY=" + }, + "com/android/tools/utp#android-device-provider-gradle-proto/31.5.1": { + "jar": "sha256-rSNCux1vlVY0AKMiST6hwinLk985RPEmG3OZ9xhJQEk=", + "pom": "sha256-iYdBirXnjxs2pt5rwib7h3qjeQ+S6Xg9icB4qD5CSdA=" + }, + "com/android/tools/utp#android-test-plugin-host-additional-test-output-proto/31.5.1": { + "jar": "sha256-OEUGlN5jKMLEy6aW+cBOzdXOaVI1X2jDoi+VQdHWVG8=", + "pom": "sha256-rdsloP8gn7f5hRXsnI9ClJsnK9SF1OSv+7gvjbVcBhg=" + }, + "com/android/tools/utp#android-test-plugin-host-apk-installer-proto/31.5.1": { + "jar": "sha256-ztSaykAxqixXtR05CbqBUILlY8HZoka8I+3pc3glJPc=", + "pom": "sha256-x7iXXN3eStKB2KEJujczaNKu+8LmBWe85MG04HZfvGk=" + }, + "com/android/tools/utp#android-test-plugin-host-coverage-proto/31.5.1": { + "jar": "sha256-77TXAUqqc1UkagfC5DeiIx+yUlQP8bzmhyyI3I2onRI=", + "pom": "sha256-uu3ksHWND1DNWwQZvXaXP3dU5RaueQoP1OVv0ivz9R8=" + }, + "com/android/tools/utp#android-test-plugin-host-emulator-control-proto/31.5.1": { + "jar": "sha256-rt7F7EYn2JjMzfQtgDjbIOukSVdTxT0bCzeHNEkcr18=", + "pom": "sha256-QPiWAfztmgeT+ThJAd8n7msLLixmtJ6thfawKT3Iiqw=" + }, + "com/android/tools/utp#android-test-plugin-host-logcat-proto/31.5.1": { + "jar": "sha256-kSkCS9jjg1O8o+sm39jjYo4FjVfW6dhFH/w18BZ1HmM=", + "pom": "sha256-YOxd/ukXyFHuWe6q0D6bZhPfJtNbX8uxbDjU2l7aAqA=" + }, + "com/android/tools/utp#android-test-plugin-host-retention-proto/31.5.1": { + "jar": "sha256-PbjtOO9JtpTK6kZq4i47Ns7clVezWJ0OB8DN2DKUWRw=", + "pom": "sha256-papZnheulG+JoEQmzmclP581ym21nuan4xNlrGSNwJ4=" + }, + "com/android/tools/utp#android-test-plugin-result-listener-gradle-proto/31.5.1": { + "jar": "sha256-y99xvKYOFMMOeyz0uQ8PCj6ME498rdh0sNnArgguAnQ=", + "pom": "sha256-3eYSlDB2g3WmtJupWX1AROW5V6fgKHg0JzADaN2axVM=" + }, + "com/google/testing/platform#core-proto/0.0.9-alpha02": { + "jar": "sha256-bYqJBndBUPQ6j60IymTiXGBww5vYpvwTslk/KJJC/pU=", + "pom": "sha256-J855WUJ6L/7kjQ/rRRKKPzbMQX7YqCKvoigiyPWliyU=" + } + }, + "https://jitpack.io/com/github": { + "cgutman#ShieldControllerExtensions/1.0.1": { + "module": "sha256-6C1fL60OxxyaoRiGAV/s9QXC+GNUrD0BtFmhxWACpqg=", + "pom": "sha256-P49Bt0XIkSOgXHcLrw8OeDDy2CoteSiO/ZDWaLy0I2w=" + }, + "cgutman/ShieldControllerExtensions/1.0.1/ShieldControllerExtensions-1.0.1": { + "aar": "sha256-9T3e7fpYTbYNZuEbpnXTIoE7YHBvmyE5dr+VmU/Lc4Q=" + } + }, + "https://repo.maven.apache.org/maven2": { + "com/android/tools/build#transform-api/2.0.0-deprecated-use-gradle-api": { + "jar": "sha256-6LQVGuFnnxq+ehTuNxrJs8ZRrntjKQ0fWGvdD3j6zpo=", + "pom": "sha256-1J0Xn3B9PzoAsqfTYTa1SqjUT6IncHA82C/lL7OeIus=" + }, + "com/google/android#annotations/4.1.1.4": { + "jar": "sha256-unNOHoTAnWFa9qCdMwNLTwRC+Hct7BIO+zdthqVlrhU=", + "pom": "sha256-5LtUdTw2onoOXXAVSlA0/t2P6sQoIpUDS/1IPWx6rng=" + }, + "com/google/api/grpc#proto-google-common-protos/2.17.0": { + "jar": "sha256-TvH+DDJ/wVIdHXU7CxxKh1pUvRTr3tOv/wyjlTILbqk=", + "pom": "sha256-PwKBU6WFxZ9Viz5Dp8mAmmAai7XpEGHWxlj/+iTLjiY=" + }, + "com/google/auto#auto-parent/6": { + "pom": "sha256-BfdAxmSBZdsAz2GN1WwgDEcl41jm1U9YU+C+wVc06go=" + }, + "com/google/auto/value#auto-value-annotations/1.6.2": { + "jar": "sha256-tIsE3bpA6KwzvwNvBvxDmV/FCEvZS9qs6AfOJ9O+o/s=", + "pom": "sha256-HHbNRi/JbnqpbccM6C8NVAY9bfFts1ycfZzA0amdP/8=" + }, + "com/google/auto/value#auto-value-parent/1.6.2": { + "pom": "sha256-J7ZAyCF59c/2IAnAtyAz2bxg9g6ZAqZoAidLf+N/yBw=" + }, + "com/google/code/findbugs#jsr305/3.0.2": { + "jar": "sha256-dmrSoHg/JoeWLIrXTO7MOKKLn3Ki0IXuQ4t4E+ko0Mc=", + "pom": "sha256-GYidvfGyVLJgGl7mRbgUepdGRIgil2hMeYr+XWPXjf4=" + }, + "com/google/code/gson#gson-parent/2.10.1": { + "pom": "sha256-QkjgiCQmxhUYI4XWCGw+8yYudplXGJ4pMGKAuFSCuDM=" + }, + "com/google/code/gson#gson/2.10.1": { + "jar": "sha256-QkHBSncnw0/uplB+yAExij1KkPBw5FJWgQefuU7kxZM=", + "pom": "sha256-0rEVY09cCF20ucn/wmWOieIx/b++IkISGhzZXU2Ujdc=" + }, + "com/google/crypto/tink#tink/1.7.0": { + "jar": "sha256-iJcKRWoIukxmsBsj5YRsoQlcwU5Uy0g2Pl0uFaEwcwg=", + "pom": "sha256-Ku41I3FfjyzRCyYDyNGeVhrHWDELfiyYU5RtLF57S/c=" + }, + "com/google/dagger#dagger/2.28.3": { + "jar": "sha256-8d0j+K40qOkTZnI5kerQ1kmdGj6RY85VDCALAtdqhys=", + "pom": "sha256-JlupWajhPDoGEz8EtTkWnBAY2v/U0z9TxFOrTLOG9XA=" + }, + "com/google/errorprone#error_prone_annotations/2.11.0": { + "pom": "sha256-AmHKAfLS6awq4uznXULFYyOzhfspS2vJQ/Yu9Okt3wg=" + }, + "com/google/errorprone#error_prone_annotations/2.18.0": { + "jar": "sha256-nmgUy3GBaYik/RsHqZOo8hu3BY1SLBYrHehJ4ZvqVK4=", + "pom": "sha256-kgE1eX3MpZF7WlwBdkKljTQKTNG80S9W+JKlZjvXvdw=" + }, + "com/google/errorprone#error_prone_annotations/2.3.1": { + "pom": "sha256-PtzmtxG6No7+Frm3qssCFPvWSEFMublllTouftiagZo=" + }, + "com/google/errorprone#error_prone_parent/2.11.0": { + "pom": "sha256-goPwy0TGJKedMwtv2AuLinFaaLNoXJqVHD3oN9RUBVE=" + }, + "com/google/errorprone#error_prone_parent/2.18.0": { + "pom": "sha256-R/Iumce/RmOR3vFvg3eYXl07pvW7z2WFNkSAVRPhX60=" + }, + "com/google/errorprone#error_prone_parent/2.3.1": { + "pom": "sha256-dnUl2agRKc0IGWg4KYAzYye+QWKx4iUaGCkR2qczwSM=" + }, + "com/google/flatbuffers#flatbuffers-java/1.12.0": { + "jar": "sha256-P4wIi03QSphYch8uFiUIyU2w3Yb5YeMG7mPvLtqHG/c=", + "pom": "sha256-yyJrr1RiYHcPIegVKmqoi6FSMNc591DfSA8qZo1D4Os=" + }, + "com/google/guava#failureaccess/1.0.1": { + "jar": "sha256-oXHuTHNN0tqDfksWvp30Zhr6typBra8x64Tf2vk2yiY=", + "pom": "sha256-6WBCznj+y6DaK+lkUilHyHtAopG1/TzWcqQ0kkEDxLk=" + }, + "com/google/guava#guava-parent/26.0-android": { + "pom": "sha256-+GmKtGypls6InBr8jKTyXrisawNNyJjUWDdCNgAWzAQ=" + }, + "com/google/guava#guava-parent/32.0.1-jre": { + "pom": "sha256-Q+0ONrNT9B5et1zXVmZ8ni35fO8G6xYGaWcVih0DTSo=" + }, + "com/google/guava#guava/32.0.1-jre": { + "jar": "sha256-vX+iJ1kfuFCWd9DREiz5UVjzuKn0VlP1goHYefbcSMU=", + "pom": "sha256-QsJX9/c203ezGv7u6XirJtcwzXCvYN3nZi4YI1LiSCo=" + }, + "com/google/guava#listenablefuture/9999.0-empty-to-avoid-conflict-with-guava": { + "jar": "sha256-s3KgN9QjCqV/vv/e8w/WEj+cDC24XQrO0AyRuXTzP5k=", + "pom": "sha256-GNSx2yYVPU5VB5zh92ux/gXNuGLvmVSojLzE/zi4Z5s=" + }, + "com/google/j2objc#j2objc-annotations/1.3": { + "pom": "sha256-X6yoJLoRW+5FhzAzff2y/OpGui/XdNQwTtvzD6aj8FU=" + }, + "com/google/j2objc#j2objc-annotations/2.8": { + "jar": "sha256-8CqV+hpele2z7YWf0Pt99wnRIaNSkO/4t03OKrf01u0=", + "pom": "sha256-N/h3mLGDhRE8kYv6nhJ2/lBzXvj6hJtYAMUZ1U2/Efg=" + }, + "com/google/jimfs#jimfs-parent/1.1": { + "pom": "sha256-xxVVdR5X4O+RKHDorJYlrnglAqalucGcz4OyqX2LJr0=" + }, + "com/google/jimfs#jimfs/1.1": { + "jar": "sha256-xIKOKNfAqTCvk4dRCzutp9qlwE18Jadce4sIHxwlfd0=", + "pom": "sha256-76huXNki8XtHL9/K5XI02NSsPhSLYlBzffzkVK96ekQ=" + }, + "com/google/protobuf#protobuf-bom/3.22.3": { + "pom": "sha256-E6Mt+53m/Bw8P3r1Pk1cd/130rR2uuOLdLdYHN7i5lU=" + }, + "com/google/protobuf#protobuf-java-util/3.22.3": { + "jar": "sha256-xhX3aHncXDA+TfW5Smr6OVNAWMdUXbLUg/2V2fY8i/4=", + "pom": "sha256-tEcBsGoGSGXsm1YUqT6eKPrdfU38S0YPIcgZ71Pb4tY=" + }, + "com/google/protobuf#protobuf-java/3.22.3": { + "jar": "sha256-WdOI6motLXaujv/3/U0MYMbw9GTD06ub6OWt0JKXVwg=", + "pom": "sha256-GG6nlBUPW0Kup+xgQd83PR2KioMWJPWKVd67YEPscxI=" + }, + "com/google/protobuf#protobuf-parent/3.22.3": { + "pom": "sha256-OZEz1/b1eTTddsSxjoY0j0JFMhCNr0oByPgguGZfCSk=" + }, + "com/googlecode/juniversalchardet#juniversalchardet/1.0.3": { + "jar": "sha256-dXv+kGGTuLZR553CbNZ9a1XQdwos37A4FZFQT3edSnY=", + "pom": "sha256-eEY5mzXHzWQqmzoADD4tYtBOs3pFR7aTPMixi8wvCGs=" + }, + "com/squareup#javapoet/1.10.0": { + "jar": "sha256-IO9LguQ/98ZSKBohMTzzuUEJJGet0/pzUJwm9pae/as=", + "pom": "sha256-FpA0CiIiefLLrfNz6Igm+iD388w+wCUvNoGP7TJwGrE=" + }, + "com/squareup#javawriter/2.5.0": { + "jar": "sha256-/PsJ+w6gqpfTz+fqeSOYCBNI5GjxJrNgPLOAPyQBl/A=", + "pom": "sha256-4avX8RFs9eDFmUdpPiGJII7JQpayozlMlZ41EdOZp7A=" + }, + "com/squareup/okhttp3#okhttp/4.12.0": { + "jar": "sha256-sQUAgbFLt6On5VpNPvAbXc+rxFO0VzpPwBl2cZHV9OA=", + "module": "sha256-YH4iD/ghW5Kdgpu/VPMyiU8UWbTXlZea6vy8wc6lTPM=", + "pom": "sha256-fHNwQKlBlSLnxQzAJ0FqcP58dinlKyGZNa3mtBGcfTg=" + }, + "com/squareup/okio#okio-jvm/3.6.0": { + "jar": "sha256-Z1Q/Bzb8QirpJ+0OUEuYvF4mn9oNNQBXkzfLcT2ihBI=", + "module": "sha256-scIZnhwMyWnvYcu+SvLsr5sGQRvd4By69vyRNN/gToo=", + "pom": "sha256-YbTXxRWgiU/62SX9cFJiDBQlqGQz/TURO1+rDeiQpX8=" + }, + "com/squareup/okio#okio/3.6.0": { + "module": "sha256-akesUDZOZZhFlAH7hvm2z832N7mzowRbHMM8v0xAghg=", + "pom": "sha256-rrO3CiTBA+0MVFQfNfXFEdJ85gyuN2pZbX1lNpf4zJU=" + }, + "com/sun/activation#all/1.2.0": { + "pom": "sha256-HYUY46x1MqEE5Pe+d97zfJguUwcjxr2z1ncIzOKwwsQ=" + }, + "com/sun/activation#all/1.2.1": { + "pom": "sha256-NgiDv2RIbs7xYbjygvZQNTbdGmcNU6Coccj7IBcOZ5U=" + }, + "com/sun/activation#javax.activation/1.2.0": { + "jar": "sha256-mTMCsWzXBW8h53nMV30XWoELtJAO9zzY+/K1D5KLqc4=", + "pom": "sha256-+Hm26UWFTGkAsNvuHIOE16s95+FX/XrISTdAXEFtKl4=" + }, + "com/sun/istack#istack-commons-runtime/3.0.8": { + "jar": "sha256-T/q7Br5FSgXkOY4gx3+itjCNS4jfvvfKMKdrW31VBe8=", + "pom": "sha256-wuAU00y4TtKH0GSYbEXDBaQSQiinM37M9sQh0U1wjxw=" + }, + "com/sun/istack#istack-commons/3.0.8": { + "pom": "sha256-oPBRfoUS8PvMe4KVwS9lZqPQwthtZVY53GYu+MDH6+U=" + }, + "com/sun/xml/bind#jaxb-bom-ext/2.3.2": { + "pom": "sha256-Gn3sKyfn4FV0TNuM8bkN70/Uc6zRuATv8JgTk1iVm9c=" + }, + "com/sun/xml/bind/mvn#jaxb-parent/2.3.2": { + "pom": "sha256-IN1tw0q3VJrEDaHYLpIiLsQ0etDsDLEY72xXA77VOhg=" + }, + "com/sun/xml/bind/mvn#jaxb-runtime-parent/2.3.2": { + "pom": "sha256-sk+NUfGEpovBuG1IwOPP7+shpE7eHF9zA8WK4EiFM+w=" + }, + "com/sun/xml/bind/mvn#jaxb-txw-parent/2.3.2": { + "pom": "sha256-tV0++psVj0g6MOkseMy2APkzFHM9CJ66m3RDbwGzFKQ=" + }, + "com/sun/xml/fastinfoset#FastInfoset/1.2.16": { + "jar": "sha256-BW86HhRECfIe0Wr8JoBfWOmiHz/OFUPELUAHGdJQxRE=", + "pom": "sha256-4UfSWKtuZpH3BZmpUkAObmx1WPjJwCjb4b4jF4MI6DA=" + }, + "com/sun/xml/fastinfoset#fastinfoset-project/1.2.16": { + "pom": "sha256-kFgkJa3B9AtBNi2vuVFzkxIlrKpeeWINXmvVL2Rikro=" + }, + "commons-codec#commons-codec/1.10": { + "pom": "sha256-vbjbcBLREqbj6o/bfFELMA2Z7/CBnSfd26nEM5fqTPs=" + }, + "commons-codec#commons-codec/1.11": { + "jar": "sha256-5ZnVMY6Xqkj0ITaikn5t+k6Igd/w5sjjEJ3bv/Ude30=", + "pom": "sha256-wecUDR3qj981KLwePFRErAtUEpcxH0X5gGwhPsPumhA=" + }, + "commons-io#commons-io/2.13.0": { + "jar": "sha256-Zx6qOWiNrC/6pGRbPJmAri0OokceSual2hmc0VriNmY=", + "pom": "sha256-2z/tZMLhd06/1rGnSQN3MrFJuREd1+a5hfCN2lVHBDk=" + }, + "commons-logging#commons-logging/1.2": { + "jar": "sha256-2t3qHqC+D1aXirMAa4rJKDSv7vvZt+TmMW/KV98PpjY=", + "pom": "sha256-yRq1qlcNhvb9B8wVjsa8LFAIBAKXLukXn+JBAHOfuyA=" + }, + "io/grpc#grpc-api/1.57.0": { + "jar": "sha256-jSw4Qpn4Tuiqf2cPAOfLJrh+IxzzCRR0MHsyt2kQ9xw=", + "pom": "sha256-w/BUp8iGFkfQpVglsKlJ9E/PycZPR5CD2WgTgUxQJhI=" + }, + "io/grpc#grpc-context/1.57.0": { + "jar": "sha256-lT/KzYL1MeabduODT1gwutTCKuhBROBY1x3ICnQwJ10=", + "pom": "sha256-qyZOgr+2q4lfYBavizzERJWryB52nDD6WprgrRa+bMY=" + }, + "io/grpc#grpc-core/1.57.0": { + "jar": "sha256-O+5IxzvExbVb7Xm+DkhK3ya6Vr675XmN2/NHFO8eHOo=", + "pom": "sha256-gYQEX1eR4Azyzbz16IRq/Uj1z35aTzj7W4MDx7Lv5Vs=" + }, + "io/grpc#grpc-netty/1.57.0": { + "jar": "sha256-gdQ/LU7Rj6NBvYQKNzXxQDpwB0oEbhV+J/Z5tyG0ya0=", + "pom": "sha256-7Z3917HtQ1avs8XRQH3ttjTIYC+0EEebSArYwROe4Xs=" + }, + "io/grpc#grpc-protobuf-lite/1.57.0": { + "jar": "sha256-LFB8AtmBuEohdj1E4Jr08nmIHdPiW+MID2NhJYYH8Zg=", + "pom": "sha256-sCO+cAiElIn2Uu7/df0P4aqckF9nHTROFtqv3fkhgZ0=" + }, + "io/grpc#grpc-protobuf/1.57.0": { + "jar": "sha256-SfmG1OqxJhD9ukpokPylLV62U1mJFv24Y6Nm1eKO7Pc=", + "pom": "sha256-wNy4xn/QHapjJW8Pi2jTcHzrfKhc2qt6PGw/9GDhPdE=" + }, + "io/grpc#grpc-stub/1.57.0": { + "jar": "sha256-bm7hQVOfoU2fpHn39RFgVUREPH4BHnjic8+UaKoYMGA=", + "pom": "sha256-bURZSHxiHf8xUQqIgpBjYx6RXS3Md01xkoQYEW5ZqI0=" + }, + "io/netty#netty-buffer/4.1.93.Final": { + "jar": "sha256-AHx9nDeN8C05BWfQ1931Qv/dsCG3MT2/UCOSET/6uwg=", + "pom": "sha256-g/vFTitzuG1Vsgj2GNGioVaRDsFG9+zldWUAe3UK3Xg=" + }, + "io/netty#netty-codec-http/4.1.93.Final": { + "jar": "sha256-2s94znirLSlXAyXbTNJFHqWJY5gH3pWIGg+nFVqea1U=", + "pom": "sha256-o9r/8HG20oToBj2WhD3iu4PPO4iergzJ4K22SlejG4I=" + }, + "io/netty#netty-codec-http2/4.1.93.Final": { + "jar": "sha256-2WzAkEWhNBxtR0lDUqomO4e3L7HS6p7KFhqnOCC/6Ls=", + "pom": "sha256-CEQztC1UH3rEtZKH3SUyhc/aOj1l3nLnNou37D02cnE=" + }, + "io/netty#netty-codec-socks/4.1.93.Final": { + "jar": "sha256-DqR7W6I8odqOuRRsj8dVwScUFGM7Hivizh33ZLoP/yo=", + "pom": "sha256-jNgW7ZkalGBBurTLJL2cjkHuBpJRJRHy2DzvU462Bdc=" + }, + "io/netty#netty-codec/4.1.93.Final": { + "jar": "sha256-mQw3gWjcY2TG/1aXAfTy8SL//omYs+GJ66TE2GjtEIQ=", + "pom": "sha256-Gc3tJnoHDf8avJ0Cm1UvrSYqzBq6XGxnsiePyhE6Jqs=" + }, + "io/netty#netty-common/4.1.93.Final": { + "jar": "sha256-RDuzFlmfsW47rrovtYiBgU1/8LevF2/nbjgHGm6G+MA=", + "pom": "sha256-QtiDsT6zjKv1SWFkYsXzMfUzO/DI/JIVdE+DwBgKT2s=" + }, + "io/netty#netty-handler-proxy/4.1.93.Final": { + "jar": "sha256-KsX3+++gtz73g4iQaTRNVRVQWhSyMDvmk8UALEht8rQ=", + "pom": "sha256-bcUNoOZ/WXgSh0+B6qRUBPfQdrgZnqkIiTKoXBthAkU=" + }, + "io/netty#netty-handler/4.1.93.Final": { + "jar": "sha256-Tl9WOuFO1xM4GBbVgvX8/QYVrvspIDSGzft4LYoAoCs=", + "pom": "sha256-hKFSXKwLR1nvrvKZekf+Gbm1ZC+Sc/oP1YoudsegWf4=" + }, + "io/netty#netty-parent/4.1.93.Final": { + "pom": "sha256-sQnLdvN1/tuKnvdaxYBjFw3rfqLd0CT0Zv723GXN/O4=" + }, + "io/netty#netty-resolver/4.1.93.Final": { + "jar": "sha256-5Zdwtm6Bgi5dERrE5UTX6wxUPgooX1JijlOUGs2O11k=", + "pom": "sha256-WzUMPJHp5V0py+aM/k7yEWzB8DKGd+v59hW6twgsefQ=" + }, + "io/netty#netty-transport-native-unix-common/4.1.93.Final": { + "jar": "sha256-d0FlocTbqssX+cGtZms1aaallxWugo58PUdwP0eaU+c=", + "pom": "sha256-Fbwltn/wpJJysnDvK4z/1iAFfKFssp3/etVmGtyirhI=" + }, + "io/netty#netty-transport/4.1.93.Final": { + "jar": "sha256-paeAGbwc1D28PHt83TgBkSyibR9Jj7VgUU/uSXhkupY=", + "pom": "sha256-DdYqDrPLHqABpNBCbk9cCN8ccNkmVnW/+lxYNhNCLUM=" + }, + "io/perfmark#perfmark-api/0.26.0": { + "jar": "sha256-t9I+k6NFN84zJwgmmg0UBHiKW14ZSegvVTX85Rs+qVs=", + "module": "sha256-MdgyMyR0zkgVD1uuADNDMZE28zav0QdqKJApMZ4+qXo=", + "pom": "sha256-ft7khhbhe2Epfq46gutIOoXlbSVnkpN4qkbzCpUDIto=" + }, + "jakarta/activation#jakarta.activation-api/1.2.1": { + "jar": "sha256-iwoPUvqLBcVDGSGgY+2GbvqkHa3y46fuPhlh8rDZZFs=", + "pom": "sha256-QlhcsH3afyOqBOteCUAGGUSiRqZ609FpQvvlaf8DzTE=" + }, + "jakarta/xml/bind#jakarta.xml.bind-api-parent/2.3.2": { + "pom": "sha256-FaVbfVN8n5lwrq0o0q+XwFn2X/YQL3a70p8SR92Kbfs=" + }, + "jakarta/xml/bind#jakarta.xml.bind-api/2.3.2": { + "jar": "sha256-aRVjBAeb3u2fwK47OTifGbPMS6REO8gFCJlTlOrXQuo=", + "pom": "sha256-tTeziNurTMBpC50vsMdBJNZyUxc0VnrPblMTDqsTGtY=" + }, + "javax/annotation#javax.annotation-api/1.3.2": { + "jar": "sha256-4EulGVvNVV3JVlD3zGFNFR5LzVLSmhC4qiGX86uJq5s=", + "pom": "sha256-RqSiUcpAbnjkhT16K66DKChEpJkoUUOe6aHyNxbwa5c=" + }, + "javax/inject#javax.inject/1": { + "jar": "sha256-kcdwRKUMSBY2wy2Rb9ickRinIZU5BFLIEGUID5V95/8=", + "pom": "sha256-lD4SsQBieARjj6KFgFoKt4imgCZlMeZQkh6/5GIai/o=" + }, + "net/java#jvnet-parent/1": { + "pom": "sha256-KBRAgRJo5l2eJms8yJgpfiFOBPCXQNA4bO60qJI9Y78=" + }, + "net/java#jvnet-parent/3": { + "pom": "sha256-MPV4nvo53b+WCVqto/wSYMRWH68vcUaGcXyy3FBJR1o=" + }, + "net/java/dev/jna#jna-platform/5.6.0": { + "jar": "sha256-ns6ovysbOZY5OdGLcEZO72DFCP7Ygg+dyroMNVGOq/c=", + "pom": "sha256-G+s1y0GE5skGp+Murr2FLdPaCiY5YumRNKuUWDI5Tig=" + }, + "net/java/dev/jna#jna/5.6.0": { + "jar": "sha256-VVfiNaiqL5dm1dxgnWeUjyqIMsLXls6p7x1svgs7fq8=", + "pom": "sha256-X+gbAlWXjyRhbTexBgi3lJil8wc+HZsgONhzaoMfJgg=" + }, + "net/sf/jopt-simple#jopt-simple/4.9": { + "jar": "sha256-JsWFbpVLX4ZNt28TuGkZtZxu7Pn9kwuWuqiIRia68vU=", + "pom": "sha256-evfi2LJLR5jwTCt9okyfvRt1V7TgF8IFRIFWWRYHkJI=" + }, + "net/sf/kxml#kxml2/2.3.0": { + "jar": "sha256-8mTdn3mh/eEM5ezFMiHv8kvkyTMcgwt9UvLwintjPeI=", + "pom": "sha256-Mc5gb06VGJNimbsNJ8l4+mHhhf0d58mHT+lZpT40poU=" + }, + "org/apache#apache/13": { + "pom": "sha256-/1E9sDYf1BI3vvR4SWi8FarkeNTsCpSW+BEHLMrzhB0=" + }, + "org/apache#apache/15": { + "pom": "sha256-NsLy+XmsZ7RQwMtIDk6br2tA86aB8iupaSKH0ROa1JQ=" + }, + "org/apache#apache/18": { + "pom": "sha256-eDEwcoX9R1u8NrIK4454gvEcMVOx1ZMPhS1E7ajzPBc=" + }, + "org/apache#apache/21": { + "pom": "sha256-rxDBCNoBTxfK+se1KytLWjocGCZfoq+XoyXZFDU3s4A=" + }, + "org/apache#apache/23": { + "pom": "sha256-vBBiTgYj82V3+sVjnKKTbTJA7RUvttjVM6tNJwVDSRw=" + }, + "org/apache#apache/29": { + "pom": "sha256-PkkDcXSCC70N9jQgqXclWIY5iVTCoGKR+mH3J6w1s3c=" + }, + "org/apache/commons#commons-compress/1.21": { + "jar": "sha256-auz9VFlyillWAc+gcljRMZcv/Dm0kutIvdWWV3ovJEo=", + "pom": "sha256-Z1uwI8m+7d4yMpSZebl0Kl/qlGKApVobRi1Mp4AQiM0=" + }, + "org/apache/commons#commons-parent/34": { + "pom": "sha256-Oi5p0G1kHR87KTEm3J4uTqZWO/jDbIfgq2+kKS0Et5w=" + }, + "org/apache/commons#commons-parent/35": { + "pom": "sha256-cJihq4M27NTJ3CHLvKyGn4LGb2S4rE95iNQbT8tE5Jo=" + }, + "org/apache/commons#commons-parent/42": { + "pom": "sha256-zTE0lMZwtIPsJWlyrxaYszDlmPgHACNU63ZUefYEsJw=" + }, + "org/apache/commons#commons-parent/52": { + "pom": "sha256-ddvo806Y5MP/QtquSi+etMvNO18QR9VEYKzpBtu0UC4=" + }, + "org/apache/commons#commons-parent/58": { + "pom": "sha256-LUsS4YiZBjq9fHUni1+pejcp2Ah4zuy2pA2UbpwNVZA=" + }, + "org/apache/httpcomponents#httpclient/4.5.14": { + "jar": "sha256-yLx+HFGm1M5y9A0uu6vxxLaL/nbnMhBLBDgbSTR46dY=", + "pom": "sha256-8YNVr0z4CopO8E69dCpH6Qp+rwgMclsgldvE/F2977c=" + }, + "org/apache/httpcomponents#httpcomponents-client/4.5.14": { + "pom": "sha256-W60d5PEBRHZZ+J0ImGjMutZKaMxQPS1lQQtR9pBKoGE=" + }, + "org/apache/httpcomponents#httpcomponents-client/4.5.6": { + "pom": "sha256-sEK0HyOR7bANNff05Qmu0hI2SMHSRs5Y0Pe5Bcn+H3M=" + }, + "org/apache/httpcomponents#httpcomponents-core/4.4.16": { + "pom": "sha256-8tdaLC1COtGFOb8hZW1W+IpAkZRKZi/K8VnVrig9t/c=" + }, + "org/apache/httpcomponents#httpcomponents-parent/10": { + "pom": "sha256-yq+WfZSvshdT82CCxghiBr0fSIJf9ZaTLM66crZdOfo=" + }, + "org/apache/httpcomponents#httpcomponents-parent/11": { + "pom": "sha256-qQH4exFcVQcMfuQ+//Y+IOewLTCvJEOuKSvx9OUy06o=" + }, + "org/apache/httpcomponents#httpcore/4.4.16": { + "jar": "sha256-bJs90UKgncRo4jrTmq1vdaDyuFElEERp8CblKkdORk8=", + "pom": "sha256-PLrYSbNdrP5s7DGtraLGI8AmwyYRQbDSbux+OZxs1/o=" + }, + "org/apache/httpcomponents#httpmime/4.5.6": { + "jar": "sha256-CysRAsGNPH4Fp3IUubdQGm9gVhdK5WBODiVndu2nVT4=", + "pom": "sha256-37/W/+KnhMqYF8RjZap/ileDILgFveOdb1WgsJ2KqMo=" + }, + "org/bitbucket/b_c#jose4j/0.9.5": { + "jar": "sha256-gI+zFm8+Z9rZgRwzECmrFoEkL9Urc1vD8z8oEWf8xy4=", + "pom": "sha256-utAkGAobRpy9lOXy2xKEG8rFRD2VRWB/Zzz95nfB2HI=" + }, + "org/bouncycastle#bcpkix-jdk18on/1.77": { + "jar": "sha256-Gsf+jv1bLzjNwWW+WgZ1c0/kSAjauScHIB8DpTXW8bg=", + "pom": "sha256-j7CSbwLixLLcUuR+uwk/kvHTu28UnCpcyl4qZI0sSY0=" + }, + "org/bouncycastle#bcprov-jdk18on/1.77": { + "jar": "sha256-2ruYwk1yybn1hWM9HfnFzVjZrTc9DNaBNn5qYDpJXVg=", + "pom": "sha256-rROCz80DvN2L4TkTwC9E/UadCnalPPLK71vhgK3DayM=" + }, + "org/bouncycastle#bcutil-jdk18on/1.77": { + "jar": "sha256-lHZzvLxajd4tL6aIpbdZjQym4qdKfqMM2T8E9rOtaPg=", + "pom": "sha256-Fj36ZjL/uSinBcqDciNQys6knM1iPOc2RaXMOw+p5ug=" + }, + "org/checkerframework#checker-qual/2.5.8": { + "pom": "sha256-M6xqDxNBrpZkfH1EZfSqPST+l9Jpe87izq5vyLXvLDw=" + }, + "org/checkerframework#checker-qual/3.33.0": { + "jar": "sha256-4xYlW7/Nn+UNFlMUuFq7KzPLKmapPEkdtkjkmKgsLeE=", + "module": "sha256-6FIddWJdQScsdn0mKhU6wWPMUFtmZEou9wX6iUn/tOU=", + "pom": "sha256-9VqSICenj92LPqFaDYv+P+xqXOrDDIaqivpKW5sN9gM=" + }, + "org/codehaus/mojo#animal-sniffer-annotations/1.23": { + "jar": "sha256-n/5Sa/Q6Y0jp2LM7nNb1gKf17tDPBVkTAH7aJj3pdNA=", + "pom": "sha256-VhDbBrczZBrLx6DEioDEAGnbYnutBD+MfI16+09qPSc=" + }, + "org/codehaus/mojo#animal-sniffer-parent/1.23": { + "pom": "sha256-a38FSrhqh/jiWZ81gIsJiZIuhrbKsTmIAhzRJkCktAQ=" + }, + "org/codehaus/mojo#mojo-parent/74": { + "pom": "sha256-FHIyWhbwsb2r7SH6SDk3KWSURhApTOJoGyBZ7cZU8rM=" + }, + "org/eclipse/ee4j#project/1.0.2": { + "pom": "sha256-dJWgenl+iOQ8O8GodCG9ix/FXjIpH6GOTjLYAx3chz8=" + }, + "org/eclipse/ee4j#project/1.0.5": { + "pom": "sha256-kWtHlNjYIgpZo/32pk2+eUrrIzleiIuBrjaptaLFkaY=" + }, + "org/glassfish/jaxb#jaxb-bom/2.3.2": { + "pom": "sha256-oQGLtUZ47Z9ayy96QITjhf9RAgH06dv1913GpnX2a+c=" + }, + "org/glassfish/jaxb#jaxb-runtime/2.3.2": { + "jar": "sha256-5uCh6J+2/3hieeagCC1c71LcLr5nBT0EGABzdlK0/Rs=", + "pom": "sha256-lEilrX+mimCD375PQsjIPggrkgKhBUAfxo6UTCZUizQ=" + }, + "org/glassfish/jaxb#txw2/2.3.2": { + "jar": "sha256-SmqfSDOI1GG4GqmijGhbi3TAWXmTvxiEsE7dvKlfSP4=", + "pom": "sha256-p53QAvsDgYP/KGomNb4uaMEDuH4OZHF9jUS/0Bf9M+o=" + }, + "org/jcodec#jcodec/0.2.5": { + "jar": "sha256-iQMp2tEk6Lc5wdZgKlmlPIpHTa3f8mXCVh4hxJhJbIE=", + "pom": "sha256-MPEyx4bSU6cgrLx3P6gApN+yPI65v3aQu7zGqjPU7oo=" + }, + "org/jdom#jdom2/2.0.6": { + "jar": "sha256-E0XxG6YG0VYD1nQFUajCGUfAIVZAdw7GcnH+eL6pfPU=", + "pom": "sha256-R7I6ef4za3QbgkNMbgSdaBZSVuQF51wQkh/XL6imXY0=" + }, + "org/jetbrains#annotations/13.0": { + "jar": "sha256-rOKhDcji1f00kl7KwD5JiLLA+FFlDJS4zvSbob0RFHg=", + "pom": "sha256-llrrK+3/NpgZvd4b96CzuJuCR91pyIuGN112Fju4w5c=" + }, + "org/jetbrains#annotations/23.0.0": { + "jar": "sha256-ew8ZckCCy/y8ZuWr6iubySzwih6hHhkZM+1DgB6zzQU=", + "pom": "sha256-yUkPZVEyMo3yz7z990P1P8ORbWwdEENxdabKbjpndxw=" + }, + "org/jetbrains/intellij/deps#trove4j/1.0.20200330": { + "jar": "sha256-xf1yW/+rUYRr88d9sTg8YKquv+G3/i8A0j/ht98KQ50=", + "pom": "sha256-h3IcuqZaPJfYsbqdIHhA8WTJ/jh1n8nqEP/iZWX40+k=" + }, + "org/jetbrains/kotlin#kotlin-reflect/1.9.20": { + "jar": "sha256-SbZvmonVD9KVTC6K6sgOT0iLCgkyKiXvrWJhV2cT3A8=", + "pom": "sha256-lCtehgLTF+wTZS8cAiIFK7kIF/KM9v6dRxEvCbPo5n0=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-common/1.9.10": { + "jar": "sha256-zeM0G6GKK6JisLfPbFWyDJDo1DTkLJoT5qP3cNuWWog=", + "pom": "sha256-fUtwVHkQZ2s738iSWojztr+yRYLJeEVCgFVEzu9JCpI=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.8.21": { + "pom": "sha256-m7EH1dXjkwvFl38AekPNILfSTZGxweUo6m7g8kjxTTY=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.9.10": { + "jar": "sha256-rGNhv5rR7TgsIQPZcSxHzewWYjK0kD7VluiHawaBybc=", + "pom": "sha256-x/pnx5YTILidhaPKWaLhjCxlhQhFWV3K5LRq9pRe3NU=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.9.20": { + "jar": "sha256-xUUdZ6J/M6/QmRPGfhzro4l65wiEsk7w/3EVflW2CGU=", + "pom": "sha256-AS4cVe1q3kF7y4JBEuvqaCrWJd++4WCFw3nM+hT68DM=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.8.21": { + "pom": "sha256-ODnXKNfDCaXDaLAnC0S08ceHj/XKXTKpogT6o0kUWdg=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.9.10": { + "jar": "sha256-pMdNlNZM4avlN2D+A4ndlB9vxVjQ2rNeR8CFoR7IDyg=", + "pom": "sha256-X0uU3TBlp3ZMN/oV3irW2B9A1Z+Msz8X0YHGOE+3py4=" + }, + "org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.9.20": { + "jar": "sha256-+DP8yU8LscMbnni9S9p+oj9Xn/NAiuGpTi61dHCGoqs=", + "pom": "sha256-o7B96wkfKu1Z1lWYhPRPmc/135ufo1okvNa4sGnP9I0=" + }, + "org/jetbrains/kotlin#kotlin-stdlib/1.8.21": { + "pom": "sha256-/gzZ4yGT5FMzP9Kx9XfmYvtavGkHECu5Z4F7wTEoD9c=" + }, + "org/jetbrains/kotlin#kotlin-stdlib/1.9.10": { + "jar": "sha256-VemJxRK4CQd5n4VDCfO8d4LFs9E5MkQtA3nVxHJxFQQ=", + "pom": "sha256-fin79z/fceBnnT3ufmgP1XNGT6AWRKT1irgZ0sCI09I=" + }, + "org/jetbrains/kotlin#kotlin-stdlib/1.9.20": { + "jar": "sha256-KKNbzf9G2GT4DzRqYX5IYoSyCNFzeMQZAN+x3pWpDmw=", + "module": "sha256-3Mql0xVHD6s5IFAohru4Xy2myGECxl2cBEEFRO7bIBk=", + "pom": "sha256-43IWpzLI6Bqf0FtN2JLDDKwMrXtOP9ovlmP0jogHQcA=" + }, + "org/jmdns#jmdns/3.5.9": { + "jar": "sha256-hoGOY4KgffYBP7sRPTy+7bE22A43cun25HhP8FiN2e8=", + "pom": "sha256-nLQuc1ugkH8azqRHX3voQWYHs1Rpw/5jMDg1XhHh8Ao=" + }, + "org/junit#junit-bom/5.9.2": { + "module": "sha256-qxN7pajjLJsGa/kSahx23VYUtyS6XAsCVJdyten0zx8=", + "pom": "sha256-LtB9ZYRRMfUzaoZHbJpAVrWdC1i5gVqzZ5uw82819wU=" + }, + "org/junit#junit-bom/5.9.3": { + "module": "sha256-tAH9JZAeWCpSSqU0PEs54ovFbiSWHBBpvytLv87ka5M=", + "pom": "sha256-TQMpzZ5y8kIOXKFXJMv+b/puX9KIg2FRYnEZD9w0Ltc=" + }, + "org/jvnet/staxex#stax-ex/1.8.1": { + "jar": "sha256-IFIlSQVunlCqNe8LRFouR6U9Br4LCpRn1wTiSD/7BJo=", + "pom": "sha256-j8hPNs5tps6MiTtlOBmaf2mmmgcG2bF6PuajoJRS7tY=" + }, + "org/ow2#ow2/1.5.1": { + "pom": "sha256-Mh3bt+5v5PU96mtM1tt0FU1r+kI5HB92OzYbn0hazwU=" + }, + "org/ow2/asm#asm-analysis/9.6": { + "jar": "sha256-2Sgy18N+3AfGDiVZrGEYsx1kLjN6ZnHty3up+uaO27s=", + "pom": "sha256-+j+ZUCHP9PQTkwbmz/7uoHU5EGRA0psZzAanpjahOFA=" + }, + "org/ow2/asm#asm-commons/9.6": { + "jar": "sha256-eu/Q1cCQFwHGn3UT/tp2X7a+M68s56oXxXgfyHZXxRE=", + "pom": "sha256-qYrkiVM0uvj/hr1mUWIQ29mgPxpuFeR92oKvz2tT13w=" + }, + "org/ow2/asm#asm-tree/9.6": { + "jar": "sha256-xD7PF7U5x3fhXae1uGVTs3fi05poPeYoVWfVKDiI5+8=", + "pom": "sha256-G8tIHX/Ba5VbtgygfIz6JCS87ni9xAW7oxx9b13C0RM=" + }, + "org/ow2/asm#asm-util/9.6": { + "jar": "sha256-xjWnQC9Kqb9msvQjDOpiAloP4c1j6HKa3vybGZT6xMM=", + "pom": "sha256-UsXB01dAR3nRqZtJqFv506CFAluFFstz2+93yK40AF4=" + }, + "org/ow2/asm#asm/9.6": { + "jar": "sha256-PG+sJCTbPUqFO2afTj0dnDxVIjXhmjGWc/iHCDwjA6E=", + "pom": "sha256-ku7iS8PIQ+SIHUbB3WUFRx7jFC+s+0ZrQoz+paVsa2A=" + }, + "org/slf4j#slf4j-api/1.7.30": { + "jar": "sha256-zboHlk0btAoHYUhcax6ML4/Z6x0ZxTkorA1/lRAQXFc=", + "pom": "sha256-fgdHdR6bZ+Gdy1IG8E6iLMA9JQxCJCZALq3QNRPywxQ=" + }, + "org/slf4j#slf4j-api/2.0.7": { + "jar": "sha256-XWKYuToZBcMs2mR4gIrBTC1KR+kVNeU8Qff+64XZRvQ=", + "pom": "sha256-LUA8zw4KAtXBqGZ7DiozyN/GA4qyh7lnHdaBwgUmeYE=" + }, + "org/slf4j#slf4j-parent/1.7.30": { + "pom": "sha256-EWR5VuSKDFv7OsM/bafoPzQQAraFfv0zWlBbaHvjS3U=" + }, + "org/slf4j#slf4j-parent/2.0.7": { + "pom": "sha256-wYK7Ns068ck8FgPN/v54iRV9swuotYT0pEU1/NIuRec=" + }, + "org/sonatype/oss#oss-parent/7": { + "pom": "sha256-tR+IZ8kranIkmVV/w6H96ne9+e9XRyL+kM5DailVlFQ=" + }, + "org/sonatype/oss#oss-parent/9": { + "pom": "sha256-+0AmX5glSCEv+C42LllzKyGH7G8NgBgohcFO8fmCgno=" + }, + "org/tensorflow#tensorflow-lite-metadata/0.1.0-rc2": { + "jar": "sha256-LComT4QkmMNtNNKnuRNCSQ2alihiyFuqwazVTsL8ptk=", + "pom": "sha256-mk9eVnQ2bBVskDkWYvA+18WXHWqmODLfdKJx2m/4LpY=" + } + } +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..40702420 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1779560665, + "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..0dcaa69f --- /dev/null +++ b/flake.nix @@ -0,0 +1,160 @@ +{ + description = "Moonlight game streaming client for Android — devShell + hermetic debug-APK build"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + outputs = + { self, nixpkgs }: + let + # Android builds run on Linux hosts; the SDK is x86_64/aarch64-linux only. + systems = [ + "x86_64-linux" + "aarch64-linux" + ]; + forAllSystems = + f: + nixpkgs.lib.genAttrs systems ( + system: + f ( + import nixpkgs { + inherit system; + config = { + allowUnfree = true; # Android SDK components are unfree + android_sdk.accept_license = true; + }; + } + ) + ); + + # Pinned to match app/build.gradle exactly. + ndkVersion = "27.0.12077973"; + buildToolsVersion = "34.0.0"; + platformVersion = "34"; + in + { + # Compose the Android SDK once per system, reused by devShell + package. + legacyPackages = forAllSystems (pkgs: { + androidComposition = pkgs.androidenv.composeAndroidPackages { + platformVersions = [ platformVersion ]; + buildToolsVersions = [ buildToolsVersion ]; + includeNDK = true; + ndkVersions = [ ndkVersion ]; + includeEmulator = false; + includeSystemImages = false; + includeSources = false; + }; + }); + + # `nix develop` — JDK 17 + Android SDK/NDK + gradle, ready for `./gradlew`. + devShells = forAllSystems ( + pkgs: + let + androidSdk = self.legacyPackages.${pkgs.system}.androidComposition.androidsdk; + sdkRoot = "${androidSdk}/libexec/android-sdk"; + in + { + default = pkgs.mkShell { + packages = [ + pkgs.jdk17 + pkgs.gradle + androidSdk + ]; + + ANDROID_HOME = sdkRoot; + ANDROID_SDK_ROOT = sdkRoot; + ANDROID_NDK_ROOT = "${sdkRoot}/ndk/${ndkVersion}"; + JAVA_HOME = pkgs.jdk17.home; + # AGP downloads aapt2 from Maven; that prebuilt won't run on NixOS. + # Point it at the SDK's patched aapt2 instead. + GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2"; + + shellHook = '' + echo "Android SDK: $ANDROID_HOME" + echo "NDK: $ANDROID_NDK_ROOT" + echo "Build the nonRoot debug APK with: ./gradlew assembleNonRootDebug" + ''; + }; + } + ); + + # `nix build` — hermetic, offline debug APK build via gradle's mitm-cache. + packages = forAllSystems ( + pkgs: + let + androidSdk = self.legacyPackages.${pkgs.system}.androidComposition.androidsdk; + sdkRoot = "${androidSdk}/libexec/android-sdk"; + in + { + default = self.packages.${pkgs.system}.moonlight-android; + + moonlight-android = pkgs.stdenv.mkDerivation (finalAttrs: { + pname = "moonlight-android"; + version = "12.1"; + + # The repo, including the moonlight-common-c + enet submodules that must + # already be checked out (git submodule update --init --recursive). + src = ./.; + + nativeBuildInputs = [ + pkgs.gradle + pkgs.jdk17 + androidSdk + ]; + + # Offline Maven dependency cache. Regenerate deps.json with: + # nix build .#moonlight-android.mitmCache.updateScript && ./result + mitmCache = pkgs.gradle.fetchDeps { + inherit (finalAttrs) pname; + pkg = finalAttrs.finalPackage; + data = ./deps.json; + }; + + gradleBuildTask = "assembleNonRootDebug"; + + ANDROID_HOME = sdkRoot; + ANDROID_SDK_ROOT = sdkRoot; + ANDROID_NDK_ROOT = "${sdkRoot}/ndk/${ndkVersion}"; + + gradleFlags = [ + "-Dorg.gradle.java.home=${pkgs.jdk17.home}" + # Use the SDK's runnable aapt2 instead of the Maven prebuilt. + "-Pandroid.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2" + # Skip resolving androidTest/test classpaths during dependency capture + # (AGP variant ambiguity on the self-referenced app project). + "--init-script" + "nix-deps-fixup.gradle" + ]; + + postPatch = '' + # Tell Gradle where the SDK lives without relying on env detection. + echo "sdk.dir=${sdkRoot}" > local.properties + ''; + + # The debug build type auto-signs with a debug keystore that lands in + # $HOME/.android; the build sandbox's HOME is read-only, so redirect it. + preBuild = '' + export ANDROID_USER_HOME="$NIX_BUILD_TOP/.android" + export HOME="$NIX_BUILD_TOP/home" + mkdir -p "$ANDROID_USER_HOME" "$HOME" + ''; + + doCheck = false; + + installPhase = '' + runHook preInstall + mkdir -p "$out" + find app/build/outputs/apk -name '*.apk' -exec cp -v {} "$out/" \; + runHook postInstall + ''; + + meta = { + description = "Moonlight game streaming client for Android (nonRoot debug APK)"; + homepage = "https://github.com/moonlight-stream/moonlight-android"; + license = pkgs.lib.licenses.gpl3Only; + platforms = systems; + }; + }); + } + ); + }; +} diff --git a/nix-deps-fixup.gradle b/nix-deps-fixup.gradle new file mode 100644 index 00000000..dec2e086 --- /dev/null +++ b/nix-deps-fixup.gradle @@ -0,0 +1,21 @@ +// Workaround for the nixpkgs Gradle mitm-cache hook. +// +// The hook's `nixDownloadDeps` task force-resolves every resolvable configuration +// to record all dependencies. AGP's androidTest/test classpaths reference the app +// project itself and cannot disambiguate its published variants, so resolving them +// throws a "cannot choose between the following variants of project :app" error and +// aborts dependency capture. +// +// The hermetic build target is `assembleNonRootDebug`, which never compiles tests, +// so we mark every test configuration as non-resolvable. `nixDownloadDeps` filters +// on `canBeResolved`, so these are simply skipped, and the real build does not touch +// them either. +gradle.projectsLoaded { + rootProject.allprojects { proj -> + proj.afterEvaluate { + proj.configurations + .matching { it.name.toLowerCase().contains("test") } + .all { it.setCanBeResolved(false) } + } + } +}