Full Code of ImranR98/Obtainium for AI

main cfde2c43d2c8 cached
131 files
1.3 MB
338.8k tokens
541 symbols
1 requests
Download .txt
Showing preview only (1,349K chars total). Download the full file or copy to clipboard to get everything.
Repository: ImranR98/Obtainium
Branch: main
Commit: cfde2c43d2c8
Files: 131
Total size: 1.3 MB

Directory structure:
gitextract_y1uaf0sy/

├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── fastlane.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│   └── launch.json
├── LICENSE.md
├── README.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle.kts
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── debug/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── res/
│   │       │       └── values/
│   │       │           └── string.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── dev/
│   │       │   │       └── imranr/
│   │       │   │           └── obtainium/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   ├── ic_launcher_foreground.xml
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   ├── ic_launcher.xml
│   │       │       │   └── ic_launcher_round.xml
│   │       │       ├── raw/
│   │       │       │   └── keep.xml
│   │       │       ├── values/
│   │       │       │   ├── colors.xml
│   │       │       │   ├── string.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           ├── file_paths.xml
│   │       │           └── locales_config.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle.kts
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle.kts
├── assets/
│   ├── ca/
│   │   └── lets-encrypt-r3.pem
│   ├── graphics/
│   │   └── obtainium.psd
│   └── translations/
│       ├── ar.json
│       ├── bs.json
│       ├── ca.json
│       ├── cs.json
│       ├── da.json
│       ├── de.json
│       ├── en-EO.json
│       ├── en.json
│       ├── es.json
│       ├── fa.json
│       ├── fr.json
│       ├── gl.json
│       ├── hu.json
│       ├── id.json
│       ├── it.json
│       ├── ja.json
│       ├── ko.json
│       ├── ml.json
│       ├── nl.json
│       ├── package.json
│       ├── pl.json
│       ├── pt-BR.json
│       ├── pt.json
│       ├── ru.json
│       ├── standardize.mjs
│       ├── sv.json
│       ├── tr.json
│       ├── uk.json
│       ├── vi.json
│       ├── zh-Hant-TW.json
│       └── zh.json
├── build.sh
├── docker/
│   ├── Dockerfile
│   ├── builder.sh
│   └── mkbuilder.sh
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── de/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           ├── en-US/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           └── ru-RU/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── lib/
│   ├── app_sources/
│   │   ├── apkcombo.dart
│   │   ├── apkmirror.dart
│   │   ├── apkpure.dart
│   │   ├── aptoide.dart
│   │   ├── codeberg.dart
│   │   ├── coolapk.dart
│   │   ├── directAPKLink.dart
│   │   ├── farsroid.dart
│   │   ├── fdroid.dart
│   │   ├── fdroidrepo.dart
│   │   ├── github.dart
│   │   ├── gitlab.dart
│   │   ├── html.dart
│   │   ├── huaweiappgallery.dart
│   │   ├── izzyondroid.dart
│   │   ├── jenkins.dart
│   │   ├── liteapks.dart
│   │   ├── mullvad.dart
│   │   ├── neutroncode.dart
│   │   ├── rockmods.dart
│   │   ├── rustore.dart
│   │   ├── sourceforge.dart
│   │   ├── sourcehut.dart
│   │   ├── telegramapp.dart
│   │   ├── tencent.dart
│   │   ├── uptodown.dart
│   │   └── vivoappstore.dart
│   ├── components/
│   │   ├── custom_app_bar.dart
│   │   ├── generated_form.dart
│   │   └── generated_form_modal.dart
│   ├── custom_errors.dart
│   ├── main.dart
│   ├── main_fdroid.dart
│   ├── mass_app_sources/
│   │   └── githubstars.dart
│   ├── pages/
│   │   ├── add_app.dart
│   │   ├── app.dart
│   │   ├── apps.dart
│   │   ├── home.dart
│   │   ├── import_export.dart
│   │   └── settings.dart
│   └── providers/
│       ├── apps_provider.dart
│       ├── logs_provider.dart
│       ├── native_provider.dart
│       ├── notifications_provider.dart
│       ├── settings_provider.dart
│       └── source_provider.dart
├── pubspec.yaml
├── sign.sh
└── test/
    └── widget_test.dart

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
LICENSE.md
README.md
analysis_options.yaml
android
assets
build
build.sh
data
docker
fastlane
lib
pubspec.lock
pubspec.yaml
sign.sh
test


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Something isn't working right.
title: ''
labels: bug, to check
assignees: ''

---

**Prerequisites**
<!-- Please ensure your request is not part of an existing issue. -->
<!-- Please ensure you have checked the Obtainium Wiki. -->
<!-- Please ensure your request is an actual bug and not intended behaviour (this is frequently the case for issues involving version strings and the HTML source. -->

**Describe the bug**
<!-- A clear and concise description of what the bug is. -->

**To Reproduce**
<!-- Steps to reproduce the behavior:
1. Go to '...'
2. Tap on '....'
3. Scroll down to '....'
4. See error -->

**Screenshots and Logs**
<!-- If applicable, add screenshots, logs, and any other artifacts (like some/all files under `/Android/data/dev.imranr.obtainium/`) that you think may help troubleshoot the issue. -->

**Please complete the following information:**
 - Device: <!-- [e.g. Pixel 7] -->
 - OS: <!-- [e.g. GrapheneOS] -->
 - Obtainium Version: <!-- [e.g. 0.14.6-beta] -->

**Additional context**
<!-- Add any other context about the problem here. -->


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest a new Source, setting, or other feature.
title: ''
labels: enhancement, to check
assignees: ''

---

**Prerequisites**
<!-- Please ensure your request is not part of an existing issue. -->
<!-- Please ensure you have checked the Obtainium Wiki. -->

**Describe the feature**
<!-- A clear and concise description of what you want to happen.

For new Sources, please ensure:
1. It is not already possible to use the HTML Source for your purposes.
2. It must be possible to extract the following details from the Source in a reliable way:
- The App version (or any release-specific identifier - a "pseudo-version") for the latest release
- One or more APK URL(s) for the latest release
- Above details for previous releases (optional)

If you're not sure about 1 or 2, open a discussion item instead.
Note that the Web scraper cannot deal with JavaScript-enabled content. -->

**Describe alternatives you've considered (if applicable)**
<!-- A clear and concise description of any alternative solutions or features you've considered.

Note that app-specific Sources are less likely to be added. In those cases, see if the HTML Source will work for you (if not, see if a generally-applicable enhancement to the HTML Source would work, and suggest that instead). -->

**Additional context**
<!-- Add any other context or screenshots about the feature request here. -->


================================================
FILE: .github/workflows/fastlane.yml
================================================
name: Validate Fastlane metadata

on:
  workflow_dispatch:
  push:
      branches: [ "main" ]
  pull_request:
      branches: [ "main" ]

jobs:
  go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Validate Fastlane Supply Metadata
        uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2


================================================
FILE: .github/workflows/release.yml
================================================
name: Build and Release

on:
  workflow_dispatch:
    inputs:
      beta:
        type: boolean
        description: Is beta?

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          channel: stable
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin' # See 'Supported distributions' for available options
          java-version: '21'

      - name: Flutter Doctor
        id: flutter_doctor
        run: |
          flutter doctor -v

      - name: Check submodule
        id: check_submodule
        run: |
          git checkout ${{ inputs.checkout }}

      - name: Extract Version
        id: extract_version      
        run: |
          VERSION=$(grep -oP "^version: [^\+]+" pubspec.yaml | tail -c +10)
          echo "version=$VERSION" >> $GITHUB_OUTPUT
          if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi
          echo "beta=$BETA" >> $GITHUB_OUTPUT
          TAG="v$VERSION"
          echo "tag=$TAG" >> $GITHUB_OUTPUT

      - name: Build APKs
        run: |
          sed -i 's/signingConfig = signingConfigs.getByName("release")//g' android/app/build.gradle.kts
          flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal
          for file in build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done
          flutter build apk --flavor fdroid -t lib/main_fdroid.dart && flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart
          rm ./build/app/outputs/flutter-apk/*.sha1
          cp ./sign.sh ./build/app/outputs/flutter-apk/
          ls -l ./build/app/outputs/flutter-apk/

      - name: Save Unsigned APKs as Action Artifacts
        uses: actions/upload-artifact@v4
        with:
          path: build/app/outputs/flutter-apk/*

      - name: Create Tag
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: ${{ secrets.GH_ACCESS_TOKEN }}
          custom_tag: "${{ steps.extract_version.outputs.tag }}"
          tag_prefix: ""
      
      - name: Create Draft Release
        uses: ncipollo/release-action@v1
        with:
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          tag: "${{ steps.extract_version.outputs.tag }}"
          prerelease: "${{ steps.extract_version.outputs.beta }}"
          draft: "true"
          generateReleaseNotes: true


================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
.vscode/*
!.vscode/launch.json

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
/android/app/.cxx
/android/build/reports
/android/.kotlin

# Custom
TODO.txt
data
node_modules/

================================================
FILE: .gitmodules
================================================
[submodule ".flutter"]
	path = .flutter
	url = https://github.com/flutter/flutter/


================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: "17025dd88227cd9532c33fa78f5250d548d87e9a"
  channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: android
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: ios
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: linux
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: macos
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: web
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
    - platform: windows
      create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
      base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'


================================================
FILE: .vscode/launch.json
================================================
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Obtainium (debug mode)",
            "request": "launch",
            "type": "dart",
            "flutterMode": "debug",
            "program": "lib/main.dart",
            "args": [
                "--flavor",
                "normal"
            ]
        },
        {
            "name": "Obtainium (profile mode)",
            "request": "launch",
            "type": "dart",
            "flutterMode": "profile",
            "program": "lib/main.dart",
            "args": [
                "--flavor",
                "normal"
            ]
        },
        {
            "name": "Obtainium (release mode)",
            "request": "launch",
            "type": "dart",
            "flutterMode": "release",
            "program": "lib/main.dart",
            "args": [
                "--flavor",
                "normal"
            ]
        }
    ]
}

================================================
FILE: LICENSE.md
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
<div align="center"><a href="https://github.com/Safouene1/support-palestine-banner/blob/master/Markdown-pages/Support.md"><img src="https://raw.githubusercontent.com/Safouene1/support-palestine-banner/master/banner-support.svg" alt="Support Palestine" style="width: 100%;"></a></div>

# ![Obtainium Icon](./assets/graphics/icon_small.png) Obtainium

Get Android app updates straight from the source.

Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.

More info:
- [Obtainium Wiki](https://wiki.obtainium.imranr.dev/) ([repository](https://github.com/ImranR98/Obtainium-Wiki))
- [Obtainium 101](https://www.youtube.com/watch?v=0MF_v2OBncw) - Tutorial video
- [AppVerifier](https://github.com/soupslurpr/AppVerifier) - App verification tool (recommended, integrates with Obtainium)
- [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev/) - Crowdsourced app configurations ([repository](https://github.com/ImranR98/apps.obtainium.imranr.dev))
- [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) - Original motivation for this app
- [Website](https://obtainium.imranr.dev) ([repository](https://github.com/ImranR98/obtainium.imranr.dev))
- [Source code](https://github.com/ImranR98/Obtainium)

Currently supported App sources:
- Open Source - General:
  - [GitHub](https://github.com/)
  - [GitLab](https://gitlab.com/)
  - [Forgejo](https://forgejo.org/) ([Codeberg](https://codeberg.org/))
  - [F-Droid](https://f-droid.org/)
  - Third Party F-Droid Repos
  - [IzzyOnDroid](https://android.izzysoft.de/)
  - [SourceHut](https://git.sr.ht/)
- Other - General:
  - [APKPure](https://apkpure.net/)
  - [Aptoide](https://aptoide.com/)
  - [Uptodown](https://uptodown.com/)
  - [Huawei AppGallery](https://appgallery.huawei.com/)
  - [Tencent App Store](https://sj.qq.com/)
  - [vivo App Store (CN)](https://h5.appstore.vivo.com.cn/)
  - [RuStore](https://rustore.ru/)
  - [Farsroid](https://www.farsroid.com)
  - [CoolApk](https://coolapk.com/)
  - [RockMods](https://rockmods.net/)
  - [LiteAPKs](https://liteapks.com/)
  - Jenkins Jobs
  - [APKMirror](https://apkmirror.com/) (Track-Only)
- Other - App-Specific:
  - [Telegram App](https://telegram.org/)
  - [Neutron Code](https://neutroncode.com/)
- Direct APK Link
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files

## Finding App Configurations

You can find crowdsourced app configurations at [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev).

If you can't find the configuration for an app you want, feel free to leave a request on the [discussions page](https://github.com/ImranR98/apps.obtainium.imranr.dev/discussions/new?category=app-requests).

Or, contribute some configurations to the website by creating a PR at [this repo](https://github.com/ImranR98/apps.obtainium.imranr.dev).

## Installation

[<img src="https://github.com/machiav3lli/oandbackupx/blob/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png"
    alt="Get it on GitHub"
    height="80">](https://github.com/ImranR98/Obtainium/releases)
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png"
     alt="Get it on IzzyOnDroid"
     height="80">](https://apt.izzysoft.de/fdroid/index/apk/dev.imranr.obtainium)
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
    alt="Get it on F-Droid"
    height="80">](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/)
     
Verification info:
- Package ID: `dev.imranr.obtainium`
- SHA-256 hash of signing certificate: `B3:53:60:1F:6A:1D:5F:D6:60:3A:E2:F5:0B:E8:0C:F3:01:36:7B:86:B6:AB:8B:1F:66:24:3D:A9:6C:D5:73:62`
  - Note: The above signature is also valid for the F-Droid flavour of Obtainium, thanks to [reproducible builds](https://f-droid.org/docs/Reproducible_Builds/).
- [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) (to verify APK hashes)

## Limitations
- For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.

## Screenshots

| <img src="./assets/screenshots/1.apps.png" alt="Apps Page" /> | <img src="./assets/screenshots/2.dark_theme.png" alt="Dark Theme" />           | <img src="./assets/screenshots/3.material_you.png" alt="Material You" />    |
| ------------------------------------------------------ | ----------------------------------------------------------------------- | -------------------------------------------------------------------- |
| <img src="./assets/screenshots/4.app.png" alt="App Page" />   | <img src="./assets/screenshots/5.app_opts.png" alt="App Options" /> | <img src="./assets/screenshots/6.app_webview.png" alt="App Web View" /> |


================================================
FILE: analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
  # The lint rules applied to this project can be customized in the
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  # included above or to enable additional rules. A list of all available lints
  # and their documentation is published at https://dart.dev/lints.
  #
  # Instead of disabling a lint rule for the entire project in the
  # section below, it can also be suppressed for a single line of code
  # or a specific dart file by using the `// ignore: name_of_lint` and
  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  # producing the lint.
  rules:
    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options


================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java

# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks


================================================
FILE: android/app/build.gradle.kts
================================================
import java.io.FileInputStream
import java.util.Properties
import com.android.build.api.variant.FilterConfiguration.FilterType.*
import com.android.build.gradle.internal.api.ApkVariantOutputImpl

plugins {
    id("com.android.application")
    id("kotlin-android")
    // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
    id("dev.flutter.flutter-gradle-plugin")
}

val localProperties = Properties()
val localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
    localPropertiesFile.reader(Charsets.UTF_8).use { reader ->
        localProperties.load(reader)
    }
}

var flutterVersionCode = localProperties.getProperty("flutter.versionCode") ?: "1"
var flutterVersionName = localProperties.getProperty("flutter.versionName") ?: "1.0"

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
val keystorePropertiesExists = keystorePropertiesFile.exists()
if (keystorePropertiesExists) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    namespace = "dev.imranr.obtainium"
    compileSdk = flutter.compileSdkVersion
    ndkVersion = "28.2.13676358"

    compileOptions {
        isCoreLibraryDesugaringEnabled = true
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_17.toString()
    }

    defaultConfig {
        applicationId = "dev.imranr.obtainium"
        // You can update the following values to match your application needs.
        // For more information, see: https://flutter.dev/to/review-gradle-config.
        minSdk = 24
        targetSdk = flutter.targetSdkVersion
        versionCode = flutterVersionCode.toInt()
        versionName = flutterVersionName
    }

    flavorDimensions += "default"

    productFlavors {
        create("normal") {
            dimension = "default"
            applicationIdSuffix = ""
        }
        create("fdroid") {
            dimension = "default"
            applicationIdSuffix = ".fdroid"
        }
    }

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String?
            keyPassword = keystoreProperties["keyPassword"] as String?
            storeFile = keystoreProperties["storeFile"]?.let { file(it) }
            storePassword = keystoreProperties["storePassword"] as String?
        }
    }

    buildTypes {
        getByName("release") {
            val releaseSigningConfig = signingConfigs.getByName("release")
            signingConfig = if (keystorePropertiesExists && releaseSigningConfig.storeFile != null) {
                releaseSigningConfig
            } else {
                if (gradle.startParameter.taskNames.any { it.contains("release", ignoreCase = true) }) {
                    logger.error(
                        """
                            WARNING: You are trying to create a release build, but a key.properties file was not found.
                                     You will need to sign the APKs separately.

                            To sign a release build automatically, a keystore properties file is required.

                            The following is an example configuration.
                            Create a file named [project]/android/key.properties that contains a reference to your keystore.
                            Don't include the angle brackets (< >). They indicate that the text serves as a placeholder for your values.

                            storePassword=<keystore password>
                            keyPassword=<key password>
                            keyAlias=<key alias>
                            storeFile=<keystore file location>

                            For more info, see:
                            * https://docs.flutter.dev/deployment/android#sign-the-app
                        """.trimIndent()
                    )
                }
                null
            }
        }
        getByName("debug") {
            applicationIdSuffix = ".debug"
            versionNameSuffix = "-debug"
        }
    }
}

val abiCodes = mapOf("x86_64" to 1, "armeabi-v7a" to 2, "arm64-v8a" to 3)

android.applicationVariants.configureEach {
    val variant = this
    variant.outputs.forEach { output ->
        val abiVersionCode = abiCodes[output.filters.find { it.filterType == "ABI" }?.identifier]
        if (abiVersionCode != null) {
            (output as ApkVariantOutputImpl).versionCodeOverride = variant.versionCode * 10 + abiVersionCode
        }
    }
}


dependencies {
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
}

flutter {
    source = "../.."
}


================================================
FILE: android/app/proguard-rules.pro
================================================
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

##---------------End: proguard configuration for Gson  ----------

================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dev.imranr.obtainium">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/app/src/debug/res/values/string.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="label">Obtainium Debug</string>
</resources>

================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="dev.imranr.obtainium">
    <application
        android:label="@string/label"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true"
        android:localeConfig="@xml/locales_config">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action
                    android:name="com.android_package_installer.content.SESSION_API_PACKAGE_INSTALLED"
                    android:exported="false" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="obtainium" />
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        <provider
            android:name="rikka.shizuku.ShizukuProvider"
            android:authorities="${applicationId}.shizuku"
            android:multiprocess="false"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
        <service 
            android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
            android:foregroundServiceType="specialUse"
            android:exported="false" />
        <meta-data
            android:name="dev.imranr.obtainium.service.NOTIFICATION_ICON"
            android:resource="@drawable/ic_notification" />
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
    <uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP"/>
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
    <!-- Required to query activities that can process text, see:
         https://developer.android.com/training/package-visibility and
         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.

         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>


================================================
FILE: android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt
================================================
package dev.imranr.obtainium

import io.flutter.embedding.android.FlutterActivity

class MainActivity : FlutterActivity()


================================================
FILE: android/app/src/main/res/drawable/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"
    android:viewportWidth="142.129"
    android:viewportHeight="142.129"
    android:width="108dp"
    android:height="108dp">
    <group
        android:translateX="-30.39437"
        android:translateY="-54.68043">
        <path
            android:pathData="M109.8808 153.22596c-0.73146 -0.38777 -5.00657 -2.75679 -25.032416 -13.87149 -5.57273 -3.09297 -10.93823 -6.06723 -11.92332 -6.60948 -2.23728 -1.23152 -2.58105 -1.53456 -2.58105 -2.27528 0 -0.3879 0.89293 -2.87231 2.98561 -8.30689 1.64209 -4.2644 3.09426 -8.0014 3.22705 -8.30444 0.3024 -0.69008 0.78972 -1.27621 1.26573 -1.52236 0.44558 -0.23042 11.58052 -4.29685 12.14814 -4.43644 0.61355 -0.1509 1.1428 0.13977 1.45487 0.79901 0.14976 0.31638 0.77213 1.94934 1.38303 3.6288 0.6109 1.67945 1.52036 4.16275 2.02104 5.51844 1.14709 3.10604 1.18992 3.54589 0.3912 4.01771 -0.2117 0.12505 -1.58874 0.66539 -3.06009 1.20075 -1.47136 0.53536 -2.87533 1.08982 -3.11993 1.23213 -0.56422 0.32826 -0.64913 0.83523 -0.20815 1.24273 0.17523 0.16193 3.00434 1.77571 6.28691 3.58618 9.174936 5.06035 8.665596 4.83136 9.277626 4.17097 0.29987 -0.32356 5.78141 -14.266 6.09596 -15.50521 0.1344 -0.5295 0.11969 -0.60308 -0.16695 -0.83519 -0.39165 -0.31714 -0.335 -0.33071 -3.93797 0.9431 -3.56937 1.26192 -3.90926 1.28864 -4.38744 0.34488 -0.25108 -0.49556 -4.095796 -11.05481 -4.334456 -11.90432 -0.15438 -0.5495 0.0344 -1.0717 0.49701 -1.37482 0.19228 -0.12598 2.990116 -1.19935 6.217406 -2.38526 4.78924 -1.75986 6.0081 -2.15842 6.63117 -2.16837 0.8037 -0.0128 0.90917 0.0424 15.64514 8.19599 1.02104 0.56495 1.56579 1.15961 1.56579 1.70925 0 0.21814 -3.6538 9.91011 -8.11957 21.53771 -6.2982 16.39877 -8.19916 21.21114 -8.4744 21.45338 -0.46789 0.41179 -0.8512 0.39392 -1.74794 -0.0815z"
            android:strokeWidth="0.139">
            <aapt:attr
                name="android:fillColor">
                <gradient
                    android:startX="76.74697"
                    android:startY="113.4246"
                    android:endX="110.6445"
                    android:endY="152.5006"
                    android:tileMode="clamp">
                    <item
                        android:color="#9B58DC"
                        android:offset="0" />
                    <item
                        android:color="#321C92"
                        android:offset="1" />
                </gradient>
            </aapt:attr>
            <aapt:attr
                name="android:strokeColor">
                <gradient
                    android:startX="76.74697"
                    android:startY="113.4246"
                    android:endX="110.6445"
                    android:endY="152.5006"
                    android:tileMode="clamp">
                    <item
                        android:color="#9B58DC"
                        android:offset="0" />
                    <item
                        android:color="#321C92"
                        android:offset="1" />
                </gradient>
            </aapt:attr>
        </path>
    </group>
</vector>

================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?android:colorBackground" />

    <!-- You can insert your own image assets here -->
    <!-- <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/launch_image" />
    </item> -->
</layer-list>


================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@color/ic_launcher_background"/>
  <foreground android:drawable="@drawable/ic_launcher_foreground"/>
  <monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>


================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
  <background android:drawable="@color/ic_launcher_background"/>
  <foreground android:drawable="@drawable/ic_launcher_foreground"/>
  <monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>


================================================
FILE: android/app/src/main/res/raw/keep.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/*" />

================================================
FILE: android/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#FFFFFF</color>
</resources>

================================================
FILE: android/app/src/main/res/values/string.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="label">Obtainium</string>
</resources>

================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             the Flutter engine draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.

         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>


================================================
FILE: android/app/src/main/res/xml/file_paths.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/dev.imranr.obtainium/" name="files_root" />
    <external-path path="." name="external_storage_root" />
    <external-path name="external_files" path="."/>
</paths>

================================================
FILE: android/app/src/main/res/xml/locales_config.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
    <locale android:name="bs"/>
    <locale android:name="cs"/>
    <locale android:name="de"/>
    <locale android:name="en"/>
    <locale android:name="es"/>
    <locale android:name="fa"/>
    <locale android:name="fr"/>
    <locale android:name="hu"/>
    <locale android:name="it"/>
    <locale android:name="ja"/>
    <locale android:name="nl"/>
    <locale android:name="pl"/>
    <locale android:name="pt"/>
    <locale android:name="ru"/>
    <locale android:name="sv"/>
    <locale android:name="tr"/>
    <locale android:name="uk"/>
    <locale android:name="vi"/>
    <locale android:name="zh"/>
</locale-config>


================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dev.imranr.obtainium">
    <!-- The INTERNET permission is required for development. Specifically,
         the Flutter tool needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/build.gradle.kts
================================================
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

val newBuildDir: Directory =
    rootProject.layout.buildDirectory
        .dir("../../build")
        .get()
rootProject.layout.buildDirectory.value(newBuildDir)

subprojects {
    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
    project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register<Delete>("clean") {
    delete(rootProject.layout.buildDirectory)
}


================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip


================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true


================================================
FILE: android/settings.gradle.kts
================================================
pluginManagement {
    val flutterSdkPath =
        run {
            val properties = java.util.Properties()
            file("local.properties").inputStream().use { properties.load(it) }
            val flutterSdkPath = properties.getProperty("flutter.sdk")
            require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
            flutterSdkPath
        }

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
    id("com.android.application") version "8.11.1" apply false
    id("org.jetbrains.kotlin.android") version "2.2.20" apply false
}

include(":app")

================================================
FILE: assets/ca/lets-encrypt-r3.pem
================================================
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----


================================================
FILE: assets/translations/ar.json
================================================
{
    "invalidURLForSource": "رابط تطبيق {} غير صالح",
    "noReleaseFound": "تعذر العثور على إصدار مناسب",
    "noVersionFound": "تعذر تحديد إصدار التطبيق",
    "urlMatchesNoSource": "الرابط لا يتطابق مع مصدر معروف",
    "cantInstallOlderVersion": "لا يمكن تثبيت إصدار أقدم من التطبيق",
    "appIdMismatch": "معرّف الحزمة المحملة لا يتطابق مع معرّف التطبيق الحالي",
    "functionNotImplemented": "هذه الوظيفة غير مطبقة في هذا الصنف",
    "placeholder": "عنصر نائب",
    "someErrors": "حدثت بعض الأخطاء",
    "unexpectedError": "خطأ غير متوقع",
    "ok": "موافق",
    "and": "و",
    "githubPATLabel": "رمز الوصول الشخصي لـ GitHub (يزيد من الحد المسموح)",
    "includePrereleases": "تضمين الإصدارات الأولية",
    "fallbackToOlderReleases": "الرجوع إلى الإصدارات الأقدم",
    "filterReleaseTitlesByRegEx": "تصفية عناوين الإصدارات باستخدام تعبير نمطي",
    "invalidRegEx": "تعبير نمطي غير صالح",
    "noDescription": "لا يوجد وصف",
    "cancel": "ألغِ",
    "continue": "استمر",
    "requiredInBrackets": "(مطلوب)",
    "dropdownNoOptsError": "خطأ: يجب أن يحتوي القائمة المنسدلة على خيار واحد على الأقل",
    "colour": "لون",
    "standard": "قياسي",
    "custom": "مخصّص",
    "useMaterialYou": "استخدم Material You",
    "githubStarredRepos": "مستودعات GitHub المفضلة",
    "uname": "اسم المستخدم",
    "wrongArgNum": "عدد وسائط غير صحيح",
    "xIsTrackOnly": "{} للتعقب فقط",
    "source": "المصدر",
    "app": "التطبيق",
    "appsFromSourceAreTrackOnly": "تطبيقات هذا المصدر للتعقب فقط.",
    "youPickedTrackOnly": "لقد اخترت خيار 'التعقب فقط'.",
    "trackOnlyAppDescription": "سيتم تعقب التطبيق للتحديثات، لكن Obtainium لن يتمكن من تنزيله أو تثبيته.",
    "cancelled": "أُلغيَ",
    "appAlreadyAdded": "التطبيق مُضاف بالفعل",
    "alreadyUpToDateQuestion": "التطبيق محدَّث بالفعل؟",
    "addApp": "أضف تطبيق",
    "appSourceURL": "رابط مصدر التطبيق",
    "error": "خطأ",
    "add": "أضف",
    "searchSomeSourcesLabel": "بحث (بعض المصادر فقط)",
    "search": "بحث",
    "additionalOptsFor": "خيارات إضافية لـ {}",
    "supportedSources": "المصادر المدعومة",
    "trackOnlyInBrackets": "(للتعقب فقط)",
    "searchableInBrackets": "(قابل للبحث)",
    "appsString": "التطبيقات",
    "noApps": "لا توجد تطبيقات",
    "noAppsForFilter": "لا توجد تطبيقات تطابق التصفية",
    "byX": "بواسطة {}",
    "percentProgress": "التقدم: {}%",
    "pleaseWait": "يُرجى الانتظار",
    "updateAvailable": "يتوفر تحديث",
    "notInstalled": "غير مثبت",
    "pseudoVersion": "إصدار وهمي",
    "selectAll": "حدّد الكل",
    "deselectX": "ألغِ تحديد {}",
    "xWillBeRemovedButRemainInstalled": "سيتم إزالة {} من Obtainium لكنه سيظل مثبتًا على الجهاز.",
    "removeSelectedAppsQuestion": "إزالة التطبيقات المحددة؟",
    "removeSelectedApps": "أزل التطبيقات المحددة",
    "updateX": "حدِّث {}",
    "installX": "ثبِّت {}",
    "markXTrackOnlyAsUpdated": "علِّم {}\n(للتعقب فقط)\nكمحدث",
    "changeX": "غيِّر {}",
    "installUpdateApps": "ثبِّت/حدِّث التطبيقات",
    "installUpdateSelectedApps": "ثبِّت/حدِّث التطبيقات المحددة",
    "markXSelectedAppsAsUpdated": "تعليم {} تطبيقات محددة كمحدثة؟",
    "no": "لا",
    "yes": "نعم",
    "markSelectedAppsUpdated": "علِّم التطبيقات المحددة كمحدثة",
    "pinToTop": "تدبيس في الأعلى",
    "unpinFromTop": "ألغِ التدبيس من الأعلى",
    "resetInstallStatusForSelectedAppsQuestion": "صفّر حالة التثبيت للتطبيقات المحددة؟",
    "installStatusOfXWillBeResetExplanation": "سيتم تصفير حالة التثبيت لأي تطبيقات محددة.\n\nقد يساعد هذا عندما يكون إصدار التطبيق المعروض في Obtainium غير صحيح بسبب فشل التحديثات أو مشاكل أخرى.",
    "customLinkMessage": "هذه الروابط تعمل على الأجهزة التي بها Obtainium مثبتًا",
    "shareAppConfigLinks": "شارك تضبيط التطبيق كرابط HTML",
    "shareSelectedAppURLs": "شارك روابط التطبيقات المحددة",
    "resetInstallStatus": "صفّر حالة التثبيت",
    "more": "المزيد",
    "removeOutdatedFilter": "أزل تصفية التطبيقات غير المحدثة",
    "showOutdatedOnly": "اعرض التطبيقات غير المحدثة فقط",
    "filter": "تصفية",
    "filterApps": "تصفية التطبيقات",
    "appName": "اسم التطبيق",
    "author": "المؤلف",
    "upToDateApps": "تطبيقات محدثة",
    "nonInstalledApps": "تطبيقات غير مثبتة",
    "importExport": "استيراد/تصدير",
    "settings": "الإعدادات",
    "exportedTo": "صُدّر إلى {}",
    "obtainiumExport": "صدّر Obtainium",
    "invalidInput": "إدخال غير صالح",
    "importedX": "استوردت {}",
    "obtainiumImport": "استورد Obtainium",
    "importFromURLList": "استورد من قائمة الروابط",
    "searchQuery": "استعلام البحث",
    "appURLList": "قائمة روابط التطبيقات",
    "line": "سطر",
    "searchX": "بحث {}",
    "noResults": "لا توجد نتائج",
    "importX": "استورد {}",
    "importedAppsIdDisclaimer": "قد تظهر التطبيقات المستوردة بشكل غير صحيح كـ \"غير مثبتة\".\nلإصلاح هذا، ثبتها عبر Obtainium.\nهذا لا يؤثر على بيانات التطبيق.\n\nينطبق فقط على طرق الاستيراد عبر الروابط أو الطرف الثالث.",
    "importErrors": "أخطاء الاستيراد",
    "importedXOfYApps": "استوردت {} من {} تطبيقات.",
    "followingURLsHadErrors": "حدثت أخطاء في الروابط التالية:",
    "selectURL": "حدّد رابطًا",
    "selectURLs": "حدّد روابط",
    "pick": "اختر",
    "theme": "المظهر",
    "dark": "داكن",
    "light": "فاتح",
    "followSystem": "اتبع النظام",
    "followSystemThemeExplanation": "اتبع مظهر النظام ممكن فقط باستخدام تطبيقات طرف ثالث",
    "useBlackTheme": "استخدم المظهر الأسود الداكن بالكامل",
    "appSortBy": "رتّب التطبيقات حسب",
    "authorName": "المؤلف/الاسم",
    "nameAuthor": "الاسم/المؤلف",
    "asAdded": "كما أُضيفت",
    "appSortOrder": "ترتيب التطبيقات",
    "ascending": "تصاعدي",
    "descending": "تنازلي",
    "bgUpdateCheckInterval": "فترة التحقق من التحديثات في الخلفية",
    "neverManualOnly": "أبدًا - يدوي فقط",
    "appearance": "المظهر",
    "showWebInAppView": "عرض صفحة الويب المصدر في عرض التطبيق",
    "pinUpdates": "تدبيس التحديثات في أعلى قائمة التطبيقات",
    "updates": "التحديثات",
    "sourceSpecific": "خاص بالمصدر",
    "appSource": "مصدر التطبيق",
    "noLogs": "لا توجد سجلات",
    "appLogs": "سجلات التطبيق",
    "close": "أغلق",
    "share": "شارك",
    "appNotFound": "التطبيق غير موجود",
    "obtainiumExportHyphenatedLowercase": "تصدير-obtainium",
    "pickAnAPK": "اختر ملف APK",
    "appHasMoreThanOnePackage": "{} يحتوي على أكثر من حزمة:",
    "deviceSupportsXArch": "جهازك يدعم بنية المعالج {}.",
    "deviceSupportsFollowingArchs": "جهازك يدعم بنى المعالج التالية:",
    "warning": "تحذير",
    "sourceIsXButPackageFromYPrompt": "مصدر التطبيق هو '{}' لكن الحزمة تأتي من '{}'. استمر؟",
    "updatesAvailable": "تحديثات متاحة",
    "updatesAvailableNotifDescription": "يخطر المستخدم بوجود تحديثات لواحد أو أكثر من التطبيقات التي يتعقبها Obtainium",
    "noNewUpdates": "لا توجد تحديثات جديدة.",
    "xHasAnUpdate": "{} لديه تحديث.",
    "appsUpdated": "حُدثت التطبيقات",
    "appsNotUpdated": "فشل تحديث التطبيقات",
    "appsUpdatedNotifDescription": "يخطر المستخدم بأن تحديثات لواحد أو أكثر من التطبيقات طبقت في الخلفية",
    "xWasUpdatedToY": "حُدث {} إلى {}.",
    "xWasNotUpdatedToY": "فشل تحديث {} إلى {}.",
    "errorCheckingUpdates": "خطأ في التحقق من التحديثات",
    "errorCheckingUpdatesNotifDescription": "إخطار يظهر عند فشل التحقق من التحديثات في الخلفية",
    "appsRemoved": "تطبيقات مُزالة",
    "appsRemovedNotifDescription": "يخطر المستخدم بأن أُزيل واحد أو أكثر من التطبيقات بسبب أخطاء أثناء تحميلها",
    "xWasRemovedDueToErrorY": "أُزيل {} بسبب هذا الخطأ: {}",
    "completeAppInstallation": "اكمل تثبيت التطبيق",
    "obtainiumMustBeOpenToInstallApps": "يجب فتح Obtainium لتثبيت التطبيقات",
    "completeAppInstallationNotifDescription": "يطلب من المستخدم العودة إلى Obtainium لإكمال تثبيت التطبيق",
    "checkingForUpdates": "جارِ التحقق من التحديثات",
    "checkingForUpdatesNotifDescription": "إخطار مؤقت يظهر عند التحقق من التحديثات",
    "pleaseAllowInstallPerm": "يُرجى السماح لـ Obtainium بتثبيت التطبيقات",
    "trackOnly": "للتعقب فقط",
    "errorWithHttpStatusCode": "خطأ {}",
    "versionCorrectionDisabled": "تعطيل تصحيح الإصدار (يبدو أن الملحق لا يعمل)",
    "unknown": "غير معروف",
    "none": "لا شيء",
    "all": "الكل",
    "never": "أبدًا",
    "latestVersionX": "الأحدث: {}",
    "installedVersionX": "المثبت: {}",
    "lastUpdateCheckX": "آخر تحقق من التحديثات: {}",
    "remove": "أزل",
    "yesMarkUpdated": "نعم، علِّم كمحدث",
    "fdroid": "F-Droid الرسمي",
    "appIdOrName": "معرّف التطبيق أو الاسم",
    "appId": "معرّف التطبيق",
    "appWithIdOrNameNotFound": "لم يُعثر على تطبيق بهذا المعرّف أو الاسم",
    "reposHaveMultipleApps": "قد تحتوي المستودعات على عدة تطبيقات",
    "fdroidThirdPartyRepo": "مستودع F-Droid طرف ثالث",
    "install": "ثبِّت",
    "markInstalled": "علِّم كمثبت",
    "update": "حدِّث",
    "markUpdated": "علِّم كمحدث",
    "additionalOptions": "خيارات إضافية",
    "disableVersionDetection": "عطّل اكتشاف الإصدار",
    "noVersionDetectionExplanation": "يجب استخدام هذا الخيار فقط للتطبيقات التي لا يعمل فيها اكتشاف الإصدار بشكل صحيح.",
    "downloadingX": "جارِ تنزيل {}",
    "downloadX": "تنزيل {}",
    "downloadedX": "نُزَّل {}",
    "releaseAsset": "ملف الإصدار",
    "downloadNotifDescription": "يخطر المستخدم بالتقدم في تنزيل التطبيق",
    "noAPKFound": "لم يُعثر على ملف APK",
    "noVersionDetection": "لا يوجد اكتشاف للإصدار",
    "categorize": "تصنيف",
    "categories": "التصنيفات",
    "category": "تصنيف",
    "noCategory": "بدون تصنيف",
    "noCategories": "لا توجد تصنيفات",
    "deleteCategoriesQuestion": "حذف التصنيفات؟",
    "categoryDeleteWarning": "سيتم تعيين جميع التطبيقات في التصنيفات المحذوفة كغير مصنفة.",
    "addCategory": "أضف تصنيف",
    "label": "تسمية",
    "language": "اللغة",
    "copiedToClipboard": "نُسخ إلى الحافظة",
    "storagePermissionDenied": "رُفض إذن التخزين",
    "selectedCategorizeWarning": "سيؤدي هذا إلى استبدال أي إعدادات تصنيف موجودة للتطبيقات المحددة.",
    "filterAPKsByRegEx": "تصفية ملفات APK باستخدام تعبير نمطي",
    "removeFromObtainium": "أزل من Obtainium",
    "uninstallFromDevice": "ألغِ التثبيت من الجهاز",
    "onlyWorksWithNonVersionDetectApps": "يعمل فقط مع التطبيقات التي عُطّل اكتشاف الإصدار لها.",
    "releaseDateAsVersion": "استخدم تاريخ الإصدار كسلسلة إصدار",
    "releaseTitleAsVersion": "استخدم عنوان الإصدار كسلسلة إصدار",
    "releaseDateAsVersionExplanation": "يجب استخدام هذا الخيار فقط للتطبيقات التي لا يعمل فيها اكتشاف الإصدار بشكل صحيح، ولكن تاريخ الإصدار متاح.",
    "changes": "التغييرات",
    "releaseDate": "تاريخ الإصدار",
    "importFromURLsInFile": "استورد من روابط في ملف (مثل OPML)",
    "versionDetectionExplanation": "تنسيق سلسلة الإصدار مع الإصدار المكتشف من النظام",
    "versionDetection": "اكتشاف الإصدار",
    "standardVersionDetection": "اكتشاف الإصدار القياسي",
    "groupByCategory": "التجميع حسب التصنيف",
    "autoApkFilterByArch": "محاولة تصفية ملفات APK حسب بنية المعالج إذا أمكن",
    "autoLinkFilterByArch": "محاولة تصفية الروابط حسب بنية المعالج إذا أمكن",
    "overrideSource": "تجاوز المصدر",
    "dontShowAgain": "عدم إظهار هذا مرة أخرى",
    "dontShowTrackOnlyWarnings": "عدم إظهار تحذيرات 'للتعقب فقط'",
    "dontShowAPKOriginWarnings": "عدم إظهار تحذيرات مصدر APK",
    "moveNonInstalledAppsToBottom": "نقل التطبيقات غير المثبتة إلى أسفل قائمة التطبيقات",
    "gitlabPATLabel": "رمز الوصول الشخصي لـ GitLab",
    "about": "حول",
    "requiresCredentialsInSettings": "{} يحتاج إلى بيانات اعتماد إضافية (في الإعدادات)",
    "checkOnStart": "التحقق من التحديثات عند البدء",
    "tryInferAppIdFromCode": "محاولة استنتاج معرّف التطبيق من الكود المصدري",
    "removeOnExternalUninstall": "إزالة التطبيقات المثبتة خارجيًا تلقائيًا",
    "pickHighestVersionCode": "تحديد أعلى إصدار تلقائيًا",
    "checkUpdateOnDetailPage": "التحقق من التحديثات عند فتح صفحة التفاصيل",
    "disablePageTransitions": "عطّل انتقالات الصفحات",
    "reversePageTransitions": "اعكس انتقالات الصفحات",
    "minStarCount": "الحد الأدنى لعدد النجوم",
    "addInfoBelow": "أضف هذه المعلومات أدناه.",
    "addInfoInSettings": "أضف هذه المعلومات في الإعدادات.",
    "githubSourceNote": "يمكن تجنب الحد المسموح لـ GitHub باستخدام مفتاح API.",
    "sortByLastLinkSegment": "رتّب حسب الجزء الأخير من الرابط فقط",
    "filterReleaseNotesByRegEx": "تصفية ملاحظات الإصدار باستخدام تعبير نمطي",
    "customLinkFilterRegex": "تصفية روابط APK المخصصة باستخدام تعبير نمطي (افتراضيًا '.apk$')",
    "appsPossiblyUpdated": "حاولَ تحديث التطبيقات",
    "appsPossiblyUpdatedNotifDescription": "يخطر المستخدم بأن تحديثات لواحد أو أكثر من التطبيقات قد طبق في الخلفية",
    "xWasPossiblyUpdatedToY": "{} قد حُدث إلى {}.",
    "enableBackgroundUpdates": "فعِّل التحديثات في الخلفية",
    "backgroundUpdateReqsExplanation": "قد لا تكون التحديثات في الخلفية مفعّلة لجميع التطبيقات.",
    "backgroundUpdateLimitsExplanation": "يمكن تحديد نجاح التثبيت في الخلفية فقط عند فتح Obtainium.",
    "verifyLatestTag": "التحقق من علامة 'الأحدث'",
    "intermediateLinkRegex": "تصفية للوصول إلى رابط 'وسيط'",
    "filterByLinkText": "تصفية الروابط حسب نص الرابط",
    "matchLinksOutsideATags": "تطابق الروابط خارج علامات <a>",
    "intermediateLinkNotFound": "لم يُعثر على رابط وسيط",
    "intermediateLink": "رابط وسيط",
    "exemptFromBackgroundUpdates": "إعفاء من التحديثات في الخلفية (إذا فُعّل)",
    "bgUpdatesOnWiFiOnly": "عطّل التحديثات في الخلفية عند عدم الاتصال بشبكة Wi-Fi",
    "bgUpdatesWhileChargingOnly": "عطّل التحديثات في الخلفية عند عدم الشحن",
    "autoSelectHighestVersionCode": "تحديد أعلى إصدار تلقائيًا",
    "versionExtractionRegEx": "تعبير نمطي لاستخراج الإصدار",
    "trimVersionString": "قص سلسلة الإصدار باستخدام تعبير نمطي",
    "matchGroupToUseForX": "مجموعة المطابقة لاستخدامها لـ \"{}\"",
    "matchGroupToUse": "مجموعة المطابقة لاستخدامها في تعبير استخراج الإصدار",
    "highlightTouchTargets": "تمييز أهداف اللمس الأقل وضوحًا",
    "pickExportDir": "اختر دليل التصدير",
    "autoExportOnChanges": "صدِّر تلقائي عند التغييرات",
    "includeSettings": "ضمّن الإعدادات",
    "filterVersionsByRegEx": "تصفية الإصدارات باستخدام تعبير نمطي",
    "trySelectingSuggestedVersionCode": "محاولة تحديد الإصدار المقترح تلقائيًا",
    "dontSortReleasesList": "حافظ على ترتيب الإصدارات من API",
    "reverseSort": "رتّب عكسيًا",
    "takeFirstLink": "أخذ أول رابط",
    "skipSort": "تخطي الترتيب",
    "debugMenu": "قائمة التصحيح",
    "bgTaskStarted": "بدأت المهمة في الخلفية - تحقق من السجلات.",
    "runBgCheckNow": "تشغيل التحقق من التحديثات في الخلفية الآن",
    "versionExtractWholePage": "طبّق تعبير استخراج الإصدار على الصفحة بأكملها",
    "installing": "جارِ التثبيت",
    "skipUpdateNotifications": "تخطي إخطارات التحديث",
    "updatesAvailableNotifChannel": "تتوفّر تحديثات",
    "appsUpdatedNotifChannel": "حُدثت التطبيقات",
    "appsPossiblyUpdatedNotifChannel": "حاولّ تحديث التطبيقات",
    "errorCheckingUpdatesNotifChannel": "خطأ في التحقق من التحديثات",
    "appsRemovedNotifChannel": "أُزيلت التطبيقات",
    "downloadingXNotifChannel": "جارِ تنزيل {}",
    "completeAppInstallationNotifChannel": "اكمل تثبيت التطبيق",
    "checkingForUpdatesNotifChannel": "جارِ التحقق من التحديثات",
    "onlyCheckInstalledOrTrackOnlyApps": "التحقق فقط من التطبيقات المثبتة أو للتعقب فقط",
    "supportFixedAPKURL": "دعم روابط APK الثابتة",
    "selectX": "اختر {}",
    "parallelDownloads": "السماح بالتنزيل المتوازي",
    "useShizuku": "استخدم Shizuku أو Sui للتثبيت",
    "shizukuBinderNotFound": "خدمة Shizuku غير قيد التشغيل",
    "shizukuOld": "إصدار قديم من Shizuku (<11) - حدّثه",
    "shizukuOldAndroidWithADB": "Shizuku يعمل على إصدار أندرويد < 8.1 مع ADB - حدّث أندرويد أو استخدم Sui بدلاً من ذلك",
    "shizukuPretendToBeGooglePlay": "عيّن Google Play كمصدر التثبيت (إذا تم استخدام Shizuku)",
    "useSystemFont": "استخدم خط النظام",
    "useVersionCodeAsOSVersion": "استخدم versionCode كإصدار مكتشف من النظام",
    "requestHeader": "رأس الطلب",
    "useLatestAssetDateAsReleaseDate": "استخدم أحدث رفع للأصول كتاريخ إصدار",
    "defaultPseudoVersioningMethod": "طريقة الإصدار الوهمي الافتراضية",
    "partialAPKHash": "جزء من بصمة APK",
    "APKLinkHash": "بصمة رابط APK",
    "directAPKLink": "رابط APK مباشر",
    "pseudoVersionInUse": "يتم استخدام إصدار وهمي",
    "installed": "مثبت",
    "latest": "الأحدث",
    "invertRegEx": "اعكس التعبير النمطي",
    "note": "ملاحظة",
    "selfHostedNote": "يمكن استخدام القائمة المنسدلة \"{}\" للوصول إلى نسخ مخصصة/مستضافة ذاتيًا لأي مصدر.",
    "badDownload": "تعذر تحليل ملف APK (تنزيل غير متوافق أو غير مكتمل)",
    "beforeNewInstallsShareToAppVerifier": "مشاركة التطبيقات الجديدة مع AppVerifier (إذا كان متاحًا)",
    "appVerifierInstructionToast": "شارك مع AppVerifier، ثم عد هنا عندما تكون جاهزًا.",
    "wiki": "المساعدة/ويكي",
    "crowdsourcedConfigsLabel": "تكوينات التطبيقات المقدمة من الجمهور (استخدم على مسؤوليتك)",
    "crowdsourcedConfigsShort": "تكوينات التطبيقات المقدمة من الجمهور",
    "allowInsecure": "السماح بطلبات HTTP غير الآمنة",
    "stayOneVersionBehind": "البقاء بإصدار واحد خلف الأحدث",
    "useFirstApkOfVersion": "التحديد التلقائي الأول من بين عدة ملفات APK",
    "refreshBeforeDownload": "تحديث تفاصيل التطبيق قبل التنزيل",
    "tencentAppStore": "متجر Tencent للتطبيقات",
    "coolApk": "CoolApk",
    "vivoAppStore": "متجر vivo للتطبيقات (CN)",
    "name": "الاسم",
    "smartname": "الاسم (ذكي)",
    "sortMethod": "طريقة الترتيب",
    "welcome": "مرحبًا",
    "documentationLinksNote": "تحتوي صفحة Obtainium على GitHub المرتبطة أدناه على روابط لمقاطع فيديو، مقالات، مناقشات وموارد أخرى ستساعدك على فهم كيفية استخدام التطبيق.",
    "batteryOptimizationNote": "لاحظ أن التنزيلات في الخلفية قد تعمل بشكل أكثر موثوقية إذا قمت بتعطيل تحسينات بطارية النظام لـ Obtainium.",
    "fileDeletionError": "فشل حذف الملف (حاول حذفه يدويًا ثم حاول مرة أخرى): \"{}\"",
    "foregroundService": "الحصول على خدمة الحصول على خدمة المقدمة",
    "foregroundServiceExplanation": "استخدام خدمة مقدمة للتحقق من التحديثات (أكثر موثوقية وتستهلك طاقة أكبر)",
    "fgServiceNotice": "هذا الإخطار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)",
    "excludeSecrets": "استعبد الأسرار",
    "GHReqPrefix": "نسخة \"sky22333/hubproxy\" لطلبات GitHub",
    "includeZips": "ضمّن ملفات ZIP",
    "zippedApkFilterRegEx": "تصفية ملفات APK داخل ZIP",
    "googleVerificationWarningP1": "(جوجل) أعلن أنه، بدءاً من عام 2026/2027، كل التطبيقات على أجهزة (أندرويد) مصدقة ستطلب من المطور تقديم تفاصيل الهوية الشخصية مباشرة إلى (غوغل).\n\nوبما أن مطوري هذا التطبيق لا يوافقون على هذا الشرط، فإن Obtainium لن يعمل بعد ذلك الوقت على أجهزة أندرويدية معتمدة.",
    "googleVerificationWarningP2": "Go to https://keepandroidopen.org/ for more information.",
    "googleVerificationWarningP3": "ونلاحظ أنه في الأجل القصير، قد يظل من الممكن تركيب عملية \" غير متوافقة \" من خلال عملية \" تدفق سريع \" وعد غوغل بتنفيذها بعد رد فعل واسع النطاق على إعلانهم، ولكنهم لم يفصلوا كيف سينجح ذلك حتى لا يتضح ما إذا كان سيحافظ حقا على حريات المستعملين بأي طريقة عملية.\n\nعلى أية حال، حركة (جوجل) خطوة هامة نحو نهاية الحوسبة المجانية ذات الأغراض العامة للأفراد\n\nوينبغي ألا يتأثر هذا النظام غير المصدق عليه، مثل غرافينيوس، طالما يسمح له باستمرار وجوده.",
    "multipleSigners": "عدد من الدول الموقعة",
    "removeAppQuestion": {
        "one": "إزالة التطبيق؟",
        "other": "إزالة التطبيقات؟"
    },
    "tooManyRequestsTryAgainInMinutes": {
        "one": "طلبات كثيرة جدًا (حُدد المعدل) - حاول مرة أخرى بعد {} دقيقة",
        "other": "طلبات كثيرة جدًا (حُدد المعدل) - حاول مرة أخرى بعد {} دقائق"
    },
    "bgUpdateGotErrorRetryInMinutes": {
        "one": "واجه التحقق من التحديثات في الخلفية {}، سيتم جدولة محاولة أخرى بعد {} دقيقة",
        "other": "واجه التحقق من التحديثات في الخلفية {}، سيتم جدولة محاولة أخرى بعد {} دقائق"
    },
    "bgCheckFoundUpdatesWillNotifyIfNeeded": {
        "one": "وجد التحقق من التحديثات في الخلفية {} تحديث - سيتم إخطار المستخدم إذا لزم الأمر",
        "other": "وجد التحقق من التحديثات في الخلفية {} تحديثات - سيتم إخطار المستخدم إذا لزم الأمر"
    },
    "apps": {
        "one": "{} تطبيق",
        "other": "{} تطبيقات"
    },
    "url": {
        "one": "{} رابط",
        "other": "{} روابط"
    },
    "minute": {
        "one": "{} دقيقة",
        "other": "{} دقائق"
    },
    "hour": {
        "one": "{} ساعة",
        "other": "{} ساعات"
    },
    "day": {
        "one": "{} يوم",
        "other": "{} أيام"
    },
    "clearedNLogsBeforeXAfterY": {
        "one": "مُسح {n} سجل (قبل = {before}, بعد = {after})",
        "other": "مُسح {n} سجلات (قبل = {before}, بعد = {after})"
    },
    "xAndNMoreUpdatesAvailable": {
        "one": "{} وتطبيق واحد آخر لديه تحديثات.",
        "other": "{} و{} تطبيقات أخرى لديها تحديثات."
    },
    "xAndNMoreUpdatesInstalled": {
        "one": "{} وتطبيق واحد آخر حُدث.",
        "other": "{} و{} تطبيقات أخرى حُدثت."
    },
    "xAndNMoreUpdatesFailed": {
        "one": "فشل تحديث {} وتطبيق واحد آخر.",
        "other": "فشل تحديث {} و{} تطبيقات أخرى."
    },
    "xAndNMoreUpdatesPossiblyInstalled": {
        "one": "{} وتطبيق واحد آخر قد حُدث.",
        "other": "{} و{} تطبيقات أخرى قد حُدثت."
    },
    "apk": {
        "one": "{} APK",
        "other": "{} APKs"
    },
    "certificateHash": {
        "one": "بصمة الشهادة",
        "other": "بصمات الشهادة"
    }
}


================================================
FILE: assets/translations/bs.json
================================================
{
    "invalidURLForSource": "Nije važeći URL aplikacije {}",
    "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje",
    "noVersionFound": "Nije moguće odrediti verziju izdanja",
    "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom",
    "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije",
    "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije",
    "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju",
    "placeholder": "Rezervirano mjesto",
    "someErrors": "Došlo je do nekih grešaka",
    "unexpectedError": "Neočekivana greška",
    "ok": "Dobro",
    "and": "i",
    "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)",
    "includePrereleases": "Uključi preliminarna izdanja",
    "fallbackToOlderReleases": "Povratak na starija izdanja",
    "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu",
    "invalidRegEx": "Nevažeći regularni izraz",
    "noDescription": "Bez opisa",
    "cancel": "Otkaži",
    "continue": "Nastavite",
    "requiredInBrackets": "(obavezno)",
    "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU",
    "colour": "Boja",
    "standard": "Standard",
    "custom": "Custom",
    "useMaterialYou": "Koristi Material You temu",
    "githubStarredRepos": "GitHub repo-i sa zvjezdicom",
    "uname": "Korisničko ime",
    "wrongArgNum": "Naveden je pogrešan broj argumenata",
    "xIsTrackOnly": "{} je samo za praćenje",
    "source": "Izvor",
    "app": "Aplikacija. ",
    "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.",
    "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.",
    "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.",
    "cancelled": "Otkazano",
    "appAlreadyAdded": "Aplikacija je već dodana",
    "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?",
    "addApp": "Dodaj aplikaciju",
    "appSourceURL": "Izvorni URL aplikacije",
    "error": "Greška",
    "add": "Dodaj",
    "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)",
    "search": "Pretraživanje",
    "additionalOptsFor": "Dodatne opcije za {}",
    "supportedSources": "Podržani izvori",
    "trackOnlyInBrackets": "(Samo za praćenje)",
    "searchableInBrackets": "(Može se pretraživati)",
    "appsString": "Aplikacije",
    "noApps": "Nema aplikacija",
    "noAppsForFilter": "Nema aplikacija za filter",
    "byX": "Autor {}",
    "percentProgress": "Napredak: {}%",
    "pleaseWait": "Molimo sačekajte",
    "updateAvailable": "Ažuriranje dostupno",
    "notInstalled": "Nije instalirano",
    "pseudoVersion": "pseudo-verzija",
    "selectAll": "Označi sve",
    "deselectX": "Poništi odabir {}",
    "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.",
    "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?",
    "removeSelectedApps": "Ukloni odabrane aplikacije",
    "updateX": "Nadogradi {}",
    "installX": "Instaliraj {}",
    "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano",
    "changeX": "Promjena {}",
    "installUpdateApps": "Instalirajte/ažurirajte aplikacije",
    "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije",
    "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?",
    "no": "Ne",
    "yes": "Da",
    "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane",
    "pinToTop": "Prikvači na vrh",
    "unpinFromTop": "Otkvači sa vrha",
    "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?",
    "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.",
    "customLinkMessage": "Ove veze rade na uređajima s instaliranim Obtainiumom",
    "shareAppConfigLinks": "Podijelite konfiguraciju aplikacije kao HTML vezu",
    "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija",
    "resetInstallStatus": "Resetujte status instalacije",
    "more": "Više",
    "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija",
    "showOutdatedOnly": "Prikaži samo zastarjele aplikacije",
    "filter": "Filtriranje",
    "filterApps": "Filtriraj aplikacije",
    "appName": "Naziv aplikacije",
    "author": "Autor",
    "upToDateApps": "Ažurirane aplikacije",
    "nonInstalledApps": "Neinstalirane aplikacije",
    "importExport": "Uvoz/izvoz",
    "settings": "Postavke",
    "exportedTo": "Izvezeno u {}",
    "obtainiumExport": "Obtainium izvoz",
    "invalidInput": "Neispravan unos.",
    "importedX": "Uvezeno {}",
    "obtainiumImport": "Obtainium uvoz",
    "importFromURLList": "Uvoz iz URL liste",
    "searchQuery": "Pretraga za: ",
    "appURLList": "Lista URL adresa aplikacija",
    "line": "Linija",
    "searchX": "Pretraživanje {}",
    "noResults": "Nema rezultata",
    "importX": "Uvoz {}",
    "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.",
    "importErrors": "Uvezi greške",
    "importedXOfYApps": "{} od {} aplikacija uvezeno.",
    "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:",
    "selectURL": "Odaberite URL",
    "selectURLs": "Odaberite URL-ove",
    "pick": "Odaberi",
    "theme": "Tema",
    "dark": "Tamna",
    "light": "Svijetla",
    "followSystem": "Pratite sistem",
    "followSystemThemeExplanation": "Praćenje sistemske teme je moguće jedino koristeći aplikacije treće strane",
    "useBlackTheme": "Koristite čisto crnu tamnu temu",
    "appSortBy": "Aplikacije sortirane po",
    "authorName": "Autor/Ime",
    "nameAuthor": "Ime/Autor",
    "asAdded": "Kao što je dodano",
    "appSortOrder": "Redoslijed sortiranja aplikacija",
    "ascending": "Uzlazno",
    "descending": "Silazno",
    "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini",
    "neverManualOnly": "Nikada - samo ručno",
    "appearance": "Izgled",
    "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije",
    "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija",
    "updates": "Nadogradnje",
    "sourceSpecific": "Specifično za izvor",
    "appSource": "Izvor aplikacije",
    "noLogs": "Nema evidencije",
    "appLogs": "Evidencije aplikacija",
    "close": "Zatvori",
    "share": "Podijeli",
    "appNotFound": "Aplikacija nije pronađena",
    "obtainiumExportHyphenatedLowercase": "obtainium-izvoz",
    "pickAnAPK": "Odaberite APK",
    "appHasMoreThanOnePackage": "{} ima više od jednog paketa:",
    "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.",
    "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:",
    "warning": "Upozorenje",
    "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?",
    "updatesAvailable": "Dostupna ažuriranja",
    "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium",
    "noNewUpdates": "Nema novih ažuriranja.",
    "xHasAnUpdate": "{} ima ažuriranje.",
    "appsUpdated": "Aplikacije su ažurirane",
    "appsNotUpdated": "Neuspješno ažuriranje aplikacija",
    "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija",
    "xWasUpdatedToY": "{} je ažuriran na {}.",
    "xWasNotUpdatedToY": "Neuspješno ažuriranje {} na {}.",
    "errorCheckingUpdates": "Greška pri provjeri ažuriranja",
    "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije",
    "appsRemoved": "Aplikacije su uklonjene",
    "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja",
    "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}",
    "completeAppInstallation": "Dovršite instalaciju aplikacije",
    "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija",
    "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije",
    "checkingForUpdates": "Tražim moguće nadogradnje",
    "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja",
    "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije",
    "trackOnly": "Samo za praćenje",
    "errorWithHttpStatusCode": "Greška {}",
    "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)",
    "unknown": "Nepoznato",
    "none": "Ništa",
    "all": "All",
    "never": "Nikad",
    "latestVersionX": "Najnovija verzija: {}",
    "installedVersionX": "Instalirana verzija: {}",
    "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}",
    "remove": "Izbriši",
    "yesMarkUpdated": "Da, označi kao ažurirano",
    "fdroid": "Službeni F-Droid",
    "appIdOrName": "ID ili ime aplikacije",
    "appId": "ID aplikacije",
    "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom",
    "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija",
    "fdroidThirdPartyRepo": "F-Droid Repo treće strane",
    "install": "Instaliraj",
    "markInstalled": "Označi kao instalirano",
    "update": "Nadogradi",
    "markUpdated": "Označi kao ažurirano",
    "additionalOptions": "Dodatne opcije",
    "disableVersionDetection": "Onemogući detekciju verzije",
    "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.",
    "downloadingX": "Preuzimanje {}",
    "downloadX": "Preuzeti {}",
    "downloadedX": "Preuzeto {}",
    "releaseAsset": "Fajlovi verzije",
    "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije",
    "noAPKFound": "APK nije pronađen",
    "noVersionDetection": "Nema detekcije verzije",
    "categorize": "Kategoriziraj",
    "categories": "Kategorije",
    "category": "Kategorija",
    "noCategory": "Nema kategorije",
    "noCategories": "Nema kategorija",
    "deleteCategoriesQuestion": "Želite li izbrisati kategorije?",
    "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.",
    "addCategory": "Dodaj kategoriju",
    "label": "Oznaka",
    "language": "Jezik",
    "copiedToClipboard": "Podaci kopirani u međuspremnik",
    "storagePermissionDenied": "Dozvola za pohranu je odbijena",
    "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.",
    "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu",
    "removeFromObtainium": "Ukloni iz Obtainiuma",
    "uninstallFromDevice": "Deinstaliraj s uređaja",
    "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.",
    "releaseDateAsVersion": "Koristi datum izdanja kao verziju",
    "releaseTitleAsVersion": "Use release title as version string",
    "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.",
    "changes": "Promjene",
    "releaseDate": "Datum izdavanja",
    "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)",
    "versionDetectionExplanation": "Pomiri niz verzije sa verzijom otkrivenom iz OS-a",
    "versionDetection": "Otkrivanje verzije",
    "standardVersionDetection": "Detekcija standardne verzije",
    "groupByCategory": "Grupiši po kategoriji",
    "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće",
    "autoLinkFilterByArch": "Attempt to filter links by CPU architecture if possible",
    "overrideSource": "Premosti izvor",
    "dontShowAgain": "Ne prikazuj ovo ponovo",
    "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za  praćenje”",
    "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a",
    "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija",
    "gitlabPATLabel": "GitLab token za lični pristup",
    "about": "O nama",
    "requiresCredentialsInSettings": "{}: Za ovo su potrebni dodatni akreditivi (u Postavkama)",
    "checkOnStart": "Provjerite ima li novosti pri pokretanju",
    "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda",
    "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije",
    "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a",
    "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije",
    "disablePageTransitions": "Ugasite animaciju prijelaza stranice",
    "reversePageTransitions": "Reverzne animacije prijelaza stranice",
    "minStarCount": "Najmanji broj zvjezdica",
    "addInfoBelow": "Dodajte ove informacije ispod.",
    "addInfoInSettings": "Dodajte ove informacije u Postavkama.",
    "githubSourceNote": "GitHub ograničavanje se može izbjeći korišćenjem tokena za lični pristup.",
    "sortByLastLinkSegment": "Sortiraj samo po zadnjem segmentu veze",
    "filterReleaseNotesByRegEx": "Filtirajte promjene u izdanju po regularnom izrazu",
    "customLinkFilterRegex": "Prilagođeni APK link filtrira se po regularnom izrazu (Zadano '.apk$')",
    "appsPossiblyUpdated": "Pokušano ažuriranje aplikacija",
    "appsPossiblyUpdatedNotifDescription": "Obavještava korisnika da je ažuriranje jedne ili više aplikacija potencijalno izvršeno u pozadini",
    "xWasPossiblyUpdatedToY": "{} aplikacija bi trebala biti ažurirana na {}.",
    "enableBackgroundUpdates": "Dozvolite ažuriranja u pozadini",
    "backgroundUpdateReqsExplanation": "Ažuriranja u pozadini možda neće raditi za sve aplikacije.",
    "backgroundUpdateLimitsExplanation": "Uspjeh ažuriranja u pozadini se može provjeriti tek kada otvorite Obtainium.",
    "verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
    "intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
    "filterByLinkText": "Filtriraj linkove prema tekstu linka",
    "matchLinksOutsideATags": "Poklopiti linkove van <a> tag-a",
    "intermediateLinkNotFound": "Intermediate veza nije nađena",
    "intermediateLink": "Intermediate veza",
    "exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
    "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na Wi-Fi-ju",
    "bgUpdatesWhileChargingOnly": "Isključi pozadinska ažuriranja kada uređaj nije na punjaču",
    "autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a",
    "versionExtractionRegEx": "RegEx ekstrakcija verzije",
    "trimVersionString": "Skrati string verzije pomoću RegEx-a",
    "matchGroupToUseForX": "Podjesite grupu za upotebu za \"{}\"",
    "matchGroupToUse": "Podjesite grupu za upotebu",
    "highlightTouchTargets": "Istaknite manje vidljive touch mete",
    "pickExportDir": "Izaberite datoteku za izvoz",
    "autoExportOnChanges": "Automatski izvezite pri promjenama",
    "includeSettings": "Uključi postavke",
    "filterVersionsByRegEx": "Filtrirajte verzije po regulatnom izrazu",
    "trySelectingSuggestedVersionCode": "Probajte izabrati preloženu (verziju) versionCode APK-a",
    "dontSortReleasesList": "Zadrži redosled izdanja iz API-a",
    "reverseSort": "Obrni redosled",
    "takeFirstLink": "Uzmi prvi link",
    "skipSort": "Preskoči sortiranje",
    "debugMenu": "Meni za otkrivanje grešaka",
    "bgTaskStarted": "Rad u pozadini pokrenut - provjerite log-ove.",
    "runBgCheckNow": "Pokrenite pozadinsku provjeru ažuriranja sad",
    "versionExtractWholePage": "Primjenite Regex ekstrakciju verzije na cijelu stranicu",
    "installing": "Instaliranje",
    "skipUpdateNotifications": "Ne prikazujte obavještenja ažuriranja",
    "updatesAvailableNotifChannel": "Dostupna ažuriranja",
    "appsUpdatedNotifChannel": "Aplikacije su ažurirane",
    "appsPossiblyUpdatedNotifChannel": "Pokušano ažuriranje aplikacija",
    "errorCheckingUpdatesNotifChannel": "Greška pri provjeri ažuriranja",
    "appsRemovedNotifChannel": "Aplikacije su uklonjene",
    "downloadingXNotifChannel": "Preuzimanje {}",
    "completeAppInstallationNotifChannel": "Dovršite instalaciju aplikacije",
    "checkingForUpdatesNotifChannel": "Tražim moguće nadogradnje",
    "onlyCheckInstalledOrTrackOnlyApps": "Isključivo provjerite ažuriranje za instalirane i aplikacije 'samo za praćenje'",
    "supportFixedAPKURL": "Podržite fiksne APK URL-ove",
    "selectX": "Izaberite {}",
    "parallelDownloads": "Dozvoli paralelna preuzimanja",
    "useShizuku": "Koristi Shizuku ili Sui za instaliranje",
    "shizukuBinderNotFound": "Shizuku nije pokrenut",
    "shizukuOld": "Stara Shizuku verzija (<11) - ažurirajte je",
    "shizukuOldAndroidWithADB": "Shizuku pokrenut na Android-u < 8.1 pomoću ADB-a - ažurirajte Android ili koristite Sui",
    "shizukuPretendToBeGooglePlay": "Postavi Google Play kao izvor instalacije (samo ako je Shizuku u upotrebi)",
    "useSystemFont": "Koristite sistemski font",
    "useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS",
    "requestHeader": "Zaglavlje zahtjeva",
    "useLatestAssetDateAsReleaseDate": "Koristite najnovije otpremanje materijala kao datum izdavanja",
    "defaultPseudoVersioningMethod": "Zadana metoda pseudo-verzija",
    "partialAPKHash": "Djelomični APK Hash",
    "APKLinkHash": "APK Link Hash",
    "directAPKLink": "Direktna APK veza",
    "pseudoVersionInUse": "Pseudo-verzija je u upotrebi",
    "installed": "Instalirano",
    "latest": "Najnoviji",
    "invertRegEx": "Obrni regularni izraz",
    "note": "Zabelješke",
    "selfHostedNote": "\"{}\" padajući meni se može koristiti da dosegnete vlastite/prilagođene instance bilo kojeg izvora.",
    "badDownload": "APK ne može biti raščlanjen (nekomaptibilno ili delimično preuzimanje)",
    "beforeNewInstallsShareToAppVerifier": "Dijeli nove aplikacije sa AppVerifier-om (ako je dostupno)",
    "appVerifierInstructionToast": "Dijeli sa AppVerifier-om, zatim se vratite kada ste spremni.",
    "wiki": "Pomoć/Wiki",
    "crowdsourcedConfigsLabel": "Konfiguracije aplikacije obezbeđene pomoću velikog broja ljudi (crowdsourcing) (koristite na svoju odgovornost)",
    "crowdsourcedConfigsShort": "Konfiguracije aplikacije drugih korisnika",
    "allowInsecure": "Dozvoli nesigurne HTTP zahtjeve",
    "stayOneVersionBehind": "Ostani na verziji koja prethodi posljednjoj",
    "useFirstApkOfVersion": "Automatski izaberi prvi ako postoji više APK-ova",
    "refreshBeforeDownload": "Osvježi detalje aplikacije prije preuzimanja",
    "tencentAppStore": "Tencent prodavnica aplikacija",
    "coolApk": "CoolApk",
    "vivoAppStore": "vivo prodavnica aplikacija (Kina)",
    "name": "Ime",
    "smartname": "Ime (Smart)",
    "sortMethod": "Metoda sortiranja",
    "welcome": "Dobrodošli",
    "documentationLinksNote": "Stranica Obtainium-a na GitHub-u na linku u nastavku sadrži linkove na videozapise, članke, rasprave i druge resurse koji će vam pomoći da shvatite kako koristiti aplikaciju.",
    "batteryOptimizationNote": "Imajte na umu da pozadinska preuzimanja rade bolje ako se aplikacija izuzme iz optimizacije baterije.",
    "fileDeletionError": "Neuspješno brisanje datoteke (probajte je ručno obrisati, pa pokušajte ponovo): \"{}\"",
    "foregroundService": "Obtainium servis u prednjem planu",
    "foregroundServiceExplanation": "Koristi servis u prednjem planu za provjeru ažuriranja (bolji rad, troši više energije)",
    "fgServiceNotice": "Ovo obavještenje je obavezno radi provjera ažuriranja u pozadini (može se prikriti u postavkama sistema)",
    "excludeSecrets": "Izuzmi secrets",
    "GHReqPrefix": "'sky22333/hubproxy' istanca za GitHub zahtjeve",
    "includeZips": "Uključi i ZIP datoteke",
    "zippedApkFilterRegEx": "Filtriraj APK-ove unutar ZIP datoteka",
    "googleVerificationWarningP1": "Google has announced that, starting in 2026/2027, all apps on \"certified\" Android devices will require the developer to submit personal identity details directly to Google.\n\nSince the developers of this app do not agree to this requirement, Obtainium will no longer work on certified Android devices after that time.",
    "googleVerificationWarningP2": "Go to https://keepandroidopen.org/ for more information.",
    "googleVerificationWarningP3": "Note that in the short term, it may continue to be possible to install \"unverified\" (non-compliant) apps through an \"advanced flow\" process that Google has promised to implement after broad backlash to their announcement, but they have not detailed how this would work so it is unclear whether it will truly preserve user freedoms in any practical way.\n\nIn any case, Google's move is a significant step towards the end of free, general-purpose computing for individuals.\n\nNon-certified OSes, like GrapheneOS, should be unaffected by this for as long as they are allowed to continue to exist.",
    "multipleSigners": "Multiple Signers",
    "removeAppQuestion": {
        "one": "Želite li ukloniti aplikaciju?",
        "other": "Želite li ukloniti aplikacije?"
    },
    "tooManyRequestsTryAgainInMinutes": {
        "one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu",
        "other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min."
    },
    "bgUpdateGotErrorRetryInMinutes": {
        "one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu",
        "other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min."
    },
    "bgCheckFoundUpdatesWillNotifyIfNeeded": {
        "one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno",
        "other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno"
    },
    "apps": {
        "one": "{} aplikacija",
        "other": "{} aplikacije"
    },
    "url": {
        "one": "{} URL",
        "other": "{} URL-ovi"
    },
    "minute": {
        "one": "{} minuta",
        "other": "min."
    },
    "hour": {
        "one": "{} sat",
        "other": "{} sat/i"
    },
    "day": {
        "one": "{} dan",
        "other": "{} dana"
    },
    "clearedNLogsBeforeXAfterY": {
        "one": "Izbrisan {n} log (prije = {before}, nakon = {after})",
        "other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})"
    },
    "xAndNMoreUpdatesAvailable": {
        "one": "{} i još 1 aplikacija ima ažuriranja.",
        "other": "{} i još {} aplikacija imaju ažuriranja."
    },
    "xAndNMoreUpdatesInstalled": {
        "one": "{} i još 1 aplikacija je ažurirana.",
        "other": "{} i još {} aplikacija je ažurirano."
    },
    "xAndNMoreUpdatesFailed": {
        "one": "Failed to update {} and 1 more app.",
        "other": "Failed to update {} and {} more apps."
    },
    "xAndNMoreUpdatesPossiblyInstalled": {
        "one": "{} i još jedna aplikacija je vjerovatno ažurirana.",
        "other": "{} i još {} aplikacija su vjerovatno ažurirane."
    },
    "apk": {
        "one": "{} APK",
        "other": "{} APK-a"
    },
    "certificateHash": {
        "one": "Certificate Hash",
        "other": "Certificate Hashes"
    }
}


================================================
FILE: assets/translations/ca.json
================================================
{
    "invalidURLForSource": "L'URL de l'aplicació {} no es vàlid",
    "noReleaseFound": "No s'ha pogut trobar una versió adequada",
    "noVersionFound": "No s'ha pogut determinar la versió",
    "urlMatchesNoSource": "L'URL no coincideix amb cap font coneguda",
    "cantInstallOlderVersion": "No és possible instal·lar una versió més antiga de l'aplicació",
    "appIdMismatch": "L'ID del paquet descarregat no coincideix amb l'ID de l'aplicació instal·lada",
    "functionNotImplemented": "Aquesta classe no ha implentat aquesta funció",
    "placeholder": "Espai reservat",
    "someErrors": "S'han produït alguns errors",
    "unexpectedError": "Error inesperat",
    "ok": "Accepta",
    "and": "i",
    "githubPATLabel": "Token d'accés personal a GitHub (augmenta el límit d'accés)",
    "includePrereleases": "Inclou les versions preliminars",
    "fallbackToOlderReleases": "Torna a les versions anteriors",
    "filterReleaseTitlesByRegEx": "Filtra el títol de la versió per una expressió regular",
    "invalidRegEx": "Expressió regular invàlida",
    "noDescription": "Sense descripció",
    "cancel": "Cancel·la",
    "continue": "Continua",
    "requiredInBrackets": "(requerit)",
    "dropdownNoOptsError": "ERROR: EL DESPLEGABLE HA DE TENIR ALMENYS UNA OPCIÓ",
    "colour": "Color",
    "standard": "Estàndard",
    "custom": "Personalitzat",
    "useMaterialYou": "Usa 'Material You'",
    "githubStarredRepos": "Repositoris favorits de GitHub",
    "uname": "Nom d'usuari",
    "wrongArgNum": "Nombre d'arguments proveït invàlid",
    "xIsTrackOnly": "{} és només per a seguiment",
    "source": "Font",
    "app": "Aplicació",
    "appsFromSourceAreTrackOnly": "Les aplicacions d'aquesta font són només per a seguiment.",
    "youPickedTrackOnly": "Has seleccionat l'opció 'només per a seguiment'.",
    "trackOnlyAppDescription": "Farem el seguiment de les actualitzacions per a l'aplicació, però Obtainium no podrà descarregar-la ni actualitzar-la.",
    "cancelled": "Cancel·lat",
    "appAlreadyAdded": "Aplicació ja afegida",
    "alreadyUpToDateQuestion": "Aplicació ja actualitzada?",
    "addApp": "Afegeix l'aplicació",
    "appSourceURL": "URL font de l'aplicació",
    "error": "Error",
    "add": "Afegeix",
    "searchSomeSourcesLabel": "Cerca (només algunes fonts)",
    "search": "Cerca",
    "additionalOptsFor": "Opcions addicionals per a {}",
    "supportedSources": "Fonts suportades",
    "trackOnlyInBrackets": "(només per a seguiment)",
    "searchableInBrackets": "(permet la cerca)",
    "appsString": "Aplicacions",
    "noApps": "No hi ha aplicacions",
    "noAppsForFilter": "No hi ha aplicacions per filtrar",
    "byX": "Per: {}",
    "percentProgress": "Progrés: {} %",
    "pleaseWait": "Espera...",
    "updateAvailable": "Actualització disponible",
    "notInstalled": "No instal·lat",
    "pseudoVersion": "pseudo-versió",
    "selectAll": "Selecciona-ho tot",
    "deselectX": "Desselecciona {}",
    "xWillBeRemovedButRemainInstalled": "{} s'eliminarà d'Obtainium però romandrà instal·lada al dispositiu.",
    "removeSelectedAppsQuestion": "Elimino les aplicacions seleccionades?",
    "removeSelectedApps": "Elimina les aplicacions seleccionades",
    "updateX": "Actualitza {}",
    "installX": "Instal·la {}",
    "markXTrackOnlyAsUpdated": "Marca {}\n(només per a seguiment)\ncom a actualitzada",
    "changeX": "Canvia {}",
    "installUpdateApps": "Instal·la/actualitza les aplicacions",
    "installUpdateSelectedApps": "Instal·la/actualitza les aplicacions seleccionades",
    "markXSelectedAppsAsUpdated": "Marco {} les aplicaciones seleccionades com a actualitzades?",
    "no": "No",
    "yes": "Sí",
    "markSelectedAppsUpdated": "Marca les aplicacions seleccionades com a actualitzades",
    "pinToTop": "Ancora-la al capdamunt",
    "unpinFromTop": "Desancora-la del capdamunt",
    "resetInstallStatusForSelectedAppsQuestion": "Restableixo l'estat d'instal·lació per a les aplicacions seleccionades?",
    "installStatusOfXWillBeResetExplanation": "Es restablirà l'estat d'instal·lació de les aplicacions seleccionades.\n\nAçò pot ser útil quan la versió de l'aplicació mostrada per Obtainium és incorrecta a conseqüència d'una actualització no reeixida o d'algun altre problema.",
    "customLinkMessage": "Aquests enllaços funcionen en dispositius amb Obtainium instal·lat",
    "shareAppConfigLinks": "Comparteix la configuració de l'aplicació com a enllaç HTML",
    "shareSelectedAppURLs": "Comparteix els URL de les aplicacions seleccionades",
    "resetInstallStatus": "Restableix l'estat de la instal·lació",
    "more": "Més",
    "removeOutdatedFilter": "Elimina el filtre d'aplicacions desactualitzades",
    "showOutdatedOnly": "Mostra només les aplicacions desactualitzades",
    "filter": "Filtra",
    "filterApps": "Filtra les aplicacions",
    "appName": "Nom de l'aplicació",
    "author": "Autor",
    "upToDateApps": "Aplicacions actualizades",
    "nonInstalledApps": "Aplicacions no instal·lades",
    "importExport": "Importa/exporta",
    "settings": "Paràmetres",
    "exportedTo": "Exportat a {}",
    "obtainiumExport": "Exporta Obtainium",
    "invalidInput": "Entrada no vàlida",
    "importedX": "Importat {}",
    "obtainiumImport": "Importa Obtainium",
    "importFromURLList": "Importa des de la llista d'URL",
    "searchQuery": "Terme de cerca",
    "appURLList": "Llista d'URL d'aplicacions",
    "line": "Línia",
    "searchX": "Cerca {}",
    "noResults": "No hi ha resultats",
    "importX": "Importa des de {}",
    "importedAppsIdDisclaimer": "Les aplicacions importades podrien mostrar-se incorrectament com a «No instal·lada».\nPer solventar-ho reinstal·la-les a través d'Obtainium.\nAixò no hauria d'afectar les dades de les aplicacions.\n\nNomés afecta els URL i els mètodes d'importació de tercers.",
    "importErrors": "Errors d'importació",
    "importedXOfYApps": "{} de {} aplicacions importades.",
    "followingURLsHadErrors": "Els següents URLs han tingut problemes:",
    "selectURL": "Selecciona URL",
    "selectURLs": "Selecciona URLs",
    "pick": "Escull",
    "theme": "Tema",
    "dark": "Fosc",
    "light": "Clar",
    "followSystem": "Segueix el sistema",
    "followSystemThemeExplanation": "Seguir el tema del sistema només és possible si uses aplicacions de tercers",
    "useBlackTheme": "Fes servir el negre pur en el tema fosc",
    "appSortBy": "Ordena les aplicacions per",
    "authorName": "Autor/nom",
    "nameAuthor": "Nom/Autor",
    "asAdded": "Per l'ordre en què es van afegir",
    "appSortOrder": "Per ordre de classificació",
    "ascending": "Ascendent",
    "descending": "Descendent",
    "bgUpdateCheckInterval": "Comprova les actualitzacions en segon pla",
    "neverManualOnly": "Mai, només manual",
    "appearance": "Aparença",
    "showWebInAppView": "Mostra el web d'origen en la vista de l'aplicació",
    "pinUpdates": "Ancora les actualitzacions al capdamunt de les aplicacions",
    "updates": "Actualitzacions",
    "sourceSpecific": "Font específica",
    "appSource": "Font de l'aplicació",
    "noLogs": "Cap registre",
    "appLogs": "Registres de l'aplicació",
    "close": "Tanca",
    "share": "Comparteix",
    "appNotFound": "No s'ha trobat l'aplicació",
    "obtainiumExportHyphenatedLowercase": "Exportació d'Obtainium",
    "pickAnAPK": "Escull una APK",
    "appHasMoreThanOnePackage": "{} té més d'un paquet:",
    "deviceSupportsXArch": "Aquest dispositiu admet l'aquitectura de CPU: {}.",
    "deviceSupportsFollowingArchs": "Aquest dispositiu admet les següents arquitectures de CPU:",
    "warning": "Avís",
    "sourceIsXButPackageFromYPrompt": "La font de l'aplicació és «{}» però el paquet de l'actualització ve de «{}». Vols continuar?",
    "updatesAvailable": "Actualitzacions disponibles",
    "updatesAvailableNotifDescription": "Notifica l'usuari que hi ha actualitzacions per a una o més aplicacions seguides per Obtainium",
    "noNewUpdates": "No hi ha noves actualitzacions.",
    "xHasAnUpdate": "{} té una actualització.",
    "appsUpdated": "Aplicacions actualitzades",
    "appsNotUpdated": "Error en actualitzar les aplicacions",
    "appsUpdatedNotifDescription": "Notifica l'usuari que una o més aplicacions s'han actualitzat en segon pla",
    "xWasUpdatedToY": "{} s'ha actualitzat a {}.",
    "xWasNotUpdatedToY": "Error en actualitzar {} a {}.",
    "errorCheckingUpdates": "Error en cercar actualitzacions",
    "errorCheckingUpdatesNotifDescription": "Una notificació que es mostra quan la comprovació d'actualizacions en segon pla ha fallat",
    "appsRemoved": "Aplicacions suprimides",
    "appsRemovedNotifDescription": "Notifica l'usuari que una o més aplicacions s'han suprimit per errors en carregar-les",
    "xWasRemovedDueToErrorY": "{} s'ha suprimit per aquest error: {}",
    "completeAppInstallation": "Instal·lació completa de l'aplicació",
    "obtainiumMustBeOpenToInstallApps": "Obtainium ha d'estar obert per poder instal·lar aplicacions",
    "completeAppInstallationNotifDescription": "Demana l'usuari de tornar a Obtainium per acabar d'instal·lar una aplicació",
    "checkingForUpdates": "S'estan cercant actualitzacions...",
    "checkingForUpdatesNotifDescription": "Notificació temporal que apareix en cercar actualitzacions",
    "pleaseAllowInstallPerm": "Permet que Obtainium instal·li aplicacions",
    "trackOnly": "Només per a seguiment",
    "errorWithHttpStatusCode": "Error {}",
    "versionCorrectionDisabled": "Correcció de versions desactivada (el plugin sembla que no funciona)",
    "unknown": "Desconegut",
    "none": "Cap",
    "all": "Tot",
    "never": "Mai",
    "latestVersionX": "Última versió: {}",
    "installedVersionX": "Versió instal·lada: {}",
    "lastUpdateCheckX": "Última comprovació d'actualització: {}",
    "remove": "Suprimeix",
    "yesMarkUpdated": "Sí, marca com a actualitzada",
    "fdroid": "Repositori oficial F-Droid",
    "appIdOrName": "ID o nom de l'aplicació",
    "appId": "ID de l'aplicació",
    "appWithIdOrNameNotFound": "No s'han trobat aplicacions amb aquest ID o nom",
    "reposHaveMultipleApps": "Els repositoris poden contenir diverses aplicacions",
    "fdroidThirdPartyRepo": "Repositori F-Droid de tercers",
    "install": "Instal·la",
    "markInstalled": "Marca com a instal·lada",
    "update": "Actualitza",
    "markUpdated": "Marca com a actualitzada",
    "additionalOptions": "Opcions addicionals",
    "disableVersionDetection": "Desactiva la detecció de versions",
    "noVersionDetectionExplanation": "Només has d'usar aquesta opció en les aplicacions en què la detecció de versions no funcioni correctament.",
    "downloadingX": "Descarregant {}",
    "downloadX": "Descarrega {}",
    "downloadedX": "Descarregada {}",
    "releaseAsset": "Recurs actualitzat",
    "downloadNotifDescription": "Notifica l'usuari del progrés de la descàrrega d'una aplicació",
    "noAPKFound": "No s'ha trobat l'APK",
    "noVersionDetection": "No s'han detectat versions",
    "categorize": "Categoritza",
    "categories": "Categories",
    "category": "Categoria",
    "noCategory": "No hi ha la categoria",
    "noCategories": "No hi ha les categories",
    "deleteCategoriesQuestion": "Suprimeixo les categories?",
    "categoryDeleteWarning": "Totes les aplicacions de les categories suprimides es marcaran com a no categoritzades.",
    "addCategory": "Afegeix una categoria",
    "label": "Nom",
    "language": "Idioma",
    "copiedToClipboard": "Copiat al porta-retalls",
    "storagePermissionDenied": "Permís d'emmagatzematge denegat",
    "selectedCategorizeWarning": "Açò substituirà els paràmetres de categorització per a les aplicacions selecionades.",
    "filterAPKsByRegEx": "Filtra les APKs per l'expressió regular",
    "removeFromObtainium": "Suprimeix d'Obtainium",
    "uninstallFromDevice": "Desinstal·la del dispositiu",
    "onlyWorksWithNonVersionDetectApps": "Només funciona per a aplicacions amb la detecció de versions desactivada.",
    "releaseDateAsVersion": "Usa la data de llançament com a cadena de la versió",
    "releaseTitleAsVersion": "Usa el títol com a cadena de la versió",
    "releaseDateAsVersionExplanation": "Aquest opció només s'hauria d'usar per a aplicacions en què la detecció de la versió no funciona correctament però disposem de la data de publicació.",
    "changes": "Canvis",
    "releaseDate": "Data de publicació",
    "importFromURLsInFile": "Importa els URLs des d'un fitxer (com ara OPML)",
    "versionDetectionExplanation": "Concilia la cadena de la versió amb la versió detectada del Sistema Operatiu",
    "versionDetection": "Detecció de la versió",
    "standardVersionDetection": "Detecció de la versió estàndard",
    "groupByCategory": "Agrupa per categories",
    "autoApkFilterByArch": "Intenta filtrar les APKs per l'aquitectura de la CPU, si és possible",
    "autoLinkFilterByArch": "Intenta filtrar els enllaços per l'aquitectura de la CPU, si és possible",
    "overrideSource": "Força la font",
    "dontShowAgain": "No ho tornis a mostrar",
    "dontShowTrackOnlyWarnings": "No mostris avisos de les aplicacions 'només per a seguiment'",
    "dontShowAPKOriginWarnings": "No mostris avisos dels orígens de les APKs",
    "moveNonInstalledAppsToBottom": "Desplaça les aplicacions no instal·lades al capdavall de les aplicacions",
    "gitlabPATLabel": "Token d'accés personal a GitLab",
    "about": "Quant a",
    "requiresCredentialsInSettings": "{} requereix credencials addicionals (a Paràmetres)",
    "checkOnStart": "Comprova si hi ha actualitzacions en iniciar Obtainium",
    "tryInferAppIdFromCode": "Intenta deduir l'ID de l'aplicació des del codi font",
    "removeOnExternalUninstall": "Suprimeix de forma automàtica les aplicacions desinstal·lades externament",
    "pickHighestVersionCode": "Selecciona de forma automàtica la versió superior de l'APK",
    "checkUpdateOnDetailPage": "Comprova les actualitzacions en obrir la pàgina de detalls de l'aplicació",
    "disablePageTransitions": "Inhabilita les animacions de transició de pàgina",
    "reversePageTransitions": "Inverteix les animacions de transició de pàgina",
    "minStarCount": "Nombre mínim d'estrelles",
    "addInfoBelow": "Afegeix aquesta informació a sota.",
    "addInfoInSettings": "Afegeix aquesta informació a Paràmetres.",
    "githubSourceNote": "La limitació de peticions a GitHub es pot evitar amb una clau API.",
    "sortByLastLinkSegment": "Ordena per 'només el darrer fragment de l'enllaç'",
    "filterReleaseNotesByRegEx": "Filtra les notes de la publicació de la versió per una expressió regular",
    "customLinkFilterRegex": "Filtre personalitzat de l'enllaç de l'APK per una expressió regular (Per_defecte '.apk$')",
    "appsPossiblyUpdated": "S'ha intentat l'actualització de l'aplicació",
    "appsPossiblyUpdatedNotifDescription": "Notifica l'usuari que les actualitzacions per a una o més aplicacions podrien haver-se fet en segon pla",
    "xWasPossiblyUpdatedToY": "{} podria haver-se actualitzat a {}.",
    "enableBackgroundUpdates": "Habilita les actualizacions en segon pla",
    "backgroundUpdateReqsExplanation": "Les actualitzacions en segon pla és possible que no estiguin disponibles per a totes les aplicacions.",
    "backgroundUpdateLimitsExplanation": "Les instal·lacions en segon pla reexides només es poden comprovar amb Obtainium obert.",
    "verifyLatestTag": "Comprova l'etiqueta 'Latest' (última versió)",
    "intermediateLinkRegex": "Filtra per un enllaç 'intermediari' per anar-hi",
    "filterByLinkText": "Filtra els enllaços pel text de l'enllaç",
    "matchLinksOutsideATags": "Coincideix amb els enllaços fora de les etiquetes <a>",
    "intermediateLinkNotFound": "No s'ha trobat l'enllaç intermediari",
    "intermediateLink": "Enllaç intermediari",
    "exemptFromBackgroundUpdates": "Exempta d'actualitzacions en segon pla (si han estat habilitades)",
    "bgUpdatesOnWiFiOnly": "Inhabilita les actualitzacions en segon pla sense Wi-Fi",
    "bgUpdatesWhileChargingOnly": "Inhabilita les actualitzacions en segon pla quan no s'estigui carregant el mòbil",
    "autoSelectHighestVersionCode": "Selecciona de forma automàtica la versió més recent de l'APK",
    "versionExtractionRegEx": "Extracció de la cadena de la versió amb una expressió regular",
    "trimVersionString": "Retalla la cadena de la versió amb una expressió regular",
    "matchGroupToUseForX": "Grup de coincidència a usar per a \"{}\"",
    "matchGroupToUse": "Grup de coincidència a usar per a l'extracció de la cadena de la versió amb una expressió regular",
    "highlightTouchTargets": "Ressalta els elements de selecció menys obvis",
    "pickExportDir": "Selecciona el directori d'exportació",
    "autoExportOnChanges": "Exporta automàticament quan hi hagi canvis",
    "includeSettings": "Inclou paràmetres",
    "filterVersionsByRegEx": "Filtra les versions per una expressió regular",
    "trySelectingSuggestedVersionCode": "Prova a seleccionar la versió de l'APK suggerida",
    "dontSortReleasesList": "Mantén l'ordre de publicació de l'API",
    "reverseSort": "Ordre invers",
    "takeFirstLink": "Usa el primer enllaç",
    "skipSort": "Omet l'ordre",
    "debugMenu": "Menú de depuració",
    "bgTaskStarted": "S'ha iniciat la tasca en segon pla (revisa-ho als registres).",
    "runBgCheckNow": "Executa la comprovació d'actualitzacions en segon pla",
    "versionExtractWholePage": "Aplica l'extracció de la cadena de la versió amb una expressió regular a tota la pàgina",
    "installing": "Instal·lant",
    "skipUpdateNotifications": "No notifiquis les actualitzacions",
    "updatesAvailableNotifChannel": "Actualitzacions disponibles",
    "appsUpdatedNotifChannel": "Aplicacions actualitzades",
    "appsPossiblyUpdatedNotifChannel": "S'ha intentat actualitzar l'aplicació",
    "errorCheckingUpdatesNotifChannel": "Error en cercar actualitzacions",
    "appsRemovedNotifChannel": "Aplicacions suprimides",
    "downloadingXNotifChannel": "Descarregant {}",
    "completeAppInstallationNotifChannel": "Instal·lació finalitzada",
    "checkingForUpdatesNotifChannel": "S'estan cercant actualitzacions",
    "onlyCheckInstalledOrTrackOnlyApps": "Comprova les actualitzacions només per a aplicacions instal·lades o en seguiment",
    "supportFixedAPKURL": "Suport per als URLs fixos de l'APK",
    "selectX": "Selecciona {}",
    "parallelDownloads": "Permet les descàrregues paralel·les",
    "useShizuku": "Usa Shizuku o Sui per instal·lar",
    "shizukuBinderNotFound": "Shizuku no s'està executant",
    "shizukuOld": "Versió antiga de Shizuku (<11) - Actualitza-la",
    "shizukuOldAndroidWithADB": "Shizuku s'executa en Android < 8.1 amb ADB - Actualitza Android o usa Sui com a alternativa",
    "shizukuPretendToBeGooglePlay": "Defineix Google Play com a font d'instal·lació (si uses Shizuku)",
    "useSystemFont": "Usa la font del sistema",
    "useVersionCodeAsOSVersion": "Usa la versió de l'aplicació com a versió detectada del Sistema Operatiu",
    "requestHeader": "Capçalera de sol·licitud",
    "useLatestAssetDateAsReleaseDate": "Usa el darrer recurs carregat com a data de llançament",
    "defaultPseudoVersioningMethod": "Mètode de pseudo-versionat predeterminat",
    "partialAPKHash": "Hash de l'APK parcial",
    "APKLinkHash": "Hash de l'enllaç de l'APK",
    "directAPKLink": "Enllaç de l'APK directe",
    "pseudoVersionInUse": "S'està usant una pseudo-versió",
    "installed": "Instal·lada",
    "latest": "Versió més recent",
    "invertRegEx": "Inverteix l'expressió regular",
    "note": "Nota",
    "selfHostedNote": "El desplegable «{}» es pot usar per accedir a instàncies autoallotjades/personalitzades de qualsevol font.",
    "badDownload": "L'APK no s'ha pogut analitzar (incompatible o descàrrega parcial)",
    "beforeNewInstallsShareToAppVerifier": "Comparteix les aplicacions noves amb AppVerifier (si està instal·lat)",
    "appVerifierInstructionToast": "Comparteix amb AppVerifier i torna aquí quan estigui fet.",
    "wiki": "Ajuda/Wiki",
    "crowdsourcedConfigsLabel": "Configuració de les aplicacions crowdsourcing (usa-ho sota la teva responsabilitat)",
    "crowdsourcedConfigsShort": "Configuració de les aplicacions crowdsourcing",
    "allowInsecure": "Permet les sol·licituds HTTP insegures",
    "stayOneVersionBehind": "Roman a la versió anterior a l'última",
    "useFirstApkOfVersion": "Tria automàticament la primera aplicació entre moltes",
    "refreshBeforeDownload": "Actualitza les dades de l'aplicació abans de descarregar-la",
    "tencentAppStore": "Tencent App Store",
    "coolApk": "CoolApk",
    "vivoAppStore": "Vivo App Store (CN)",
    "name": "Nom",
    "smartname": "Nom (smart)",
    "sortMethod": "Mètode d'ordenació",
    "welcome": "Benvinguda",
    "documentationLinksNote": "La pàgina GitHub d'Obtainium enllaçada a sota conté enllaços a vídeos, articles, debats i altres recursos que t'ajudaran a entendre com usar l'aplicació.",
    "batteryOptimizationNote": "Tingues present que les descàrregues en segon pla funcionaran millor si inhabilites l'optimització de bateria per a Obtainium.",
    "fileDeletionError": "No s'ha pogut suprimir el fitxer (intenta suprimir-lo manualment i torna-ho a provar): \"{}\"",
    "foregroundService": "Servei d'Obtainium en primer pla",
    "foregroundServiceExplanation": "Usa el servei d'Obtainium en primer pla per comprovar les actualitzacions (és més fiable però consumeix més bateria)",
    "fgServiceNotice": "Aquesta notificació és necessària per comprovar les actualitzacions en segon pla (la pots ocultar als paràmetres del Sistema Operatiu)",
    "excludeSecrets": "Exclou els secrets",
    "GHReqPrefix": "exemple per a les peticions de GitHub",
    "includeZips": "Inclou fitxers ZIPName",
    "zippedApkFilterRegEx": "Filtre APKs dins ZIPName",
    "googleVerificationWarningP1": "Google ha anunciat que, començant en 2026/2027, totes les aplicacions en dispositius d'Android \"que requereixen que el desenvolupador enviï els detalls personals directament a Google.\n\nDes que els desenvolupadors d'aquesta aplicació no estan d'acord amb aquest requisit, l' obtenció ja no funcionarà en els dispositius certificats d'Android.",
    "googleVerificationWarningP2": "Aneu a https://buitandoideopen.org/ per a més informació.",
    "googleVerificationWarningP3": "Tingueu en compte que en el terme curt, pot continuar sent possible instal· lar aplicacions \"inverificats\" (no compatible) mitjançant un procés de flux \"advince\" que Google ha promès implementar després d'una gran reacció al seu anunci, però no han detallat com funcionaria, de manera que és clar si es preservarà realment les llibertats dels usuaris de cap manera pràctica.\n\nEn qualsevol cas, el moviment de Google és un pas significatiu cap al final de la informàtica lliure i general deficient per als individus.\n\nEls SO no validats, com el GraphenOS, no haurien de ser afectats per això sempre que se'ls permeti continuar existint.",
    "multipleSigners": "Signadors múltiples",
    "removeAppQuestion": {
        "one": "¿Suprimeixo l'aplicació?",
        "other": "¿Suprimeixo les aplicacions?"
    },
    "tooManyRequestsTryAgainInMinutes": {
        "one": "Massa peticions (límit excedit), torna-hi en {} minut",
        "other": "Massa peticions (límit excedit), torna-hi en {} minuts"
    },
    "bgUpdateGotErrorRetryInMinutes": {
        "one": "La comprovació d'actualitzacions en segon pla ha trobat un {}, es tornarà a provar en {} minut",
        "other": "La comprovació d'actualitzacions en segon pla ha trobat un {}, es tornarà a provar en {} minuts"
    },
    "bgCheckFoundUpdatesWillNotifyIfNeeded": {
        "one": "La comprovació d'actualitzacions en segon pla ha trobat {} actualització, t'ho notificarem si cal",
        "other": "La comprovació d'actualitzacions en segon pla ha trobat {} actualitzacions, t'ho notificarem si cal"
    },
    "apps": {
        "one": "{} Aplicació",
        "other": "{} Aplicacions"
    },
    "url": {
        "one": "{} URL",
        "other": "{} URLs"
    },
    "minute": {
        "one": "{} minut",
        "other": "{} minuts"
    },
    "hour": {
        "one": "{} hora",
        "other": "{} hores"
    },
    "day": {
        "one": "{} dia",
        "other": "{} dies"
    },
    "clearedNLogsBeforeXAfterY": {
        "one": "Suprimit {n} registre (anterior a = {before}, posterior a = {after})",
        "other": "Suprimits {n} registres (anteriors a = {before}, posteriors a = {after})"
    },
    "xAndNMoreUpdatesAvailable": {
        "one": "{} i 1 aplicació més tenen actualitzacions.",
        "other": "{} i {} aplicacions més tenen actualitzacions."
    },
    "xAndNMoreUpdatesInstalled": {
        "one": "{} i 1 aplicació més s'han actualitzat.",
        "other": "{} i {} aplicacions més s'han actualitzat."
    },
    "xAndNMoreUpdatesFailed": {
        "one": "Error en actualitzar {} i 1 aplicació més.",
        "other": "No s'ha pogut actualizar {} i {} aplicacions més."
    },
    "xAndNMoreUpdatesPossiblyInstalled": {
        "one": "{} i 1 aplicació més podrien haver estat actualizades.",
        "other": "{} i {} aplicacions més podrien haver estat actualitzades."
    },
    "apk": {
        "one": "{} APK",
        "other": "{} APKs"
    },
    "certificateHash": {
        "one": "Suma de certificat",
        "other": "Resums del certificat"
    }
}


================================================
FILE: assets/translations/cs.json
================================================
{
    "invalidURLForSource": "Žádná platná adresa URL aplikace {}",
    "noReleaseFound": "Nebyla nalezena odpovídající verze",
    "noVersionFound": "Nelze určit verzi vydání",
    "urlMatchesNoSource": "URL neodpovídá žádnému známému zdroji",
    "cantInstallOlderVersion": "Nelze nainstalovat starší verzi aplikace",
    "appIdMismatch": "ID staženého balíčku neodpovídá ID existující aplikace",
    "functionNotImplemented": "Tato třída nemá implementovánu tuto funkci",
    "placeholder": "Zástupce",
    "someErrors": "Došlo k chybám",
    "unexpectedError": "Neočekávaná chyba",
    "ok": "OK",
    "and": "a",
    "githubPATLabel": "Osobní přístupový token GitHub (zvyšuje limit požadavků)",
    "includePrereleases": "Zahrnout předběžná vydání",
    "fallbackToOlderReleases": "Přechod na starší verze",
    "filterReleaseTitlesByRegEx": "Filtrovat názvy verzí podle regulárního výrazu",
    "invalidRegEx": "Neplatný regulární výraz",
    "noDescription": "Žádný popis",
    "cancel": "Zrušit",
    "continue": "Pokračovat",
    "requiredInBrackets": "(vyžadováno)",
    "dropdownNoOptsError": "CHYBA: ROZBALOVACÍ NABÍDKA MUSÍ MÍT ALESPOŇ JEDNU MOŽNOST",
    "colour": "Barvu",
    "standard": "Standardní",
    "custom": "Vlastní",
    "useMaterialYou": "Použít Material You",
    "githubStarredRepos": "Repozitáře na GitHubu označené hvězdičkou",
    "uname": "Uživatelské jméno",
    "wrongArgNum": "Nesprávný počet zadaných argumentů",
    "xIsTrackOnly": "{} je určeno pouze pro sledování",
    "source": "Zdroj",
    "app": "Aplikace",
    "appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou „pouze pro sledování“.",
    "youPickedTrackOnly": "Vybrali jste možnost „pouze sledovat“.",
    "trackOnlyAppDescription": "Aplikace bude sledována kvůli aktualizacím, ale Obtainium ji nebude stahovat ani instalovat.",
    "cancelled": "Zrušeno",
    "appAlreadyAdded": "Aplikace již přidána",
    "alreadyUpToDateQuestion": "Aplikace je již aktualizovaná?",
    "addApp": "Přidat aplikaci",
    "appSourceURL": "Zdrojová adresa URL aplikace",
    "error": "Chyba",
    "add": "Přidat",
    "searchSomeSourcesLabel": "Vyhledávání (pouze pro určité zdroje)",
    "search": "Hledat",
    "additionalOptsFor": "Další možnosti pro {}",
    "supportedSources": "Podporované zdroje",
    "trackOnlyInBrackets": "(pouze sledování)",
    "searchableInBrackets": "(s možností vyhledávání)",
    "appsString": "Aplikace",
    "noApps": "Žádné aplikace",
    "noAppsForFilter": "Žádné aplikace pro vybraný filtr",
    "byX": "Od {}",
    "percentProgress": "Pokrok: {}%",
    "pleaseWait": "Počkejte prosím",
    "updateAvailable": "Aktualizace je k dispozici",
    "notInstalled": "Není nainstalováno",
    "pseudoVersion": "pseudoverze",
    "selectAll": "Vybrat vše",
    "deselectX": "Zrušit výběr {}",
    "xWillBeRemovedButRemainInstalled": "Aplikace {} bude odstraněna z aplikace Obtainium, ale zůstane nainstalována v zařízení.",
    "removeSelectedAppsQuestion": "Odstranit vybrané aplikace?",
    "removeSelectedApps": "Odstranit vybrané aplikace",
    "updateX": "Aktualizovat {}",
    "installX": "Instalovat {}",
    "markXTrackOnlyAsUpdated": "Označit aplikaci {}\n(pouze sledování)\njako aktualizovanou",
    "changeX": "Změnit {}",
    "installUpdateApps": "Instalovat/aktualizovat aplikace",
    "installUpdateSelectedApps": "Instalovat/aktualizovat vybrané aplikace",
    "markXSelectedAppsAsUpdated": "Označit {} vybraných aplikací jako aktuální?",
    "no": "Ne",
    "yes": "Ano",
    "markSelectedAppsUpdated": "Označit vybrané aplikace jako aktuální",
    "pinToTop": "Připnout nahoru",
    "unpinFromTop": "Odepnout shora",
    "resetInstallStatusForSelectedAppsQuestion": "Obnovit stav instalace vybraných aplikací?",
    "installStatusOfXWillBeResetExplanation": "Stav instalace vybraných aplikací bude resetován.\n\nTo může být užitečné, pokud je verze aplikace zobrazená v aplikaci Obtainium nesprávná z důvodu neúspěšných aktualizací nebo jiných problémů.",
    "customLinkMessage": "Tyto odkazy fungují na zařízeních s nainstalovaným Obtainium",
    "shareAppConfigLinks": "Sdílet konfiguraci aplikace jako odkaz HTML",
    "shareSelectedAppURLs": "Sdílet adresy URL vybraných aplikací",
    "resetInstallStatus": "Obnovit stav instalace",
    "more": "Více",
    "removeOutdatedFilter": "Odstranit filtr neaktuálních aplikací",
    "showOutdatedOnly": "Zobrazovat pouze zastaralé aplikace",
    "filter": "Filtr",
    "filterApps": "Filtrovat aplikace",
    "appName": "Název aplikace",
    "author": "Autor",
    "upToDateApps": "Aktuální aplikace",
    "nonInstalledApps": "Nenainstalované aplikace",
    "importExport": "Dovoz / vývoz",
    "settings": "Nastavení",
    "exportedTo": "Exportováno do {}",
    "obtainiumExport": "Export aplikace Obtainium",
    "invalidInput": "Neplatný vstup",
    "importedX": "Importováno {}",
    "obtainiumImport": "Import aplikace Obtainium",
    "importFromURLList": "Importovat ze seznamu adres",
    "searchQuery": "Vyhledávací dotaz",
    "appURLList": "Seznam adres aplikací",
    "line": "Linka",
    "searchX": "Vyhledávání {}",
    "noResults": "Nebyly nalezeny žádné výsledky",
    "importX": "Importovat {}",
    "importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako „nenainstalované“.\nChcete-li to opravit, nainstalujte je znovu prostřednictvím aplikace Obtainium.\nNemá vliv na data aplikací.\n\nOvlivňuje pouze způsoby importu URL a třetích stran.",
    "importErrors": "Chyba importu",
    "importedXOfYApps": "Importováno {} z {} aplikací.",
    "followingURLsHadErrors": "U následujících adres došlo k chybám:",
    "selectURL": "Vybrat adresu",
    "selectURLs": "Select adresy",
    "pick": "Vybrat",
    "theme": "Motiv",
    "dark": "Tmavé",
    "light": "Světlé",
    "followSystem": "Podle systému",
    "followSystemThemeExplanation": "Používání motivu systému je možné pouze pomocí aplikací třetích stran",
    "useBlackTheme": "Použít čistě černý tmavý motiv",
    "appSortBy": "Seřadit podle",
    "authorName": "Autor/jméno",
    "nameAuthor": "Jméno/autor",
    "asAdded": "Přidáno",
    "appSortOrder": "Seřadit",
    "ascending": "Vzestupně",
    "descending": "Sestupně",
    "bgUpdateCheckInterval": "Interval kontroly aktualizace na pozadí",
    "neverManualOnly": "Nikdy – pouze ručně",
    "appearance": "Vzhled",
    "showWebInAppView": "Zobrazit zdrojové webové stránky v zobrazení aplikace",
    "pinUpdates": "Připnout aplikace s aktualizacemi nahoru",
    "updates": "Aktualizace",
    "sourceSpecific": "Specifické pro zdroj",
    "appSource": "Zdroj aplikace",
    "noLogs": "Žádné protokoly",
    "appLogs": "Protokoly aplikace",
    "close": "Zavřít",
    "share": "Sdílet",
    "appNotFound": "Aplikace nenalezena",
    "obtainiumExportHyphenatedLowercase": "obtainium-export",
    "pickAnAPK": "Vybrat APK",
    "appHasMoreThanOnePackage": "{} má více než jeden balíček:",
    "deviceSupportsXArch": "Vaše zařízení podporuje architekturu CPU {}.",
    "deviceSupportsFollowingArchs": "Vaše zařízení podporuje následující architektury CPU:",
    "warning": "Varování",
    "sourceIsXButPackageFromYPrompt": "Zdroj aplikace je „{}“, ale balíček pro vydání pochází z „{}“. Pokračovat?",
    "updatesAvailable": "Dostupné aktualizace",
    "updatesAvailableNotifDescription": "Upozorňuje uživatele, že jsou k dispozici aktualizace pro jednu nebo více aplikací sledovaných Obtainium",
    "noNewUpdates": "Žádné nové aktualizace.",
    "xHasAnUpdate": "{} má aktualizaci.",
    "appsUpdated": "Aplikace aktualizovány",
    "appsNotUpdated": "Nepodařilo se aktualizovat aplikace",
    "appsUpdatedNotifDescription": "Upozornit, že byly provedeny aktualizace jedné nebo více aplikací na pozadí",
    "xWasUpdatedToY": "Aplikace {} byla aktualizována na {}.",
    "xWasNotUpdatedToY": "Nepodařilo se aktualizovat {} na {}.",
    "errorCheckingUpdates": "Chyba kontroly aktualizací",
    "errorCheckingUpdatesNotifDescription": "Zobrazit oznámení při neúspěšné kontrole aktualizací na pozadí",
    "appsRemoved": "Odstraněné aplikace",
    "appsRemovedNotifDescription": "Oznámit, že jedna nebo více aplikací bylo odstraněno z důvodu chyb při načítání",
    "xWasRemovedDueToErrorY": "{} byla odstraněna z důvodu následující chyby: {}",
    "completeAppInstallation": "Dokončit instalaci aplikace",
    "obtainiumMustBeOpenToInstallApps": "Obtainium musí být otevřeno, aby bylo možné instalovat aplikace",
    "completeAppInstallationNotifDescription": "Vyzvat k návratu do Obtainium pro dokončení instalace aplikací",
    "checkingForUpdates": "Zkontrolovat aktualizace",
    "checkingForUpdatesNotifDescription": "Dočasné oznámení zobrazené při kontrole aktualizací",
    "pleaseAllowInstallPerm": "Povolte prosím aplikaci Obtainium instalovat aplikace",
    "trackOnly": "Pouze sledovat",
    "errorWithHttpStatusCode": "Chyba {}",
    "versionCorrectionDisabled": "Oprava verze zakázána (zásuvný modul zřejmě nefunguje)",
    "unknown": "Neznám",
    "none": "Žádný",
    "all": "Všechny",
    "never": "Nikdy",
    "latestVersionX": "Nejnovější verze: {}",
    "installedVersionX": "Nainstalovaná verze: {}",
    "lastUpdateCheckX": "Poslední kontrola aktualizací: {}",
    "remove": "Odebrat",
    "yesMarkUpdated": "Ano, označit jako aktualizované",
    "fdroid": "Oficiální repozitář F-Droid",
    "appIdOrName": "ID nebo název aplikace",
    "appId": "ID aplikace",
    "appWithIdOrNameNotFound": "Žádná aplikace s tímto ID nebo názvem nebyla nalezena",
    "reposHaveMultipleApps": "Repozitáře mohou obsahovat více aplikací",
    "fdroidThirdPartyRepo": "F-Droid repozitář třetí strany",
    "install": "Instalovat",
    "markInstalled": "Označit jako nainstalovaný",
    "update": "Aktualizovat",
    "markUpdated": "Označit jako aktuální",
    "additionalOptions": "Další možnosti",
    "disableVersionDetection": "Deaktivovat detekci verze",
    "noVersionDetectionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně.",
    "downloadingX": "Stáhnout {}",
    "downloadX": "Stáhnout {}",
    "downloadedX": "Staženo {}",
    "releaseAsset": "Soubor vydání",
    "downloadNotifDescription": "Informuje uživatele o průběhu stahování aplikace",
    "noAPKFound": "Žádná APK nebyla nalezena",
    "noVersionDetection": "Žádná detekce verze",
    "categorize": "Kategorizovat",
    "categories": "Kategorie",
    "category": "Kategorie",
    "noCategory": "Žádná kategorie",
    "noCategories": "Žádné kategorie",
    "deleteCategoriesQuestion": "Smazat kategorie?",
    "categoryDeleteWarning": "Všechny aplikace v odstraněných kategoriích budou nastaveny na nekategorizované.",
    "addCategory": "Přidat kategorii",
    "label": "Popisek",
    "language": "Jazyk",
    "copiedToClipboard": "Zkopírováno do schránky",
    "storagePermissionDenied": "Oprávnění k ukládání odepřeno",
    "selectedCategorizeWarning": "Toto nahradí všechna stávající nastavení kategorií pro vybrané aplikace.",
    "filterAPKsByRegEx": "Filtrovat APK podle regulárního výrazu",
    "removeFromObtainium": "Odebrat z Obtainia",
    "uninstallFromDevice": "Odinstalovat ze zařízení",
    "onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.",
    "releaseDateAsVersion": "Použít datum vydání jako verzi",
    "releaseTitleAsVersion": "Použít název vydání jako řetězec verze",
    "releaseDateAsVersionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně, ale je k dispozici datum vydání.",
    "changes": "Změny",
    "releaseDate": "Datum vydání",
    "importFromURLsInFile": "Importovat adresy URL ze souboru (např. OPML)",
    "versionDetectionExplanation": "Sloučit řetězec verze s verzí zjištěnou z OS",
    "versionDetection": "Detekce verze",
    "standardVersionDetection": "Standardní detekce verze",
    "groupByCategory": "Seskupit podle kategorie",
    "autoApkFilterByArch": "Pokud je to možné, pokuste se filtrovat soubory APK podle architektury procesoru",
    "autoLinkFilterByArch": "Pokusit se filtrovat odkazy podle architektury procesoru, pokud je to možné",
    "overrideSource": "Přepsat zdroj",
    "dontShowAgain": "Nezobrazovat znovu",
    "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro „pouze sledované“",
    "dontShowAPKOriginWarnings": "Nezobrazovat varování o původu APK",
    "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace",
    "gitlabPATLabel": "Osobní přístupový token GitLab",
    "about": "Informace",
    "requiresCredentialsInSettings": "{} vyžaduje další pověření (v nastavení)",
    "checkOnStart": "Zkontrolovat aktualizace při spuštění",
    "tryInferAppIdFromCode": "Pokusit se určit ID aplikace ze zdrojového kódu",
    "removeOnExternalUninstall": "Automaticky odstranit externě odinstalované aplikace",
    "pickHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK",
    "checkUpdateOnDetailPage": "Zkontrolovat aktualizaci při otevření stránky s podrobnostmi aplikace",
    "disablePageTransitions": "Zakázat animace pro přechody stránek",
    "reversePageTransitions": "Obrátit animace pro přechody stránek",
    "minStarCount": "Minimální počet hvězdiček",
    "addInfoBelow": "Přidat tuto informaci na konec stránky.",
    "addInfoInSettings": "Přidat tuto informaci do nastavení.",
    "githubSourceNote": "Limit požadavků služby GitHub lze obejít pomocí klíče API.",
    "sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu",
    "filterReleaseNotesByRegEx": "Filtrovat seznam změn podle regulárního výrazu",
    "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí: „.apk$“)",
    "appsPossiblyUpdated": "Byly provedeny pokusy o aktualizaci aplikací",
    "appsPossiblyUpdatedNotifDescription": "Upozorňuje uživatele, že na pozadí mohly být provedeny aktualizace jedné nebo více aplikací",
    "xWasPossiblyUpdatedToY": "{} mohlo být aktualizováno na {}.",
    "enableBackgroundUpdates": "Povolit aktualizace na pozadí",
    "backgroundUpdateReqsExplanation": "Aktualizace na pozadí nemusí být možná pro všechny aplikace.",
    "backgroundUpdateLimitsExplanation": "Úspěšnost instalace na pozadí lze určit pouze v případě, že je otevřeno Obtainium.",
    "verifyLatestTag": "Ověřit značku „latest“",
    "intermediateLinkRegex": "Filtr pro návštěvu „prostředního“ odkazu",
    "filterByLinkText": "Filtrovat odkazy podle textu odkazu",
    "matchLinksOutsideATags": "Shoda odkazů mimo značky <a>",
    "intermediateLinkNotFound": "Připojený odkaz nenalezen",
    "intermediateLink": "Připojený odkaz",
    "exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
    "bgUpdatesOnWiFiOnly": "Zakázat aktualizace na pozadí, pokud není k dispozici Wi-Fi",
    "bgUpdatesWhileChargingOnly": "Zakázat aktualizace na pozadí, pokud se zařízení nenabíjí",
    "autoSelectHighestVersionCode": "Automaticky vybrat APK s nejvyšším kódem verze",
    "versionExtractionRegEx": "Extrakce verze pomocí RegEx",
    "trimVersionString": "Oříznutí řetězce verze pomocí RegEx",
    "matchGroupToUseForX": "Shoda se skupinou k použití pro „{}“",
    "matchGroupToUse": "Odpovídá použité skupině",
    "highlightTouchTargets": "Zvýraznit méně zjevné cíle dotyku",
    "pickExportDir": "Vybrat adresář pro export",
    "autoExportOnChanges": "Automatický export při změně",
    "includeSettings": "Zahrnout nastavení",
    "filterVersionsByRegEx": "Filtrovat verze podle regulárních výrazů",
    "trySelectingSuggestedVersionCode": "Zkusit vybrat navrhovanou verzi APK",
    "dontSortReleasesList": "Seřadit vydání z rozhraní API",
    "reverseSort": "Obrácené třídění",
    "takeFirstLink": "Použít první odkaz",
    "skipSort": "Přeskočit třídění",
    "debugMenu": "Nabídka ladění",
    "bgTaskStarted": "Spuštěna úloha na pozadí - zkontrolujte protokoly.",
    "runBgCheckNow": "Spustit kontrolu aktualizací na pozadí nyní",
    "versionExtractWholePage": "Použít extrakci verze pomocí RegEx na celou stránku",
    "installing": "Instaluji",
    "skipUpdateNotifications": "Neposkytovat oznámení o aktualizaci",
    "updatesAvailableNotifChannel": "Dostupné aktualizace",
    "appsUpdatedNotifChannel": "Aplikace aktualizovány",
    "appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizace aplikací",
    "errorCheckingUpdatesNotifChannel": "Chyba při kontrole aktualizací",
    "appsRemovedNotifChannel": "Aplikace odstraněny",
    "downloadingXNotifChannel": "Stáhnout {}",
    "completeAppInstallationNotifChannel": "Dokončit instalaci aplikace",
    "checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace",
    "onlyCheckInstalledOrTrackOnlyApps": "Aktualizace kontrolovat pouze u nainstalovaných a sledovaných aplikací",
    "supportFixedAPKURL": "Odhadnout novější verzi na základě prvních třiceti číslic kontrolního součtu adresy URL APK, pokud není podporována jinak",
    "selectX": "Vybrat {}",
    "parallelDownloads": "Povolit souběžné stahování",
    "useShizuku": "K instalaci použít Shizuku nebo Sui",
    "shizukuBinderNotFound": "Shizuku neběží",
    "shizukuOld": "Stará verze Shizuku (<11) - aktualizujte ji",
    "shizukuOldAndroidWithADB": "Shizuku běží na Androidu < 8.1 s ADB - aktualizujte Android nebo místo toho použijte Sui",
    "shizukuPretendToBeGooglePlay": "Nastavit Google Play jako zdroj instalace (pokud se používá Shizuku)",
    "useSystemFont": "Použít systémové písmo",
    "useVersionCodeAsOSVersion": "Použít kód verze aplikace jako verzi zjištěnou OS",
    "requestHeader": "Hlavička požadavku",
    "useLatestAssetDateAsReleaseDate": "Použít poslední nahraný soubor jako datum vydání",
    "defaultPseudoVersioningMethod": "Výchozí metoda pseudoverze",
    "partialAPKHash": "Částečný hash APK",
    "APKLinkHash": "Odkaz APK Hash",
    "directAPKLink": "Přímý odkaz APK",
    "pseudoVersionInUse": "Pseudoverze se používá",
    "installed": "Nainstalováno",
    "latest": "Nejnovější",
    "invertRegEx": "Invertovat regulární výraz",
    "note": "Poznámka",
    "selfHostedNote": "Rozbalovací seznam „{}“ lze použít pro přístup k vlastním instancím libovolného zdroje.",
    "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)",
    "beforeNewInstallsShareToAppVerifier": "Sdílet nové aplikace s aplikací AppVerifier (pokud je k dispozici)",
    "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.",
    "wiki": "Nápověda/Wiki",
    "crowdsourcedConfigsLabel": "Komunitní konfigurace aplikací (použití na vlastní nebezpečí)",
    "crowdsourcedConfigsShort": "Konfigurace aplikací s využitím crowdsourcingu",
    "allowInsecure": "Povolit nezabezpečené požadavků HTTP",
    "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější",
    "useFirstApkOfVersion": "Automatický výběr prvního z více souborů APK",
    "refreshBeforeDownload": "Obnovit údaje o aplikaci před stažením",
    "tencentAppStore": "Tencent App Store",
    "coolApk": "CoolApk",
    "vivoAppStore": "vivo App Store (CN)",
    "name": "Název",
    "smartname": "Název (chytrý)",
    "sortMethod": "Metoda třídění",
    "welcome": "Vítejte na",
    "documentationLinksNote": "Níže odkazovaná stránka Obtainium GitHub obsahuje odkazy na videa, články, diskuse a další zdroje, které vám pomohou pochopit, jak aplikaci používat.",
    "batteryOptimizationNote": "Upozorňujeme, že stahování na pozadí může fungovat spolehlivěji, pokud v nastavení aplikace Obtainium přepnete na „službu v popředí“ a/nebo v nastavení operačního systému pro Obtainium vypnete optimalizaci baterie.",
    "fileDeletionError": "Soubor se nepodařilo odstranit (zkuste jej odstranit ručně a akci opakujte): „{}“",
    "foregroundService": "Služba Obtainium na popředí",
    "foregroundServiceExplanation": "Použít službu v popředí pro kontrolu aktualizací (spolehlivější, spotřebovává více energie)",
    "fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení systému)",
    "excludeSecrets": "Vyloučit tajemství",
    "GHReqPrefix": "instance 'sky22333/hubproxy' pro požadavky GitHubu",
    "includeZips": "Zahrnout soubory ZIP",
    "zippedApkFilterRegEx": "Filtrování souborů APK uvnitř ZIP",
    "googleVerificationWarningP1": "Společnost Google oznámila, že počínaje rokem 2026 / 2027 budou všechny aplikace na \"certifikovaných\" zařízeních pro Android vyžadovat, aby vývojář předložil osobní údaje o identitě přímo společnosti Google.\n\nVzhledem k tomu, vývojáři této aplikace nesouhlasí s tímto požadavkem, Obstainium již nebude pracovat na certifikovaných Android zařízení po této době.",
    "googleVerificationWarningP2": "Další informace získáte na adrese https: / / keepandroidopen.org.",
    "googleVerificationWarningP3": "Všimněte si, že v krátkodobém horizontu může být i nadále možné instalovat \"neověřené\" (nevyhovující) aplikace prostřednictvím procesu \"pokročilého toku\", který Google slíbil implementovat po širokém odporu k jejich oznámení, ale neupřesnili, jak by to mělo fungovat, takže není jasné, zda bude skutečně zachovávat uživatelskou svobodu jakýmkoli praktickým způsobem.\n\nV každém případě je krok společnosti Google významným krokem ke konci volného, všeobecného výpočetní techniky pro jednotlivce.\n\nNecertifikované Osy, jako je GrapheneOS, by tím neměly být ovlivněny, pokud budou nadále existovat.",
    "multipleSigners": "Několik signers",
    "removeAppQuestion": {
        "one": "Odstranit aplikaci?",
        "other": "Odstranit aplikace?"
    },
    "tooManyRequestsTryAgainInMinutes": {
        "one": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minutu",
        "few": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minuty",
        "other": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minut"
    },
    "bgUpdateGotErrorRetryInMinutes": {
        "one": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minutu",
        "few": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minuty",
        "other": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minut"
    },
    "bgCheckFoundUpdatesWillNotifyIfNeeded": {
        "one": "Při kontrole aktualizací na pozadí nalezena {} aktualizace – v případě potřeby bude upozorněn uživatel",
        "few": "Při kontrole aktualizací na pozadí nalezeny {} aktualizace – v případě potřeby bude upozorněn uživatel",
        "other": "Při kontrole aktualizací na pozadí nalezeno {} aktualizací – v případě potřeby bude upozorněn uživatel"
    },
    "apps": {
        "one": "{} aplikace",
        "few": "{} aplikace",
        "other": "{} aplikací"
    },
    "url": {
        "one": "{} adresa",
        "few": "{} adresy",
        "other": "{} adres"
    },
    "minute": {
        "one": "{} minuta",
        "few": "{} minuty",
        "other": "{} minut"
    },
    "hour": {
        "one": "{} hodina",
        "few": "{} hodiny",
        "other": "{} hodin"
    },
    "day": {
        "one": "{} den",
        "few": "{} dny",
        "other": "{} dní"
    },
    "clearedNLogsBeforeXAfterY": {
        "one": "Vymazán {n} záznam (před = {before}, po = {after})",
        "few": "Vymazány {n} záznamy (před = {before}, po = {after})",
        "other": "Vymazáno {n} záznamů (před = {before}, po = {after})"
    },
    "xAndNMoreUpdatesAvailable": {
        "one": "{} a 1 další aplikace mají aktualizace.",
        "few": "{} a {} další aplikace mají aktualizace.",
        "other": "{} a {} dalších aplikací má aktualizace."
    },
    "xAndNMoreUpdatesInstalled": {
        "one": "{} a 1 další aplikace byly aktualizovány.",
        "few": "{} a {} další aplikace byly aktualizovány.",
        "other": "{} a {} dalších aplikací bylo aktualizováno."
    },
    "xAndNMoreUpdatesFailed": {
        "one": "Nepodařilo se aktualizovat {} a 1 další aplikaci.",
        "few": "Nepodařilo se aktualizovat {} a {} další aplikace.",
        "other": "Nepodařilo se aktualizovat {} a {} dalších aplikací."
    },
    "xAndNMoreUpdatesPossiblyInstalled": {
        "one": "{} a 1 další aplikace možná byly aktualizovány.",
        "few": "{} a {} další aplikace možná byly aktualizovány.",
        "other": "{} a {} dalších aplikací možná bylo aktualizováno."
    },
    "apk": {
        "one": "{} APK",
        "other": "{} APK"
    },
    "certificateHash": {
        "one": "Haš osvědčení",
        "other": "Uzávěry certifikátů"
    }
}


================================================
FILE: assets/translations/da.json
================================================
{
    "invalidURLForSource": "Ikke et gyldigt {} app-URL",
    "noReleaseFound": "Kunne ikke finde en passende udgivelse",
    "noVersionFound": "Kunne ikke afgøre udgivelsesversion",
    "urlMatchesNoSource": "URL'en matcher ikke en kendt kilde",
    "cantInstallOlderVersion": "Kan ikke installere en ældre version af en app",
    "appIdMismatch": "Hentet pakke-ID matcher ikke eksisterende app-ID",
    "functionNotImplemented": "Denne klasse har ikke implementeret denne funktion",
    "placeholder": "Pladsholder",
    "someErrors": "Nogle fejl opstod",
    "unexpectedError": "Uventet fejl",
    "ok": "Okay",
    "and": "og",
    "githubPATLabel": "GitHub Personlig Adgangstoken (øger hastighedsgrænse)",
    "includePrereleases": "Inkluder forudgivelser",
    "fallbackToOlderReleases": "Fallback til ældre udgivelser",
    "filterReleaseTitlesByRegEx": "Filtrer udgivelsestitler efter regulært udtryk",
    "invalidRegEx": "Ugyldigt regulært udtryk",
    "noDescription": "Ingen beskrivelse",
    "cancel": "Annuller",
    "continue": "Fortsæt",
    "requiredInBrackets": "(Påkrævet)",
    "dropdownNoOptsError": "FEJL: RULLEMENU SKAL HAVE MINDST ÉT TILVALG",
    "colour": "Farve",
    "standard": "Standard",
    "custom": "Brugerdefineret",
    "useMaterialYou": "Brug Material You",
    "githubStarredRepos": "Stjernemarkeret GitHub-repos",
    "uname": "Brugernavn",
    "wrongArgNum": "Forkert antal argumenter angivet",
    "xIsTrackOnly": "{} er 'Følg Kun'",
    "source": "Kilde",
    "app": "App",
    "appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg Kun'.",
    "youPickedTrackOnly": "Du har valgt 'Følg Kun'-indstillingen.",
    "trackOnlyAppDescription": "Appen tjekkes for opdateringer, men Obtainium kan ikke hente eller installere den.",
    "cancelled": "Annulleret",
    "appAlreadyAdded": "Appen er allerede tilføjet",
    "alreadyUpToDateQuestion": "Er appen allerede opdateret?",
    "addApp": "Tilføj app",
    "appSourceURL": "URL til app-kilde",
    "error": "Fejl",
    "add": "Tilføj",
    "searchSomeSourcesLabel": "Søg (kun visse kilder)",
    "search": "Søg",
    "additionalOptsFor": "Flere indstillinger for {}",
    "supportedSources": "Understøttede kilder",
    "trackOnlyInBrackets": "(Følg Kun)",
    "searchableInBrackets": "(Kan Søges)",
    "appsString": "Apps",
    "noApps": "Ingen apps",
    "noAppsForFilter": "Ingen apps til filter",
    "byX": "Af {}",
    "percentProgress": "Hentning: {}%",
    "pleaseWait": "Vent venligst",
    "updateAvailable": "Opdatering tilgængelig",
    "notInstalled": "Ikke installeret",
    "pseudoVersion": "pseudo-version",
    "selectAll": "Vælg alle",
    "deselectX": "Fravælg {}",
    "xWillBeRemovedButRemainInstalled": "{} fjernes fra Obtainium, men forbliver installeret på enheden.",
    "removeSelectedAppsQuestion": "Fjern valgte apps?",
    "removeSelectedApps": "Fjern valgte apps",
    "updateX": "Opdater {}",
    "installX": "Installer {}",
    "markXTrackOnlyAsUpdated": "Markér {}\n(Følg Kun)\nsom opdateret",
    "changeX": "Skift {}",
    "installUpdateApps": "Installer/Opdater apps",
    "installUpdateSelectedApps": "Installer/Opdater valgte apps",
    "markXSelectedAppsAsUpdated": "Markér {} valgte apps som opdateret?",
    "no": "Nej",
    "yes": "Ja",
    "markSelectedAppsUpdated": "Markér valgte apps som opdateret",
    "pinToTop": "Fastgør til toppen",
    "unpinFromTop": "Frigør fra toppen",
    "resetInstallStatusForSelectedAppsQuestion": "Nulstil installationsstatus for valgte apps?",
    "installStatusOfXWillBeResetExplanation": "Installationsstatus for alle valgte apps nulstilles.\n\nDette kan hjælpe, når en forkert app-version vises i Obtainium grundet mislykkede opdateringer eller andre problemer.",
    "customLinkMessage": "Disse links virker på enheder med Obtainium installeret",
    "shareAppConfigLinks": "Del app-konfiguration som HTML-link",
    "shareSelectedAppURLs": "Del valgte app-URL'er",
    "resetInstallStatus": "Nulstil installationsstatus",
    "more": "Mere",
    "removeOutdatedFilter": "Fjern forældet app-filter",
    "showOutdatedOnly": "Vis kun forældede apps",
    "filter": "Filtrer",
    "filterApps": "Filtrer Apps",
    "appName": "Appnavn",
    "author": "Udvikler",
    "upToDateApps": "Opdaterede apps",
    "nonInstalledApps": "Ikke-installerede apps",
    "importExport": "Import/Eksport",
    "settings": "Indstillinger",
    "exportedTo": "Eksportér til {}",
    "obtainiumExport": "Obtainium-eksport",
    "invalidInput": "Ugyldigt input",
    "importedX": "Importerede {}",
    "obtainiumImport": "Obtainium-import",
    "importFromURLList": "Importér fra URL-liste",
    "searchQuery": "Søgning",
    "appURLList": "Liste over app-URL'er",
    "line": "Linje",
    "searchX": "Søg {}",
    "noResults": "Ingen resultater fundet",
    "importX": "Importér {}",
    "importedAppsIdDisclaimer": "Importerede apps vises muligvis forkert som \"Ikke installeret\".\nFor at løse dette, geninstaller dem via Obtainium.\nDette bør ikke påvirke app-data.\n\nPåvirker kun URL- og tredjepartsimportmetoder.",
    "importErrors": "Importfejl",
    "importedXOfYApps": "{} af {} app importeret.",
    "followingURLsHadErrors": "Følgende URL'er havde fejl:",
    "selectURL": "Vælg URL",
    "selectURLs": "Vælg URL'er",
    "pick": "Vælg",
    "theme": "Tema",
    "dark": "Mørk",
    "light": "Lys",
    "followSystem": "Følg system",
    "followSystemThemeExplanation": "Det er kun muligt at følge systemtemaet ved brug af tredjepartsapplikationer",
    "useBlackTheme": "Brug rent sort mørkt tema",
    "appSortBy": "Sortér apps efter:",
    "authorName": "Udvikler/Navn",
    "nameAuthor": "Navn/Udvikler",
    "asAdded": "Som tilføjet",
    "appSortOrder": "Sorteringsrækkefølge for apps",
    "ascending": "Stigende",
    "descending": "Faldende",
    "bgUpdateCheckInterval": "Kontrolinterval for baggrundsopdatering",
    "neverManualOnly": "Aldrig - Kun manuelt",
    "appearance": "Udseende",
    "showWebInAppView": "Vis kildewebsiden i app-visning",
    "pinUpdates": "Fastgør opdateringer øverst i app-visning",
    "updates": "Opdateringer",
    "sourceSpecific": "Kildespecifik",
    "appSource": "App-kilde",
    "noLogs": "Ingen logs",
    "appLogs": "App-logs",
    "close": "Luk",
    "share": "Del",
    "appNotFound": "App ikke fundet",
    "obtainiumExportHyphenatedLowercase": "obtainium-eksport",
    "pickAnAPK": "Vælg en APK",
    "appHasMoreThanOnePackage": "{} har mere end én pakke:",
    "deviceSupportsXArch": "Din enhed understøtter CPU-arkitekturen {}.",
    "deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekturer:",
    "warning": "Advarsel",
    "sourceIsXButPackageFromYPrompt": "App-kilden er '{}', men udgivelsespakken kommer fra '{}'. Fortsæt?",
    "updatesAvailable": "Opdateringer tilgængelige",
    "updatesAvailableNotifDescription": "Underretter brugeren om tilgængelige opdateringer for en eller flere apps, som Obtainium følger",
    "noNewUpdates": "Ingen nye opdateringer.",
    "xHasAnUpdate": "{} har en opdatering.",
    "appsUpdated": "Apps opdateret",
    "appsNotUpdated": "Kunne ikke opdatere applikationerne",
    "appsUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps blev udført i baggrunden",
    "xWasUpdatedToY": "{} blev opdateret til {}.",
    "xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.",
    "errorCheckingUpdates": "Fejl ved tjek for opdateringer",
    "errorCheckingUpdatesNotifDescription": "En meddelelse, der vises, opdateringstjek i baggrunden mislykkes",
    "appsRemoved": "Apps fjernet",
    "appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet grundet fejl under indlæsning af dem",
    "xWasRemovedDueToErrorY": "{} blev fjernet grundet denne fejl: {}",
    "completeAppInstallation": "Færdiggør app-installation",
    "obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at installere apps",
    "completeAppInstallationNotifDescription": "Beder brugeren om at gå tilbage til Obtainium for at færdiggøre installation af en app",
    "checkingForUpdates": "Tjekker for opdateringer",
    "checkingForUpdatesNotifDescription": "Kortvarig meddelelse ved tjek for opdateringer",
    "pleaseAllowInstallPerm": "Tillad venligst Obtainium at installere apps",
    "trackOnly": "Følg Kun",
    "errorWithHttpStatusCode": "Fejl {}",
    "versionCorrectionDisabled": "Versionskorrektion deaktiveret (plugin ser ikke ud til at virke)",
    "unknown": "Ukendt",
    "none": "Ingen",
    "all": "Alle",
    "never": "Aldrig",
    "latestVersionX": "Seneste: {}",
    "installedVersionX": "Installeret: {}",
    "lastUpdateCheckX": "Sidste opdateringstjek: {}",
    "remove": "Fjern",
    "yesMarkUpdated": "Ja, markér som opdateret",
    "fdroid": "F-Droid Officiel",
    "appIdOrName": "App-ID eller -navn",
    "appId": "App-ID",
    "appWithIdOrNameNotFound": "Ingen app med det ID eller navn blev fundet",
    "reposHaveMultipleApps": "Repos kan indeholde flere apps",
    "fdroidThirdPartyRepo": "F-Droid Tredjeparts-repo",
    "install": "Installer",
    "markInstalled": "Markér som installeret",
    "update": "Opdater",
    "markUpdated": "Markér som opdateret",
    "additionalOptions": "Flere indstillinger",
    "disableVersionDetection": "Deaktivér versionsregistrering",
    "noVersionDetectionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt.",
    "downloadingX": "Henter {}",
    "downloadX": "Hent {}",
    "downloadedX": "Hentede {}",
    "releaseAsset": "Udgivelsesressource",
    "downloadNotifDescription": "Underretter brugeren om status på hentning af en app",
    "noAPKFound": "Ingen APK fundet",
    "noVersionDetection": "Ingen versionsregistrering",
    "categorize": "Kategoriser",
    "categories": "Kategorier",
    "category": "Kategori",
    "noCategory": "Ingen kategori",
    "noCategories": "Ingen kategorier",
    "deleteCategoriesQuestion": "Slet kategorier?",
    "categoryDeleteWarning": "Alle apps i slettede kategorier indstilles til ukategoriseret.",
    "addCategory": "Tilføj kategori",
    "label": "Etiket",
    "language": "Sprog",
    "copiedToClipboard": "Kopieret til udklipsholder",
    "storagePermissionDenied": "Lagringstilladelse nægtet",
    "selectedCategorizeWarning": "Dette erstatter alle eksisterende kategoriindstillinger for de valgte apps.",
    "filterAPKsByRegEx": "Filtrer APK'er efter regulært udtryk",
    "removeFromObtainium": "Fjern fra Obtainium",
    "uninstallFromDevice": "Afinstaller fra enhed",
    "onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versionsregistrering deaktiveret.",
    "releaseDateAsVersion": "Brug udgivelsesdato som versionsstreng",
    "releaseTitleAsVersion": "Brug udgivelsestitel som versionsstreng",
    "releaseDateAsVersionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt, men hvor en udgivelsesdato er tilgængelig.",
    "changes": "Ændringer",
    "releaseDate": "Udgivelsesdato",
    "importFromURLsInFile": "Importér fra URL'er i fil (som OPML)",
    "versionDetectionExplanation": "Afstem versionsstreng med versionen registreret fra OS",
    "versionDetection": "Versionsregistrering",
    "standardVersionDetection": "Standard versionsregistrering",
    "groupByCategory": "Gruppér efter kategori",
    "autoApkFilterByArch": "Forsøg at filtrere APK'er efter CPU-arkitektur, hvis muligt",
    "autoLinkFilterByArch": "Forsøg at filtrere links efter CPU-arkitektur, hvis det er muligt",
    "overrideSource": "Tilsidesæt kilde",
    "dontShowAgain": "Vis ikke igen",
    "dontShowTrackOnlyWarnings": "Vis ikke 'Følg Kun'-advarsler",
    "dontShowAPKOriginWarnings": "Vis ikke advarsler om APK-oprindelse",
    "moveNonInstalledAppsToBottom": "Flyt ikke-installerede apps nederst i app-visning",
    "gitlabPATLabel": "GitLab Personlig Adgangstoken",
    "about": "Om",
    "requiresCredentialsInSettings": "{} kræver yderligere legitimation (i Indstillinger)",
    "checkOnStart": "Tjek for opdateringer ved opstart",
    "tryInferAppIdFromCode": "Forsøg at udlede app-ID fra kildekode",
    "removeOnExternalUninstall": "Fjern automatisk eksternt afinstallerede apps",
    "pickHighestVersionCode": "Auto-vælg højeste versionKode af APK",
    "checkUpdateOnDetailPage": "Tjek for opdateringer ved åbning af appens detaljeside",
    "disablePageTransitions": "Deaktivér sideovergangsanimationer",
    "reversePageTransitions": "Omvendte sideovergangsanimationer",
    "minStarCount": "Minimum antal stjerner",
    "addInfoBelow": "Tilføj denne info nedenfor.",
    "addInfoInSettings": "Tilføj denne info i Indstillinger.",
    "githubSourceNote": "GitHub's hastighedsbegrænsning kan undgås med en API-nøgle.",
    "sortByLastLinkSegment": "Sortér kun efter det sidste segment af linket",
    "filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulært udtryk",
    "customLinkFilterRegex": "Brugerdefineret APK-linkfilter efter regulært udtryk (standard '.apk$')",
    "appsPossiblyUpdated": "App-opdateringer forsøgt",
    "appsPossiblyUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps muligvis blev udført i baggrunden",
    "xWasPossiblyUpdatedToY": "{} er muligvis blevet opdateret til {}.",
    "enableBackgroundUpdates": "Aktivér baggrundsopdateringer",
    "backgroundUpdateReqsExplanation": "Baggrundsopdateringer er måske ikke mulige for alle apps.",
    "backgroundUpdateLimitsExplanation": "En vellykket baggrundsinstallation kan kun afgøres, når Obtainium åbnes.",
    "verifyLatestTag": "Verificer 'seneste'-tagget",
    "intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
    "filterByLinkText": "Filtrer links efter linktekst",
    "matchLinksOutsideATags": "Match links uden for <a>-tags",
    "intermediateLinkNotFound": "Mellemliggende link ikke fundet",
    "intermediateLink": "Mellemliggende link",
    "exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
    "bgUpdatesOnWiFiOnly": "Deaktiver baggrundsopdateringer, når du ikke er på Wi-Fi",
    "bgUpdatesWhileChargingOnly": "Deaktiver baggrundsopdateringer, når du ikke oplader",
    "autoSelectHighestVersionCode": "Auto-vælg højeste versionKode af APK",
    "versionExtractionRegEx": "RegEx for versionsstrengsudtrækning",
    "trimVersionString": "Trim versionsstreng med RegEx",
    "matchGroupToUseForX": "Match-gruppe til brug for \"{}\"",
    "matchGroupToUse": "RegEx-matchgruppe til brug for versionsstrengsudtrækning",
    "highlightTouchTargets": "Fremhæv mindre åbenlyse berøringsmål",
    "pickExportDir": "Vælg eksportmappe",
    "autoExportOnChanges": "Auto-eksportér ved ændringer",
    "includeSettings": "Inkluder indstillinger",
    "filterVersionsByRegEx": "Filtrer versioner efter regulært udtryk",
    "trySelectingSuggestedVersionCode": "Forsøg at vælge den foreslåede versionKode af APK",
    "dontSortReleasesList": "Behold udgivelsesrækkefølge fra API",
    "reverseSort": "Omvendt sortering",
    "takeFirstLink": "Tag første link",
    "skipSort": "Spring sortering over",
    "debugMenu": "Fejlfindingsmenu",
    "bgTaskStarted": "Baggrundsopgave startet - tjek logfiler.",
    "runBgCheckNow": "Kør baggrundsopdateringstjek nu",
    "versionExtractWholePage": "Anvend RegEx til versionsstrengsudtrækning på hele siden",
    "installing": "Installerer",
    "skipUpdateNotifications": "Spring opdateringsmeddelelser over",
    "updatesAvailableNotifChannel": "Opdateringer tilgængelige",
    "appsUpdatedNotifChannel": "Apps opdateret",
    "appsPossiblyUpdatedNotifChannel": "App-opdateringer forsøgt",
    "errorCheckingUpdatesNotifChannel": "Fejl ved opdateringstjek",
    "appsRemovedNotifChannel": "Apps fjernet",
    "downloadingXNotifChannel": "Henter {}",
    "completeAppInstallationNotifChannel": "Færdiggør app-installation",
    "checkingForUpdatesNotifChannel": "Tjekker for opdateringer",
    "onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installerede og 'Følg Kun'-apps for opdateringer",
    "supportFixedAPKURL": "Understøt fikserede APK-URL'er",
    "selectX": "Vælg {}",
    "parallelDownloads": "Tillad samtidige overførsler",
    "useShizuku": "Brug Shizuku eller Sui til at installere",
    "shizukuBinderNotFound": "Shizuku-tjeneste kører ikke",
    "shizukuOld": "Forældet Shizuku-version (<11). Opdater den",
    "shizukuOldAndroidWithADB": "Shizuku kører på Android <8.1 med ADB. Opdater Android eller brug Sui i stedet",
    "shizukuPretendToBeGooglePlay": "Indstil Google Play som installationskilde (hvis Shizuku bruges)",
    "useSystemFont": "Brug systemskrifttype",
    "useVersionCodeAsOSVersion": "Brug app-versionKode som OS-registreret version",
    "requestHeader": "Anmodningsheader",
    "useLatestAssetDateAsReleaseDate": "Brug seneste ressourceupload som udgivelsesdato",
    "defaultPseudoVersioningMethod": "Standard pseudo-versioneringsmetode",
    "partialAPKHash": "Delvis APK-hash",
    "APKLinkHash": "Hash for APK-link",
    "directAPKLink": "Direkte APK-link",
    "pseudoVersionInUse": "En pseudo-version er i brug",
    "installed": "Installeret",
    "latest": "Seneste",
    "invertRegEx": "Inverter regulært udtryk",
    "note": "Bemærk",
    "selfHostedNote": "Rullemenuen \"{}\" kan bruges til at nå selvhostede/brugerdefinerede instanser af enhver kilde.",
    "badDownload": "APK'en kunne ikke analyseres (inkompatibel eller delvis hentning)",
    "beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængelig)",
    "appVerifierInstructionToast": "Del til AppVerifier, og vend tilbage, når du er klar.",
    "wiki": "Hjælp/Wiki",
    "crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)",
    "crowdsourcedConfigsShort": "Crowdsourcede app-konfigurationer",
    "allowInsecure": "Tillad usikre HTTP-anmodninger",
    "stayOneVersionBehind": "Forbliv én version bagud den seneste",
    "useFirstApkOfVersion": "Vælg automatisk den første af flere APK'er",
    "refreshBeforeDownload": "Opdater app-detaljer før download",
    "tencentAppStore": "Tencent App Store",
    "coolApk": "CoolApk",
    "vivoAppStore": "vivo App Store (CN)",
    "name": "Navn",
    "smartname": "Navn (Smart)",
    "sortMethod": "Sorteringsmetode",
    "welcome": "Velkommen",
    "documentationLinksNote": "Obtainiums GitHub-side, som der linkes til nedenfor, indeholder links til videoer, artikler, diskussioner og andre ressourcer, som kan hjælpe dig med at forstå, hvordan du bruger appen.",
    "batteryOptimizationNote": "Bemærk, at baggrundsdownloads kan fungere mere pålideligt, hvis du deaktiverer OS-batterioptimering for Obtainium.",
    "fileDeletionError": "Kunne ikke slette filen (prøv at slette den manuelt og prøv igen): \"{}\"",
    "foregroundService": "Obtainium forgrundstjeneste",
    "foregroundServiceExplanation": "Brug en forgrundstjeneste til opdateringskontrol (mere pålidelig, bruger mere strøm)",
    "fgServiceNotice": "Denne meddelelse er nødvendig for baggrundsopdateringskontrol (den kan skjules i OS-indstillingerne).",
    "excludeSecrets": "Udeluk hemmeligheder",
    "GHReqPrefix": "'sky22333/hubproxy'-instans til GitHub-anmodninger",
    "includeZips": "Inkluder ZIP-filer",
    "zippedApkFilterRegEx": "Filtrer APK'er inde i ZIP",
    "googleVerificationWarningP1": "Google har annonceret, at fra 2026 / 2027, alle apps på \"certificeret\" Android-enheder vil kræve, at udvikleren til at indsende personlige identitetsoplysninger direkte til Google.\n\nDa udviklerne af denne app ikke accepterer dette krav, Obtainium vil ikke længere arbejde på certificerede Android-enheder efter dette tidspunkt.",
    "googleVerificationWarningP2": "Gå til https: / / keepandroidopen.org / for mere information.",
    "googleVerificationWarningP3": "Bemærk, at på kort sigt, kan det fortsætte med at være muligt at installere \"uverificerbare\" (ikke-overensstemmende) apps gennem en \"avanceret flow\" proces, som Google har lovet at gennemføre efter bred backlash til deres meddelelse, men de har ikke detaljeret, hvordan dette ville arbejde, så det er uklart, om det virkelig vil bevare brugernes friheder i praksis.\n\nUnder alle omstændigheder er Googles bevægelse et væsentligt skridt i retning af afslutningen af fri, generel-formål computing for enkeltpersoner.\n\nIkke-certificerede OS, som GrapheneOS, bør være upåvirket af dette, så længe de har lov til at fortsætte med at eksistere.",
    "multipleSigners": "Flere signere",
    "removeAppQuestion": {
        "one": "Fjern app?",
        "other": "Fjern apps?"
    },
    "tooManyRequestsTryAgainInMinutes": {
        "one": "For mange anmodninger (begrænset hastighed). Prøv igen om {} minut",
        "other": "For mange anmodninger (begrænset hastighed). Prøv igen om {} minutter"
    },
    "bgUpdateGotErrorRetryInMinutes": {
        "one": "Baggrundsopdateringstjek stødte på en {}. Planlægger et nyt tjek om {} minut",
        "other": "Baggrundsopdateringstjek stødte på en {}. Planlægger et nyt tjek om {} minutter"
    },
    "bgCheckFoundUpdatesWillNotifyIfNeeded": {
        "one": "Baggrundsopdateringstjek fandt {} opdatering. Underretter brugeren, hvis nødvendigt",
        "other": "Baggrundsopdateringstjek fandt {} opdateringer. Underretter brugeren, hvis nødvendigt"
    },
    "apps": {
        "one": "{} App",
        "other": "{} Apps"
    },
    "url": {
        "one": "{} URL",
        "other": "{} URL'er"
    },
    "minute": {
        "one": "{} minut",
        "other": "{} minutter"
    },
    "hour": {
        "one": "{} time",
        "other": "{} timer"
    },
    "day": {
        "one": "{} dag",
        "other": "{} dage"
    },
    "clearedNLogsBeforeXAfterY": {
        "one": "Ryddet {n} log (før = {before}, efter = {after})",
        "other": "Ryddede {n} logs (før = {before}, efter = {after})"
    },
    "xAndNMoreUpdatesAvailable": {
        "one": "{} og 1 anden app har opdateringer.",
        "other": "{} og {} andre apps har opdateringer."
    },
    "xAndNMoreUpdatesInstalled": {
        "one": "{} og 1 anden app blev opdateret.",
        "other": "{} og {} andre apps blev opdateret."
    },
    "xAndNMoreUpdatesFailed": {
        "one": "Kunne ikke opdatere {} og 1 anden app.",
        "other": "Kunne ikke opdatere {} og {} andre apps."
    },
    "xAndNMoreUpdatesPossiblyInstalled": {
        "one": "{} og 1 anden app blev muligvis opdateret.",
        "other": "{} og {} andre apps blev muligvis opdateret."
    },
    "apk": {
        "one": "{} APK",
        "other": "{} APK'er"
    },
    "certificateHash": {
        "one": "Certifikathash",
        "other": "Certifikathash"
    }
}


================================================
FILE: assets/translations/de.json
================================================
{
    "invalidURLForSource": "Keine gültige {} App-URL",
    "noReleaseFound": "Keine passende Version gefunden",
    "noVersionFound": "Release-Version nicht ermittelbar",
    "urlMatchesNoSource": "URL stimmt mit keiner bekannten Quelle überein",
    "cantInstallOlderVersion": "Installation einer älteren App-Version nicht möglich",
    "appIdMismatch": "Die heruntergeladene Paket-ID stimmt nicht mit der vorhandenen App-ID überein",
    "functionNotImplemented": "Diese Klasse hat diese Funktion nicht implementiert",
    "placeholder": "Platzhalter",
    "someErrors": "Es traten einige Fehler auf",
    "unexpectedError": "Unerwarteter Fehler",
    "ok": "OK",
    "and": "und",
    "githubPATLabel": "Persönlicher Zugangstoken für GitHub (erhöht das Ratenlimit)",
    "includePrereleases": "Vorabversionen einbeziehen",
    "fallbackToOlderReleases": "Fallback auf ältere Versionen",
    "filterReleaseTitlesByRegEx": "Release-Titel nach regulärem Ausdruck\nfiltern",
    "invalidRegEx": "Ungültiger regulärer Ausdruck",
    "noDescription": "Keine Beschreibung",
    "cancel": "Abbrechen",
    "continue": "Weiter",
    "requiredInBrackets": "(notwendig)",
    "dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN",
    "colour": "Farbe",
    "standard": "Standard",
    "custom": "Benutzerdefiniert",
    "useMaterialYou": "Material You verwenden",
    "githubStarredRepos": "GitHub Starred Repos",
    "uname": "Benutzername",
    "wrongArgNum": "Falsch
Download .txt
gitextract_y1uaf0sy/

├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── fastlane.yml
│       └── release.yml
├── .gitignore
├── .gitmodules
├── .metadata
├── .vscode/
│   └── launch.json
├── LICENSE.md
├── README.md
├── analysis_options.yaml
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle.kts
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── debug/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── res/
│   │       │       └── values/
│   │       │           └── string.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── dev/
│   │       │   │       └── imranr/
│   │       │   │           └── obtainium/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   ├── ic_launcher_foreground.xml
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── mipmap-anydpi-v26/
│   │       │       │   ├── ic_launcher.xml
│   │       │       │   └── ic_launcher_round.xml
│   │       │       ├── raw/
│   │       │       │   └── keep.xml
│   │       │       ├── values/
│   │       │       │   ├── colors.xml
│   │       │       │   ├── string.xml
│   │       │       │   └── styles.xml
│   │       │       ├── values-night/
│   │       │       │   └── styles.xml
│   │       │       └── xml/
│   │       │           ├── file_paths.xml
│   │       │           └── locales_config.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle.kts
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle.kts
├── assets/
│   ├── ca/
│   │   └── lets-encrypt-r3.pem
│   ├── graphics/
│   │   └── obtainium.psd
│   └── translations/
│       ├── ar.json
│       ├── bs.json
│       ├── ca.json
│       ├── cs.json
│       ├── da.json
│       ├── de.json
│       ├── en-EO.json
│       ├── en.json
│       ├── es.json
│       ├── fa.json
│       ├── fr.json
│       ├── gl.json
│       ├── hu.json
│       ├── id.json
│       ├── it.json
│       ├── ja.json
│       ├── ko.json
│       ├── ml.json
│       ├── nl.json
│       ├── package.json
│       ├── pl.json
│       ├── pt-BR.json
│       ├── pt.json
│       ├── ru.json
│       ├── standardize.mjs
│       ├── sv.json
│       ├── tr.json
│       ├── uk.json
│       ├── vi.json
│       ├── zh-Hant-TW.json
│       └── zh.json
├── build.sh
├── docker/
│   ├── Dockerfile
│   ├── builder.sh
│   └── mkbuilder.sh
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── de/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           ├── en-US/
│           │   ├── full_description.txt
│           │   ├── short_description.txt
│           │   └── title.txt
│           └── ru-RU/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── lib/
│   ├── app_sources/
│   │   ├── apkcombo.dart
│   │   ├── apkmirror.dart
│   │   ├── apkpure.dart
│   │   ├── aptoide.dart
│   │   ├── codeberg.dart
│   │   ├── coolapk.dart
│   │   ├── directAPKLink.dart
│   │   ├── farsroid.dart
│   │   ├── fdroid.dart
│   │   ├── fdroidrepo.dart
│   │   ├── github.dart
│   │   ├── gitlab.dart
│   │   ├── html.dart
│   │   ├── huaweiappgallery.dart
│   │   ├── izzyondroid.dart
│   │   ├── jenkins.dart
│   │   ├── liteapks.dart
│   │   ├── mullvad.dart
│   │   ├── neutroncode.dart
│   │   ├── rockmods.dart
│   │   ├── rustore.dart
│   │   ├── sourceforge.dart
│   │   ├── sourcehut.dart
│   │   ├── telegramapp.dart
│   │   ├── tencent.dart
│   │   ├── uptodown.dart
│   │   └── vivoappstore.dart
│   ├── components/
│   │   ├── custom_app_bar.dart
│   │   ├── generated_form.dart
│   │   └── generated_form_modal.dart
│   ├── custom_errors.dart
│   ├── main.dart
│   ├── main_fdroid.dart
│   ├── mass_app_sources/
│   │   └── githubstars.dart
│   ├── pages/
│   │   ├── add_app.dart
│   │   ├── app.dart
│   │   ├── apps.dart
│   │   ├── home.dart
│   │   ├── import_export.dart
│   │   └── settings.dart
│   └── providers/
│       ├── apps_provider.dart
│       ├── logs_provider.dart
│       ├── native_provider.dart
│       ├── notifications_provider.dart
│       ├── settings_provider.dart
│       └── source_provider.dart
├── pubspec.yaml
├── sign.sh
└── test/
    └── widget_test.dart
Download .txt
SYMBOL INDEX (541 symbols across 47 files)

FILE: lib/app_sources/apkcombo.dart
  class APKCombo (line 6) | class APKCombo extends AppSource {
    method sourceSpecificStandardizeURL (line 13) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 26) | Future<String?> tryInferringAppId(
    method getRequestHeaders (line 34) | Future<Map<String, String>?> getRequestHeaders(
    method getApkUrls (line 47) | Future<List<MapEntry<String, String>>> getApkUrls(
    method assetUrlPrefetchModifier (line 86) | Future<String> assetUrlPrefetchModifier(
    method getLatestAPKDetails (line 102) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/apkmirror.dart
  class APKMirror (line 12) | class APKMirror extends AppSource {
    method getRequestHeaders (line 42) | Future<Map<String, String>?> getRequestHeaders(
    method sourceSpecificStandardizeURL (line 54) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method changeLogPageFromStandardUrl (line 67) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetails (line 71) | Future<APKDetails> getLatestAPKDetails(
    method getAppNames (line 134) | AppNames getAppNames(String standardUrl)

FILE: lib/app_sources/apkpure.dart
  function unique (line 10) | List<E> unique([Id Function(E element)? id, bool inplace = true])
  class APKPure (line 18) | class APKPure extends AppSource {
    method sourceSpecificStandardizeURL (line 50) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 72) | Future<String?> tryInferringAppId(
    method getDetailsForVersion (line 79) | Future<APKDetails> getDetailsForVersion(
    method getRequestHeaders (line 142) | Future<Map<String, String>?> getRequestHeaders(
    method getLatestAPKDetails (line 159) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/aptoide.dart
  class Aptoide (line 7) | class Aptoide extends AppSource {
    method sourceSpecificStandardizeURL (line 17) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 30) | Future<String?> tryInferringAppId(
    method getAppDetailsJSON (line 40) | Future<Map<String, dynamic>> getAppDetailsJSON(
    method getLatestAPKDetails (line 66) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/codeberg.dart
  class Codeberg (line 5) | class Codeberg extends AppSource {
    method sourceSpecificStandardizeURL (line 19) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method changeLogPageFromStandardUrl (line 32) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetails (line 36) | Future<APKDetails> getLatestAPKDetails(
    method getAppNames (line 47) | AppNames getAppNames(String standardUrl)
    method search (line 54) | Future<Map<String, List<String>>> search(

FILE: lib/app_sources/coolapk.dart
  class CoolApk (line 10) | class CoolApk extends AppSource {
    method sourceSpecificStandardizeURL (line 20) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 34) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 43) | Future<APKDetails> getLatestAPKDetails(
    method _getLatestApkUrl (line 101) | Future<String> _getLatestApkUrl(
    method getRequestHeaders (line 118) | Future<Map<String, String>?> getRequestHeaders(
    method _getToken (line 144) | Map<String, String> _getToken()
    method randHexString (line 147) | String randHexString(int n)
    method randMacAddress (line 152) | String randMacAddress()

FILE: lib/app_sources/directAPKLink.dart
  class DirectAPKLink (line 7) | class DirectAPKLink extends AppSource {
    method sourceSpecificStandardizeURL (line 41) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getRequestHeaders (line 54) | Future<Map<String, String>?> getRequestHeaders(
    method getLatestAPKDetails (line 67) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/farsroid.dart
  class Farsroid (line 10) | class Farsroid extends AppSource {
    method sourceSpecificStandardizeURL (line 28) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 41) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/fdroid.dart
  class FDroid (line 12) | class FDroid extends AppSource {
    method sourceSpecificStandardizeURL (line 48) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 70) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 78) | Future<APKDetails> getLatestAPKDetails(
    method search (line 150) | Future<Map<String, List<String>>> search(
    method getAPKUrlsFromFDroidPackagesAPIResponse (line 183) | APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(

FILE: lib/app_sources/fdroidrepo.dart
  class FDroidRepo (line 8) | class FDroidRepo extends AppSource {
    method removeQueryParamsFromUrl (line 42) | String removeQueryParamsFromUrl(String url, {List<String> keep = const...
    method sourceSpecificStandardizeURL (line 58) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method search (line 69) | Future<Map<String, List<String>>> search(
    method runOnAddAppInputChange (line 101) | void runOnAddAppInputChange(String userInput)
    method endOfGetAppChanges (line 122) | App endOfGetAppChanges(App app)
    method sourceRequestWithURLVariants (line 145) | Future<Response> sourceRequestWithURLVariants(
    method getLatestAPKDetails (line 169) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/github.dart
  class GitHub (line 15) | class GitHub extends AppSource {
    method tryInferringAppId (line 185) | Future<String?> tryInferringAppId(
    method sourceSpecificStandardizeURL (line 253) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getRequestHeaders (line 266) | Future<Map<String, String>?> getRequestHeaders(
    method getTokenIfAny (line 286) | Future<String?> getTokenIfAny(Map<String, dynamic> additionalSettings)
    method getSourceNote (line 311) | Future<String?> getSourceNote()
    method generalReqPrefetchModifier (line 319) | Future<String> generalReqPrefetchModifier(
    method getAPIHost (line 330) | Future<String> getAPIHost(Map<String, dynamic> additionalSettings)
    method convertStandardUrlToAPIUrl (line 333) | Future<String> convertStandardUrlToAPIUrl(
    method changeLogPageFromStandardUrl (line 340) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetailsCommon (line 343) | Future<APKDetails> getLatestAPKDetailsCommon(
    method findReleaseAssetUrls (line 406) | findReleaseAssetUrls(dynamic release)
    method getPublishDateFromRelease (line 423) | DateTime? getPublishDateFromRelease(dynamic rel)
    method getNewestAssetDateFromRelease (line 429) | DateTime? getNewestAssetDateFromRelease(dynamic rel)
    method getReleaseDateFromRelease (line 447) | DateTime? getReleaseDateFromRelease(dynamic rel, bool useAssetDate)
    method getLatestAPKDetailsCommon2 (line 644) | Future<APKDetails> getLatestAPKDetailsCommon2(
    method getLatestAPKDetails (line 672) | Future<APKDetails> getLatestAPKDetails(
    method getAppNames (line 688) | AppNames getAppNames(String standardUrl)
    method searchCommon (line 694) | Future<Map<String, List<String>>> searchCommon(
    method search (line 738) | Future<Map<String, List<String>>> search(
    method rateLimitErrorCheck (line 765) | void rateLimitErrorCheck(Response res)

FILE: lib/app_sources/gitlab.dart
  class GitLab (line 14) | class GitLab extends AppSource {
    method sourceSpecificStandardizeURL (line 61) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getPATIfAny (line 78) | Future<String?> getPATIfAny(Map<String, dynamic> additionalSettings)
    method search (line 90) | Future<Map<String, List<String>>> search(
    method changeLogPageFromStandardUrl (line 112) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getRequestHeaders (line 116) | Future<Map<String, String>?> getRequestHeaders(
    method assetUrlPrefetchModifier (line 133) | Future<String> assetUrlPrefetchModifier(
    method getLatestAPKDetails (line 144) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/html.dart
  function ensureAbsoluteUrl (line 11) | String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl)
  function compareAlphaNumeric (line 23) | int compareAlphaNumeric(String a, String b)
  function collectAllStringsFromJSONObject (line 55) | List<String> collectAllStringsFromJSONObject(dynamic obj)
  function extractor (line 56) | List<String> extractor(dynamic obj)
  function _splitAlphaNumeric (line 76) | List<String> _splitAlphaNumeric(String s)
  function _isNumeric (line 100) | bool _isNumeric(String s)
  function getLinksInLines (line 104) | List<MapEntry<String, String>> getLinksInLines(String lines)
  function grabLinksCommonFromRes (line 117) | Future<List<MapEntry<String, String>>> grabLinksCommonFromRes(
  function grabLinksCommon (line 128) | Future<List<MapEntry<String, String>>> grabLinksCommon(
  class HTML (line 211) | class HTML extends AppSource {
    method getRequestHeaders (line 344) | Future<Map<String, String>?> getRequestHeaders(
    method sourceSpecificStandardizeURL (line 369) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 374) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/huaweiappgallery.dart
  class HuaweiAppGallery (line 6) | class HuaweiAppGallery extends AppSource {
    method sourceSpecificStandardizeURL (line 15) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getDlUrl (line 27) | String getDlUrl(String standardUrl)
    method requestAppdlRedirect (line 30) | Future<Response> requestAppdlRedirect(
    method appIdFromRedirectDlUrl (line 48) | String appIdFromRedirectDlUrl(String redirectDlUrl)
    method tryInferringAppId (line 62) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 74) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/izzyondroid.dart
  class IzzyOnDroid (line 5) | class IzzyOnDroid extends AppSource {
    method sourceSpecificStandardizeURL (line 17) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 37) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 45) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/jenkins.dart
  class Jenkins (line 7) | class Jenkins extends AppSource {
    method trimJobUrl (line 14) | String trimJobUrl(String url)
    method changeLogPageFromStandardUrl (line 24) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetails (line 28) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/liteapks.dart
  class LiteAPKs (line 7) | class LiteAPKs extends AppSource {
    method sourceSpecificStandardizeURL (line 14) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getRequestHeaders (line 27) | Future<Map<String, String>?> getRequestHeaders(
    method assetUrlPrefetchModifier (line 36) | Future<String> assetUrlPrefetchModifier(
    method getLatestAPKDetails (line 59) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/mullvad.dart
  class Mullvad (line 7) | class Mullvad extends AppSource {
    method sourceSpecificStandardizeURL (line 13) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method changeLogPageFromStandardUrl (line 26) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetails (line 30) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/neutroncode.dart
  class NeutronCode (line 6) | class NeutronCode extends AppSource {
    method sourceSpecificStandardizeURL (line 13) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method changeLogPageFromStandardUrl (line 26) | String? changeLogPageFromStandardUrl(String standardUrl)
    method monthNameToNumberString (line 28) | String monthNameToNumberString(String s)
    method customDateParse (line 59) | String? customDateParse(String dateString)
    method getLatestAPKDetails (line 81) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/rockmods.dart
  class RockMods (line 6) | class RockMods extends AppSource {
    method sourceSpecificStandardizeURL (line 13) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 26) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/rustore.dart
  class RuStore (line 10) | class RuStore extends AppSource {
    method sourceSpecificStandardizeURL (line 19) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 32) | Future<String?> tryInferringAppId(
    method decodeJsonBody (line 39) | Future<dynamic> decodeJsonBody(Uint8List bytes)
    method getLatestAPKDetails (line 52) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/sourceforge.dart
  class SourceForge (line 6) | class SourceForge extends AppSource {
    method sourceSpecificStandardizeURL (line 12) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 43) | Future<APKDetails> getLatestAPKDetails(
    method getVersion (line 63) | getVersion(String url)

FILE: lib/app_sources/sourcehut.dart
  class SourceHut (line 9) | class SourceHut extends AppSource {
    method sourceSpecificStandardizeURL (line 26) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method changeLogPageFromStandardUrl (line 39) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getLatestAPKDetails (line 42) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/telegramapp.dart
  class TelegramApp (line 7) | class TelegramApp extends AppSource {
    method sourceSpecificStandardizeURL (line 14) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 19) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/tencent.dart
  class Tencent (line 7) | class Tencent extends AppSource {
    method sourceSpecificStandardizeURL (line 16) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 29) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 37) | Future<APKDetails> getLatestAPKDetails(

FILE: lib/app_sources/uptodown.dart
  function parseDateTimeMMMddCommayyyy (line 6) | DateTime? parseDateTimeMMMddCommayyyy(String? dateString)
  class Uptodown (line 21) | class Uptodown extends AppSource {
    method sourceSpecificStandardizeURL (line 31) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 44) | Future<String?> tryInferringAppId(
    method getAppDetailsFromPage (line 54) | Future<Map<String, String?>> getAppDetailsFromPage(
    method getLatestAPKDetails (line 91) | Future<APKDetails> getLatestAPKDetails(
    method assetUrlPrefetchModifier (line 129) | Future<String> assetUrlPrefetchModifier(

FILE: lib/app_sources/vivoappstore.dart
  class VivoAppStore (line 7) | class VivoAppStore extends AppSource {
    method sourceSpecificStandardizeURL (line 20) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method tryInferringAppId (line 26) | Future<String?> tryInferringAppId(
    method getLatestAPKDetails (line 35) | Future<APKDetails> getLatestAPKDetails(
    method search (line 57) | Future<Map<String, List<String>>> search(
    method getDetailJson (line 85) | Future<Map<String, dynamic>> getDetailJson(
    method parseVivoAppId (line 104) | String parseVivoAppId(String url)

FILE: lib/components/custom_app_bar.dart
  class CustomAppBar (line 3) | class CustomAppBar extends StatefulWidget {
    method createState (line 9) | State<CustomAppBar> createState()
  class _CustomAppBarState (line 12) | class _CustomAppBarState extends State<CustomAppBar> {
    method build (line 14) | Widget build(BuildContext context)

FILE: lib/components/generated_form.dart
  class GeneratedFormItem (line 10) | abstract class GeneratedFormItem {
    method ensureType (line 16) | dynamic ensureType(dynamic val)
    method clone (line 17) | GeneratedFormItem clone()
  class GeneratedFormTextField (line 28) | class GeneratedFormTextField extends GeneratedFormItem {
    method ensureType (line 51) | String ensureType(val)
    method clone (line 56) | GeneratedFormTextField clone()
  class GeneratedFormDropdown (line 72) | class GeneratedFormDropdown extends GeneratedFormItem {
    method ensureType (line 87) | String ensureType(val)
    method clone (line 92) | GeneratedFormDropdown clone()
  class GeneratedFormSwitch (line 107) | class GeneratedFormSwitch extends GeneratedFormItem {
    method ensureType (line 120) | bool ensureType(val)
    method clone (line 125) | GeneratedFormSwitch clone()
  class GeneratedFormTagInput (line 137) | class GeneratedFormTagInput extends GeneratedFormItem {
    method ensureType (line 159) | Map<String, MapEntry<int, bool>> ensureType(val)
    method clone (line 164) | GeneratedFormTagInput clone()
  type OnValueChanges (line 180) | typedef OnValueChanges =
  class GeneratedForm (line 183) | class GeneratedForm extends StatefulWidget {
    method createState (line 194) | State<GeneratedForm> createState()
  function cloneFormItems (line 197) | List<List<GeneratedFormItem>> cloneFormItems(
  class GeneratedFormSubForm (line 211) | class GeneratedFormSubForm extends GeneratedFormItem {
    method clone (line 228) | GeneratedFormSubForm clone()
  function generateRandomLightColor (line 241) | Color generateRandomLightColor()
  function generateRandomNumber (line 256) | int generateRandomNumber(
  function validateTextField (line 268) | bool validateTextField(TextFormField tf)
  class _GeneratedFormState (line 271) | class _GeneratedFormState extends State<GeneratedForm> {
    method someValueChanged (line 280) | void someValueChanged({bool isBuilding = false, bool forceInvalid = fa...
    method initForm (line 296) | void initForm()
    method initState (line 414) | void initState()
    method build (line 420) | Widget build(BuildContext context)
    method onAddPressed (line 447) | onAddPressed()
    method fn (line 625) | fn()

FILE: lib/components/generated_form_modal.dart
  class GeneratedFormModal (line 6) | class GeneratedFormModal extends StatefulWidget {
    method createState (line 27) | State<GeneratedFormModal> createState()
  class _GeneratedFormModalState (line 30) | class _GeneratedFormModalState extends State<GeneratedFormModal> {
    method initState (line 35) | void initState()
    method build (line 41) | Widget build(BuildContext context)

FILE: lib/custom_errors.dart
  class ObtainiumError (line 11) | class ObtainiumError {
    method toString (line 16) | String toString()
  class RateLimitError (line 21) | class RateLimitError extends ObtainiumError {
  class InvalidURLError (line 27) | class InvalidURLError extends ObtainiumError {
  class CredsNeededError (line 32) | class CredsNeededError extends ObtainiumError {
  class NoReleasesError (line 37) | class NoReleasesError extends ObtainiumError {
  class NoAPKError (line 44) | class NoAPKError extends ObtainiumError {
  class NoVersionError (line 48) | class NoVersionError extends ObtainiumError {
  class UnsupportedURLError (line 52) | class UnsupportedURLError extends ObtainiumError {
  class DowngradeError (line 56) | class DowngradeError extends ObtainiumError {
  class InstallError (line 63) | class InstallError extends ObtainiumError {
  class IDChangedError (line 68) | class IDChangedError extends ObtainiumError {
  class NotImplementedError (line 72) | class NotImplementedError extends ObtainiumError {
  class MultiAppMultiError (line 76) | class MultiAppMultiError extends ObtainiumError {
    method add (line 83) | void add(String appId, dynamic error, {String? appName})
    method errorString (line 98) | String errorString(String appId, {bool includeIdsWithNames = false})
    method errorsAppsString (line 101) | String errorsAppsString(
    method toString (line 109) | String toString()
  function showMessage (line 114) | void showMessage(dynamic e, BuildContext context, {bool isError = false})
  function showError (line 157) | void showError(dynamic e, BuildContext context)
  function list2FriendlyString (line 161) | String list2FriendlyString(List<String> list)

FILE: lib/main.dart
  function loadTranslations (line 63) | Future<void> loadTranslations()
  function backgroundFetchHeadlessTask (line 91) | void backgroundFetchHeadlessTask(HeadlessTask task)
  function startCallback (line 104) | void startCallback()
  class MyTaskHandler (line 108) | class MyTaskHandler extends TaskHandler {
    method onStart (line 112) | Future<void> onStart(DateTime timestamp, TaskStarter starter)
    method onRepeatEvent (line 118) | void onRepeatEvent(DateTime timestamp)
    method onDestroy (line 123) | Future<void> onDestroy(DateTime timestamp, bool isTimeout)
    method onReceiveData (line 128) | void onReceiveData(Object data)
  function main (line 131) | void main()
  class Obtainium (line 173) | class Obtainium extends StatefulWidget {
    method createState (line 177) | State<Obtainium> createState()
  class _ObtainiumState (line 180) | class _ObtainiumState extends State<Obtainium> {
    method initState (line 184) | void initState()
    method requestNonOptionalPermissions (line 192) | Future<void> requestNonOptionalPermissions()
    method initForegroundService (line 203) | void initForegroundService()
    method startForegroundService (line 228) | Future<ServiceRequestResult?> startForegroundService(bool restart)
    method dispose (line 260) | void dispose()
    method initPlatformState (line 266) | Future<void> initPlatformState()
    method build (line 292) | Widget build(BuildContext context)

FILE: lib/main_fdroid.dart
  function main (line 3) | void main()

FILE: lib/mass_app_sources/githubstars.dart
  class GitHubStars (line 9) | class GitHubStars implements MassAppUrlSource {
    method getOnePageOfUserStarredUrlsWithDescriptions (line 16) | Future<Map<String, List<String>>> getOnePageOfUserStarredUrlsWithDescr...
    method getUrlsWithDescriptions (line 47) | Future<Map<String, List<String>>> getUrlsWithDescriptions(

FILE: lib/pages/add_app.dart
  class AddAppPage (line 19) | class AddAppPage extends StatefulWidget {
    method createState (line 23) | State<AddAppPage> createState()
  class AddAppPageState (line 26) | class AddAppPageState extends State<AddAppPage> {
    method linkFn (line 42) | void linkFn(String input)
    method changeUserInput (line 54) | void changeUserInput(
    method build (line 102) | Widget build(BuildContext context)
    method getTrackOnlyConfirmationIfNeeded (line 110) | Future<bool> getTrackOnlyConfirmationIfNeeded(
    method getReleaseDateAsVersionConfirmationIfNeeded (line 146) | getReleaseDateAsVersionConfirmationIfNeeded(
    method addApp (line 164) | addApp({bool resetUserInputAfter = false})
    method getUrlInputRow (line 242) | Widget getUrlInputRow()
    method runSearch (line 301) | runSearch({bool filtered = true})
    method getHTMLSourceOverrideDropdown (line 454) | Widget getHTMLSourceOverrideDropdown()
    method fn (line 484) | fn()
    method shouldShowSearchBar (line 509) | bool shouldShowSearchBar()
    method getSearchBarRow (line 514) | Widget getSearchBarRow()
    method getAdditionalOptsCol (line 550) | Widget getAdditionalOptsCol()
    method getSourcesListWidget (line 651) | Widget getSourcesListWidget()

FILE: lib/pages/app.dart
  class AppPage (line 18) | class AppPage extends StatefulWidget {
    method createState (line 29) | State<AppPage> createState()
  class _AppPageState (line 32) | class _AppPageState extends State<AppPage> {
    method initState (line 39) | void initState()
    method build (line 65) | Widget build(BuildContext context)
    method getUpdate (line 73) | getUpdate(String id, {bool resetVersion = false})
    method getInfoColumn (line 129) | getInfoColumn()
    method getFullInfoColumn (line 362) | getFullInfoColumn({bool small = false})
    method getAppWebView (line 463) | getAppWebView()
    method showMarkUpdatedDialog (line 471) | showMarkUpdatedDialog()
    method showAdditionalOptionsDialog (line 502) | showAdditionalOptionsDialog()
    method handleAdditionalOptionChanges (line 526) | handleAdditionalOptionChanges(Map<String, dynamic>? values)
    method getInstallOrUpdateButton (line 567) | getInstallOrUpdateButton()
    method getBottomSheetMenu (line 607) | getBottomSheetMenu()
    method appScreenAppBar (line 728) | appScreenAppBar()

FILE: lib/pages/apps.dart
  class AppsPage (line 22) | class AppsPage extends StatefulWidget {
    method createState (line 26) | State<AppsPage> createState()
  function showChangeLogDialog (line 29) | void showChangeLogDialog(
  function getChangeLogFn (line 103) | Null Function()? getChangeLogFn(BuildContext context, App app)
  class AppsPageState (line 131) | class AppsPageState extends State<AppsPage> {
    method clearSelected (line 141) | bool clearSelected()
    method selectThese (line 151) | void selectThese(List<App> apps)
    method build (line 169) | Widget build(BuildContext context)
    method refresh (line 174) | refresh()
    method toggleAppSelected (line 203) | toggleAppSelected(App app)
    method getListedCategories (line 375) | List<String?> getListedCategories()
    method getLoadingWidgets (line 400) | getLoadingWidgets()
    method getUpdateButton (line 439) | getUpdateButton(int appIndex)
    method getAppIcon (line 467) | getAppIcon(int appIndex)
    method getVersionText (line 523) | getVersionText(int appIndex)
    method getChangesButtonString (line 527) | getChangesButtonString(int appIndex, bool hasChangeLogFn)
    method getSingleAppHorizTile (line 537) | getSingleAppHorizTile(int index)
    method getCategoryCollapsibleTile (line 713) | getCategoryCollapsibleTile(int index)
    method capFirstChar (line 726) | capFirstChar(String str)
    method getSelectAllButton (line 739) | getSelectAllButton()
    method getMassObtainFunction (line 769) | getMassObtainFunction()
    method launchCategorizeDialog (line 881) | launchCategorizeDialog()
    method showMassMarkDialog (line 947) | showMassMarkDialog()
    method pinSelectedApps (line 999) | pinSelectedApps()
    method showMoreOptionsDialog (line 1010) | showMoreOptionsDialog()
    method getMainBottomButtons (line 1141) | getMainBottomButtons()
    method showFilterDialog (line 1179) | showFilterDialog()
    method getFilterButtonsRow (line 1257) | getFilterButtonsRow()
    method getDisplayedList (line 1291) | getDisplayedList()
    method openAppById (line 1338) | void openAppById(String appId)
  class AppsFilter (line 1357) | class AppsFilter {
    method toFormValuesMap (line 1376) | Map<String, dynamic> toFormValuesMap()
    method setFormValuesFromMap (line 1387) | void setFormValuesFromMap(Map<String, dynamic> values)
    method isIdenticalTo (line 1396) | bool isIdenticalTo(AppsFilter other, SettingsProvider settingsProvider)

FILE: lib/pages/home.dart
  class HomePage (line 20) | class HomePage extends StatefulWidget {
    method createState (line 24) | State<HomePage> createState()
  class NavigationPageItem (line 27) | class NavigationPageItem {
  class _HomePageState (line 35) | class _HomePageState extends State<HomePage> {
    method initState (line 64) | void initState()
    method initDeepLinks (line 156) | Future<void> initDeepLinks()
    method goToAddApp (line 159) | goToAddApp(String data)
    method goToExistingApp (line 170) | goToExistingApp(String appId)
    method interpretLink (line 183) | interpretLink(Uri uri)
    method setIsReversing (line 279) | void setIsReversing(int targetIndex)
    method switchToPage (line 288) | Future<void> switchToPage(int index)
    method build (line 313) | Widget build(BuildContext context)
    method dispose (line 397) | void dispose()

FILE: lib/pages/import_export.dart
  class ImportExportPage (line 19) | class ImportExportPage extends StatefulWidget {
    method createState (line 23) | State<ImportExportPage> createState()
  class _ImportExportPageState (line 26) | class _ImportExportPageState extends State<ImportExportPage> {
    method build (line 30) | Widget build(BuildContext context)
    method urlListImport (line 46) | urlListImport({String? initValue, bool overrideInitValid = false})
    method runObtainiumExport (line 121) | runObtainiumExport({bool pickOnly = false})
    method runObtainiumImport (line 139) | runObtainiumImport()
    method runUrlImport (line 183) | runUrlImport()
    method runSourceSearch (line 207) | runSourceSearch(AppSource source)
    method runMassSourceImport (line 309) | runMassSourceImport(MassAppUrlSource source)
  class ImportErrorDialog (line 604) | class ImportErrorDialog extends StatefulWidget {
    method createState (line 615) | State<ImportErrorDialog> createState()
  class _ImportErrorDialogState (line 618) | class _ImportErrorDialogState extends State<ImportErrorDialog> {
    method build (line 620) | Widget build(BuildContext context)
  class SelectionModal (line 667) | class SelectionModal extends StatefulWidget {
    method createState (line 686) | State<SelectionModal> createState()
  class _SelectionModalState (line 689) | class _SelectionModalState extends State<SelectionModal> {
    method initState (line 693) | void initState()
    method selectOnlyOne (line 709) | void selectOnlyOne(String url)
    method selectAll (line 715) | void selectAll({bool deselect = false})
    method build (line 722) | Widget build(BuildContext context)
    method getSelectAllButton (line 742) | getSelectAllButton()
    method selectThis (line 799) | selectThis(bool? value)

FILE: lib/pages/settings.dart
  class SettingsPage (line 21) | class SettingsPage extends StatefulWidget {
    method createState (line 25) | State<SettingsPage> createState()
  class _SettingsPageState (line 28) | class _SettingsPageState extends State<SettingsPage> {
    method initUpdateIntervalInterpolator (line 52) | void initUpdateIntervalInterpolator()
    method processIntervalSliderValue (line 62) | void processIntervalSliderValue(double val)
    method build (line 99) | Widget build(BuildContext context)
    method colorPickerDialog (line 118) | Future<bool> colorPickerDialog()
  class LogsDialog (line 1012) | class LogsDialog extends StatefulWidget {
    method createState (line 1016) | State<LogsDialog> createState()
  class _LogsDialogState (line 1019) | class _LogsDialogState extends State<LogsDialog> {
    method build (line 1024) | Widget build(BuildContext context)
    method filterLogs (line 1026) | void filterLogs(int days)
  class CategoryEditorSelector (line 1103) | class CategoryEditorSelector extends StatefulWidget {
    method createState (line 1119) | State<CategoryEditorSelector> createState()
  class _CategoryEditorSelectorState (line 1122) | class _CategoryEditorSelectorState extends State<CategoryEditorSelector> {
    method build (line 1126) | Widget build(BuildContext context)

FILE: lib/providers/apps_provider.dart
  class AppInMemory (line 47) | class AppInMemory {
    method deepCopy (line 54) | AppInMemory deepCopy()
  class DownloadedApk (line 80) | class DownloadedApk {
  type DownloadedDirType (line 86) | enum DownloadedDirType { XAPK, ZIP }
  class DownloadedDir (line 88) | class DownloadedDir {
  function generateStandardVersionRegExStrings (line 96) | List<String> generateStandardVersionRegExStrings()
  function findStandardFormatsForVersion (line 126) | Set<String> findStandardFormatsForVersion(String version, bool strict)
  function moveStrToEnd (line 139) | List<String> moveStrToEnd(List<String> arr, String str, {String? strB})
  function moveStrToEndMapEntryWithCount (line 154) | List<MapEntry<String, int>> moveStrToEndMapEntryWithCount(
  function downloadFileWithRetry (line 176) | Future<File> downloadFileWithRetry(
  function hashListOfLists (line 221) | String hashListOfLists(List<List<int>> data)
  function checkPartialDownloadHashDynamic (line 228) | Future<String> checkPartialDownloadHashDynamic(
  function checkPartialDownloadHash (line 257) | Future<String> checkPartialDownloadHash(
  function checkETagHeader (line 277) | Future<String?> checkETagHeader(
  function deleteFile (line 296) | void deleteFile(File file)
  function downloadFile (line 306) | Future<File> downloadFile(
  function getAllInstalledInfo (line 502) | Future<List<PackageInfo>> getAllInstalledInfo()
  function getInstalledInfo (line 506) | Future<PackageInfo?> getInstalledInfo(
  function getAppStorageDir (line 525) | Future<Directory> getAppStorageDir()
  class AppsProvider (line 529) | class AppsProvider with ChangeNotifier {
    method getAppValues (line 544) | Iterable<AppInMemory> getAppValues()
    method handleAPKIDChange (line 590) | Future<File> handleAPKIDChange(
    method downloadApp (line 620) | Future<Object> downloadApp(
    method areDownloadsRunning (line 792) | bool areDownloadsRunning()
    method canInstallSilently (line 796) | Future<bool> canInstallSilently(App app)
    method waitForUserToReturnToForeground (line 856) | Future<void> waitForUserToReturnToForeground(BuildContext context)
    method canDowngradeApps (line 869) | Future<bool> canDowngradeApps()
    method unzipFile (line 872) | Future<void> unzipFile(String filePath, String destinationPath)
    method installApkDir (line 879) | Future<bool> installApkDir(
    method installApk (line 941) | Future<bool> installApk(
    method getStorageRootPath (line 1029) | Future<String> getStorageRootPath()
    method moveObbFile (line 1033) | Future<void> moveObbFile(File file, String appId)
    method uninstallApp (line 1048) | void uninstallApp(String appId)
    method confirmAppFileUrl (line 1058) | Future<MapEntry<String, String>?> confirmAppFileUrl(
    method getHost (line 1091) | getHost(String url)
    method downloadAndInstallLatestApps (line 1129) | Future<List<String>> downloadAndInstallLatestApps(
    method installFn (line 1198) | Future<void> installFn(
    method downloadFn (line 1277) | Future<Map<Object?, Object?>> downloadFn(
    method downloadAppAssets (line 1364) | Future<List<String>> downloadAppAssets(
    method downloadFn (line 1427) | Future<void> downloadFn(MapEntry<String, String> fileUrl, App app)
    method getAppsDir (line 1478) | Future<Directory> getAppsDir()
    method isVersionDetectionPossible (line 1488) | bool isVersionDetectionPossible(AppInMemory? app)
    method getCorrectedInstallStatusAppIfPossible (line 1525) | App? getCorrectedInstallStatusAppIfPossible(
    method reconcileVersionDifferences (line 1600) | MapEntry<bool, String>? reconcileVersionDifferences(
    method doStringsMatchUnderRegEx (line 1640) | bool doStringsMatchUnderRegEx(String pattern, String value1, String va...
    method loadApps (line 1650) | Future<void> loadApps({String? singleId})
    method updateAppIcon (line 1757) | Future<void> updateAppIcon(String? appId, {bool ignoreCache = false})
    method saveApps (line 1788) | Future<void> saveApps(
    method removeApps (line 1829) | Future<void> removeApps(List<String> appIds)
    method removeAppsWithModal (line 1855) | Future<bool> removeAppsWithModal(BuildContext context, List<App> apps)
    method openAppSettings (line 1910) | Future<void> openAppSettings(String appId)
    method addMissingCategories (line 1918) | void addMissingCategories(SettingsProvider settingsProvider)
    method checkUpdate (line 1930) | Future<App?> checkUpdate(String appId)
    method getAppsSortedByUpdateCheckTime (line 1949) | List<String> getAppsSortedByUpdateCheckTime({
    method checkUpdates (line 1982) | Future<List<App>> checkUpdates({
    method findExistingUpdates (line 2033) | List<String> findExistingUpdates({
    method generateExportJSON (line 2054) | Map<String, dynamic> generateExportJSON({
    method export (line 2088) | Future<String?> export({
    method import (line 2140) | Future<MapEntry<List<App>, bool>> import(String appsJSON)
    method dispose (line 2185) | void dispose()
    method addAppsByURL (line 2190) | Future<List<List<String>>> addAppsByURL(
  class AppFilePicker (line 2215) | class AppFilePicker extends StatefulWidget {
    method createState (line 2230) | State<AppFilePicker> createState()
  class _AppFilePickerState (line 2233) | class _AppFilePickerState extends State<AppFilePicker> {
    method build (line 2237) | Widget build(BuildContext context)
  class APKOriginWarningDialog (line 2302) | class APKOriginWarningDialog extends StatefulWidget {
    method createState (line 2313) | State<APKOriginWarningDialog> createState()
  class _APKOriginWarningDialogState (line 2316) | class _APKOriginWarningDialogState extends State<APKOriginWarningDialog> {
    method build (line 2318) | Widget build(BuildContext context)
  function bgUpdateCheck (line 2365) | Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params)

FILE: lib/providers/logs_provider.dart
  type LogLevels (line 12) | enum LogLevels { debug, info, warning, error }
  class Log (line 14) | class Log {
    method toMap (line 20) | Map<String, Object?> toMap()
    method toString (line 42) | String toString()
  class LogsProvider (line 47) | class LogsProvider {
    method getDB (line 54) | Future<Database> getDB()
    method add (line 71) | Future<Log> add(String message, {LogLevels level = LogLevels.info})
    method get (line 80) | Future<List<Log>> get({DateTime? before, DateTime? after})
    method clear (line 89) | Future<int> clear({DateTime? before, DateTime? after})
  function getWhereDates (line 110) | MapEntry<String?, List<int>?> getWhereDates({

FILE: lib/providers/native_provider.dart
  class NativeFeatures (line 6) | class NativeFeatures {
    method _readFileBytes (line 9) | Future<ByteData> _readFileBytes(String path)
    method loadSystemFont (line 14) | Future loadSystemFont()

FILE: lib/providers/notifications_provider.dart
  class ObtainiumNotification (line 11) | class ObtainiumNotification {
  class UpdateNotification (line 37) | class UpdateNotification extends ObtainiumNotification {
  class SilentUpdateNotification (line 60) | class SilentUpdateNotification extends ObtainiumNotification {
  class SilentUpdateAttemptNotification (line 84) | class SilentUpdateAttemptNotification extends ObtainiumNotification {
  class ErrorCheckingUpdatesNotification (line 108) | class ErrorCheckingUpdatesNotification extends ObtainiumNotification {
  class AppsRemovedNotification (line 122) | class AppsRemovedNotification extends ObtainiumNotification {
  class DownloadNotification (line 141) | class DownloadNotification extends ObtainiumNotification {
  class DownloadedNotification (line 156) | class DownloadedNotification extends ObtainiumNotification {
  class CheckingUpdatesNotification (line 179) | class CheckingUpdatesNotification extends ObtainiumNotification {
  class NotificationsProvider (line 192) | class NotificationsProvider {
    method initialize (line 208) | Future<void> initialize()
    method checkLaunchByNotif (line 221) | Future<void> checkLaunchByNotif()
    method _showNotificationPayload (line 232) | void _showNotificationPayload(String? payload, {bool doublePop = false})
    method cancel (line 258) | Future<void> cancel(int id)
    method notifyRaw (line 265) | Future<void> notifyRaw(
    method notify (line 307) | Future<void> notify(

FILE: lib/providers/settings_provider.dart
  type ThemeSettings (line 21) | enum ThemeSettings { system, light, dark }
  type SortColumnSettings (line 23) | enum SortColumnSettings { added, nameAuthor, authorName, releaseDate }
  type SortOrderSettings (line 25) | enum SortOrderSettings { ascending, descending }
  class SettingsProvider (line 27) | class SettingsProvider with ChangeNotifier {
    method initializeSettings (line 35) | Future<void> initializeSettings()
    method checkAndFlipFirstRun (line 144) | bool checkAndFlipFirstRun()
    method checkJustStarted (line 173) | bool checkJustStarted()
    method getInstallPermission (line 181) | Future<bool> getInstallPermission({bool enforce = false})
    method getSettingString (line 253) | String? getSettingString(String settingId)
    method setSettingString (line 258) | void setSettingString(String settingId, String value)
    method getSettingBool (line 263) | bool? getSettingBool(String settingId)
    method setSettingBool (line 267) | void setSettingBool(String settingId, bool value)
    method setCategories (line 275) | void setCategories(Map<String, int> cats, {AppsProvider? appsProvider})
    method setEqual (line 317) | bool setEqual(Set<String> a, Set<String> b)
    method resetLocaleSafe (line 320) | void resetLocaleSafe(BuildContext context)
    method getExportDir (line 422) | Future<Uri?> getExportDir()
    method pickExportDir (line 438) | Future<void> pickExportDir({bool remove = false})

FILE: lib/providers/source_provider.dart
  class AppNames (line 44) | class AppNames {
  class APKDetails (line 51) | class APKDetails {
  function stringMapListTo2DList (line 69) | List<List<String>> stringMapListTo2DList(
  function assumed2DlistToStringMapList (line 73) | List<MapEntry<String, String>> assumed2DlistToStringMapList(
  function appJSONCompatibilityModifiers (line 79) | Map<String, dynamic> appJSONCompatibilityModifiers(Map<String, dynamic> ...
  class App (line 312) | class App {
    method toString (line 351) | String toString()
    method deepCopy (line 373) | App deepCopy()
    method toJson (line 440) | Map<String, dynamic> toJson()
  function preStandardizeUrl (line 462) | String preStandardizeUrl(String url)
  function getLinksFromParsedHTML (line 489) | List<String> getLinksFromParsedHTML(
  function getDefaultValuesFromFormItems (line 502) | Map<String, dynamic> getDefaultValuesFromFormItems(
  function getApkUrlsFromUrls (line 512) | List<MapEntry<String, String>> getApkUrlsFromUrls(List<String> urls)
  function filterApksByArch (line 519) | Future<List<MapEntry<String, String>>> filterApksByArch(
  function getSourceRegex (line 537) | String getSourceRegex(List<String> hosts)
  function createHttpClient (line 541) | HttpClient createHttpClient(bool insecure)
  function sourceRequestStreamResponse (line 550) | Future<MapEntry<Uri, MapEntry<HttpClient, HttpClientResponse>>>
  function httpClientResponseStreamToFinalResponse (line 598) | Future<Response> httpClientResponseStreamToFinalResponse(
  class AppSource (line 624) | abstract class AppSource {
    method overrideAdditionalAppSpecificSourceAgnosticSettingSwitch (line 646) | void overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(
    method standardizeUrl (line 666) | String standardizeUrl(String url)
    method getRequestHeaders (line 674) | Future<Map<String, String>?> getRequestHeaders(
    method endOfGetAppChanges (line 682) | App endOfGetAppChanges(App app)
    method sourceRequest (line 686) | Future<Response> sourceRequest(
    method runOnAddAppInputChange (line 725) | void runOnAddAppInputChange(String inputUrl)
    method sourceSpecificStandardizeURL (line 729) | String sourceSpecificStandardizeURL(String url, {bool forSelection = f...
    method getLatestAPKDetails (line 733) | Future<APKDetails> getLatestAPKDetails(
    method getSourceConfigValues (line 933) | Future<Map<String, String>> getSourceConfigValues(
    method changeLogPageFromStandardUrl (line 950) | String? changeLogPageFromStandardUrl(String standardUrl)
    method getSourceNote (line 954) | Future<String?> getSourceNote()
    method assetUrlPrefetchModifier (line 958) | Future<String> assetUrlPrefetchModifier(
    method generalReqPrefetchModifier (line 966) | Future<String> generalReqPrefetchModifier(
    method search (line 976) | Future<Map<String, List<String>>> search(
    method tryInferringAppId (line 983) | Future<String?> tryInferringAppId(
  function getObtainiumHttpError (line 991) | ObtainiumError getObtainiumHttpError(Response res)
  class MassAppUrlSource (line 1001) | abstract class MassAppUrlSource {
    method getUrlsWithDescriptions (line 1004) | Future<Map<String, List<String>>> getUrlsWithDescriptions(List<String>...
  function regExValidator (line 1007) | String? regExValidator(String? value)
  function intValidator (line 1019) | String? intValidator(String? value, {bool positive = false})
  function isTempId (line 1033) | bool isTempId(App app)
  function replaceMatchGroupsInString (line 1038) | String? replaceMatchGroupsInString(RegExpMatch match, String matchGroupS...
  function extractVersion (line 1067) | String? extractVersion(
  function filterApks (line 1092) | List<MapEntry<String, String>> filterApks(
  function isEnglish (line 1107) | bool isEnglish()
  function lowerCaseIfEnglish (line 1108) | String lowerCaseIfEnglish(String str)
  function isVersionPseudo (line 1110) | bool isVersionPseudo(App app)
  class SourceProvider (line 1115) | class SourceProvider {
    method getSource (line 1147) | AppSource getSource(String url, {String? overrideSource})
    method ifRequiredAppSpecificSettingsExist (line 1198) | bool ifRequiredAppSpecificSettingsExist(AppSource source)
    method generateTempID (line 1209) | String generateTempID(
    method getApp (line 1214) | Future<App> getApp(
    method getAppsByURLNaive (line 1306) | Future<List<dynamic>> getAppsByURLNaive(

FILE: test/widget_test.dart
  function main (line 13) | void main()
Condensed preview — 131 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,412K chars).
[
  {
    "path": ".dockerignore",
    "chars": 137,
    "preview": "LICENSE.md\nREADME.md\nanalysis_options.yaml\nandroid\nassets\nbuild\nbuild.sh\ndata\ndocker\nfastlane\nlib\npubspec.lock\npubspec.y"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1096,
    "preview": "---\nname: Bug report\nabout: Something isn't working right.\ntitle: ''\nlabels: bug, to check\nassignees: ''\n\n---\n\n**Prerequ"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 1405,
    "preview": "---\nname: Feature request\nabout: Suggest a new Source, setting, or other feature.\ntitle: ''\nlabels: enhancement, to chec"
  },
  {
    "path": ".github/workflows/fastlane.yml",
    "chars": 335,
    "preview": "name: Validate Fastlane metadata\n\non:\n  workflow_dispatch:\n  push:\n      branches: [ \"main\" ]\n  pull_request:\n      bran"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2474,
    "preview": "name: Build and Release\n\non:\n  workflow_dispatch:\n    inputs:\n      beta:\n        type: boolean\n        description: Is "
  },
  {
    "path": ".gitignore",
    "chars": 845,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.build/\n.buildlog/\n.history\n.svn/\n.swiftpm/\nmigrate_working_d"
  },
  {
    "path": ".gitmodules",
    "chars": 83,
    "preview": "[submodule \".flutter\"]\n\tpath = .flutter\n\turl = https://github.com/flutter/flutter/\n"
  },
  {
    "path": ".metadata",
    "chars": 1706,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1144,
    "preview": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n"
  },
  {
    "path": "LICENSE.md",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 4898,
    "preview": "<div align=\"center\"><a href=\"https://github.com/Safouene1/support-palestine-banner/blob/master/Markdown-pages/Support.md"
  },
  {
    "path": "analysis_options.yaml",
    "chars": 1420,
    "preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
  },
  {
    "path": "android/.gitignore",
    "chars": 247,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
  },
  {
    "path": "android/app/build.gradle.kts",
    "chars": 4787,
    "preview": "import java.io.FileInputStream\nimport java.util.Properties\nimport com.android.build.api.variant.FilterConfiguration.Filt"
  },
  {
    "path": "android/app/proguard-rules.pro",
    "chars": 1449,
    "preview": "##---------------Begin: proguard configuration for Gson  ----------\n# Gson uses generic type information stored in a cla"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "chars": 413,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"dev.imranr.obtainium\">\n    <!-- The IN"
  },
  {
    "path": "android/app/src/debug/res/values/string.xml",
    "chars": 113,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"label\">Obtainium Debug</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "chars": 4948,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "android/app/src/main/kotlin/dev/imranr/obtainium/MainActivity.kt",
    "chars": 122,
    "preview": "package dev.imranr.obtainium\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity : FlutterActivity("
  },
  {
    "path": "android/app/src/main/res/drawable/ic_launcher_foreground.xml",
    "chars": 3151,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:aapt=\"http://schemas.android.com/aapt\"\n    andr"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "chars": 434,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 438,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 332,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <bac"
  },
  {
    "path": "android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 332,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <bac"
  },
  {
    "path": "android/app/src/main/res/raw/keep.xml",
    "chars": 128,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:keep=\"@drawab"
  },
  {
    "path": "android/app/src/main/res/values/colors.xml",
    "chars": 120,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/string.xml",
    "chars": 107,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"label\">Obtainium</string>\n</resources>"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "chars": 996,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "chars": 995,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/xml/file_paths.xml",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n    <external-path path=\"Android/data/dev.imranr.obtainium/\" name=\"files_"
  },
  {
    "path": "android/app/src/main/res/xml/locales_config.xml",
    "chars": 739,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<locale-config xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <l"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "chars": 413,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"dev.imranr.obtainium\">\n    <!-- The IN"
  },
  {
    "path": "android/build.gradle.kts",
    "chars": 537,
    "preview": "allprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nval newBuildDir: Directory =\n    rootP"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 201,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
  },
  {
    "path": "android/gradle.properties",
    "chars": 166,
    "preview": "org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError\nandroid"
  },
  {
    "path": "android/settings.gradle.kts",
    "chars": 771,
    "preview": "pluginManagement {\n    val flutterSdkPath =\n        run {\n            val properties = java.util.Properties()\n          "
  },
  {
    "path": "assets/ca/lets-encrypt-r3.pem",
    "chars": 1826,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgN"
  },
  {
    "path": "assets/translations/ar.json",
    "chars": 21062,
    "preview": "{\n    \"invalidURLForSource\": \"رابط تطبيق {} غير صالح\",\n    \"noReleaseFound\": \"تعذر العثور على إصدار مناسب\",\n    \"noVersi"
  },
  {
    "path": "assets/translations/bs.json",
    "chars": 23958,
    "preview": "{\n    \"invalidURLForSource\": \"Nije važeći URL aplikacije {}\",\n    \"noReleaseFound\": \"Nije moguće pronaći odgovarajuće iz"
  },
  {
    "path": "assets/translations/ca.json",
    "chars": 25383,
    "preview": "{\n    \"invalidURLForSource\": \"L'URL de l'aplicació {} no es vàlid\",\n    \"noReleaseFound\": \"No s'ha pogut trobar una vers"
  },
  {
    "path": "assets/translations/cs.json",
    "chars": 24596,
    "preview": "{\n    \"invalidURLForSource\": \"Žádná platná adresa URL aplikace {}\",\n    \"noReleaseFound\": \"Nebyla nalezena odpovídající "
  },
  {
    "path": "assets/translations/da.json",
    "chars": 22753,
    "preview": "{\n    \"invalidURLForSource\": \"Ikke et gyldigt {} app-URL\",\n    \"noReleaseFound\": \"Kunne ikke finde en passende udgivelse"
  },
  {
    "path": "assets/translations/de.json",
    "chars": 25047,
    "preview": "{\n    \"invalidURLForSource\": \"Keine gültige {} App-URL\",\n    \"noReleaseFound\": \"Keine passende Version gefunden\",\n    \"n"
  },
  {
    "path": "assets/translations/en-EO.json",
    "chars": 22860,
    "preview": "{\n    \"invalidURLForSource\": \"Nevalida apo-URL {}\",\n    \"noReleaseFound\": \"Ne eblas trovi taŭgan eldonon\",\n    \"noVersio"
  },
  {
    "path": "assets/translations/en.json",
    "chars": 22004,
    "preview": "{\n    \"invalidURLForSource\": \"Not a valid {} app URL\",\n    \"noReleaseFound\": \"Could not find a suitable release\",\n    \"n"
  },
  {
    "path": "assets/translations/es.json",
    "chars": 24930,
    "preview": "{\n    \"invalidURLForSource\": \"La URL de la aplicación {} no es válida\",\n    \"noReleaseFound\": \"No se ha encontrado una v"
  },
  {
    "path": "assets/translations/fa.json",
    "chars": 22778,
    "preview": "{\n    \"invalidURLForSource\": \"آدرس اینترنتی برنامه {} معتبر نیست\",\n    \"noReleaseFound\": \"نسخه مناسبی پیدا نشد\",\n    \"no"
  },
  {
    "path": "assets/translations/fr.json",
    "chars": 26487,
    "preview": "{\n    \"invalidURLForSource\": \"URL de l'application {} invalide\",\n    \"noReleaseFound\": \"Impossible de trouver une public"
  },
  {
    "path": "assets/translations/gl.json",
    "chars": 24051,
    "preview": "{\n    \"invalidURLForSource\": \"URL da app {} non válido\",\n    \"noReleaseFound\": \"Non se atopou unha publicación axeitada\""
  },
  {
    "path": "assets/translations/hu.json",
    "chars": 25862,
    "preview": "{\n    \"invalidURLForSource\": \"Érvénytelen a(z) {} alkalmazás webcíme\",\n    \"noReleaseFound\": \"Nem található megfelelő ki"
  },
  {
    "path": "assets/translations/id.json",
    "chars": 24102,
    "preview": "{\n    \"invalidURLForSource\": \"Bukan URL aplikasi {} yang valid\",\n    \"noReleaseFound\": \"Tidak dapat menemukan rilis yang"
  },
  {
    "path": "assets/translations/it.json",
    "chars": 24944,
    "preview": "{\n    \"invalidURLForSource\": \"URL dell'app {} non valido\",\n    \"noReleaseFound\": \"Impossibile trovare una release adatta"
  },
  {
    "path": "assets/translations/ja.json",
    "chars": 17786,
    "preview": "{\n    \"invalidURLForSource\": \"{}は有効なソースURLではありません\",\n    \"noReleaseFound\": \"適切なリリースが見つかりませんでした\",\n    \"noVersionFound\": \"リ"
  },
  {
    "path": "assets/translations/ko.json",
    "chars": 16992,
    "preview": "{\n    \"invalidURLForSource\": \"유효한 {} 앱 URL이 아닙니다\",\n    \"noReleaseFound\": \"적절한 릴리스를 찾을 수 없습니다\",\n    \"noVersionFound\": \"릴리"
  },
  {
    "path": "assets/translations/ml.json",
    "chars": 25712,
    "preview": "{\n    \"invalidURLForSource\": \"ഒരു സാധുവായ {} ആപ്പ് URL അല്ല\",\n    \"noReleaseFound\": \"അനുയോജ്യമായ റിലീസ് കണ്ടെത്താനായില്ല"
  },
  {
    "path": "assets/translations/nl.json",
    "chars": 24155,
    "preview": "{\n    \"invalidURLForSource\": \"Ongeldige app-URL voor {}\",\n    \"noReleaseFound\": \"Geen geschikte release gevonden\",\n    \""
  },
  {
    "path": "assets/translations/package.json",
    "chars": 54,
    "preview": "{\n  \"dependencies\": {\n    \"translate\": \"^3.0.1\"\n  }\n}\n"
  },
  {
    "path": "assets/translations/pl.json",
    "chars": 25878,
    "preview": "{\n    \"invalidURLForSource\": \"Nieprawidłowy adres URL aplikacji {}\",\n    \"noReleaseFound\": \"Nie można znaleźć odpowiedni"
  },
  {
    "path": "assets/translations/pt-BR.json",
    "chars": 24246,
    "preview": "{\n    \"invalidURLForSource\": \"Não é uma URL de app válida de {}\",\n    \"noReleaseFound\": \"Não foi possível encontrar um l"
  },
  {
    "path": "assets/translations/pt.json",
    "chars": 24904,
    "preview": "{\n    \"invalidURLForSource\": \"URL {} inválida\",\n    \"noReleaseFound\": \"Não foi possível encontrar uma versão adequada\",\n"
  },
  {
    "path": "assets/translations/ru.json",
    "chars": 25053,
    "preview": "{\n    \"invalidURLForSource\": \"Неверный URL-адрес приложения: {}\",\n    \"noReleaseFound\": \"Не удалось найти подходящий вып"
  },
  {
    "path": "assets/translations/standardize.mjs",
    "chars": 1018,
    "preview": "// Take one (hardcoded) translation file and ensure that all other translation files have the same keys in the same orde"
  },
  {
    "path": "assets/translations/sv.json",
    "chars": 23041,
    "preview": "{\n    \"invalidURLForSource\": \"Inte giltig {} App-URL\",\n    \"noReleaseFound\": \"Kunde inte hitta en lämplig releaseversion"
  },
  {
    "path": "assets/translations/tr.json",
    "chars": 23829,
    "preview": "{\n    \"invalidURLForSource\": \"Geçerli bir {} uygulama URL'si değil\",\n    \"noReleaseFound\": \"Uygun bir sürüm bulunamadı\","
  },
  {
    "path": "assets/translations/uk.json",
    "chars": 24500,
    "preview": "{\n    \"invalidURLForSource\": \"Неправильна URL-адреса для джерела застосунку {}\",\n    \"noReleaseFound\": \"Не вдалося знайт"
  },
  {
    "path": "assets/translations/vi.json",
    "chars": 23360,
    "preview": "{\n    \"invalidURLForSource\": \"URL ứng dụng {} không hợp lệ\",\n    \"noReleaseFound\": \"Không thể tìm thấy bản phát hành phù"
  },
  {
    "path": "assets/translations/zh-Hant-TW.json",
    "chars": 15426,
    "preview": "{\n    \"invalidURLForSource\": \"不是有效的 {} 應用程式 URL\",\n    \"noReleaseFound\": \"找不到合適的版本\",\n    \"noVersionFound\": \"無法確定版本\",\n    "
  },
  {
    "path": "assets/translations/zh.json",
    "chars": 15191,
    "preview": "{\n    \"invalidURLForSource\": \"无效的 {} URL\",\n    \"noReleaseFound\": \"找不到合适的发行版\",\n    \"noVersionFound\": \"无法确定发行版本号\",\n    \"ur"
  },
  {
    "path": "build.sh",
    "chars": 1888,
    "preview": "#!/bin/bash\n# Convenience script\n\nCURR_DIR=\"$(pwd)\"\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null "
  },
  {
    "path": "docker/Dockerfile",
    "chars": 2977,
    "preview": "FROM ubuntu:22.04\n\nENV DEBIAN_FRONTEND noninteractive\nENV ANDROID_SDK_ROOT /opt/android-sdk-linux\nENV PATH \"${PATH}:/opt"
  },
  {
    "path": "docker/builder.sh",
    "chars": 572,
    "preview": "#!/usr/bin/env bash\n\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\n\ncd ${SCRIPT_DIR}/."
  },
  {
    "path": "docker/mkbuilder.sh",
    "chars": 311,
    "preview": "#!/usr/bin/env bash\n\nSCRIPT_DIR=$( cd -- \"$( dirname -- \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\nD=$(date +'%Y%m%d.%"
  },
  {
    "path": "fastlane/metadata/android/de/full_description.txt",
    "chars": 1645,
    "preview": "<p>Obtainium erlaubt Ihnen die Installation und Aktualisierung von Apps direkt von deren Veröffentlichungsseiten aus; Si"
  },
  {
    "path": "fastlane/metadata/android/de/short_description.txt",
    "chars": 52,
    "preview": "… Android-App-Updates direkt von der Quelle erhalten"
  },
  {
    "path": "fastlane/metadata/android/de/title.txt",
    "chars": 11,
    "preview": "Obtainium\r\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "chars": 1241,
    "preview": "<p>Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when ne"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "chars": 49,
    "preview": "Get Android app updates directly from the source\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "chars": 10,
    "preview": "Obtainium\n"
  },
  {
    "path": "fastlane/metadata/android/ru-RU/full_description.txt",
    "chars": 1175,
    "preview": "<p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления "
  },
  {
    "path": "fastlane/metadata/android/ru-RU/short_description.txt",
    "chars": 52,
    "preview": "Получайте обновления приложений прямо из источника.\n"
  },
  {
    "path": "fastlane/metadata/android/ru-RU/title.txt",
    "chars": 10,
    "preview": "Obtainium\n"
  },
  {
    "path": "lib/app_sources/apkcombo.dart",
    "chars": 4134,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport 'package:obtainium/"
  },
  {
    "path": "lib/app_sources/apkmirror.dart",
    "chars": 4196,
    "preview": "import 'dart:io';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport "
  },
  {
    "path": "lib/app_sources/apkpure.dart",
    "chars": 6314,
    "preview": "import 'dart:convert';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:easy_localization/easy_"
  },
  {
    "path": "lib/app_sources/aptoide.dart",
    "chars": 2664,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:obtainium/custom_erro"
  },
  {
    "path": "lib/app_sources/codeberg.dart",
    "chars": 2011,
    "preview": "import 'package:obtainium/app_sources/github.dart';\nimport 'package:obtainium/custom_errors.dart';\nimport 'package:obtai"
  },
  {
    "path": "lib/app_sources/coolapk.dart",
    "chars": 6281,
    "preview": "import 'dart:convert';\nimport 'package:bcrypt/bcrypt.dart';\nimport 'package:crypto/crypto.dart';\nimport 'package:easy_lo"
  },
  {
    "path": "lib/app_sources/directAPKLink.dart",
    "chars": 2439,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:obtainium/app_sources/html.dart';\nimport 'pac"
  },
  {
    "path": "lib/app_sources/farsroid.dart",
    "chars": 2718,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nim"
  },
  {
    "path": "lib/app_sources/fdroid.dart",
    "chars": 9460,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nim"
  },
  {
    "path": "lib/app_sources/fdroidrepo.dart",
    "chars": 9534,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport 'package:http/http."
  },
  {
    "path": "lib/app_sources/github.dart",
    "chars": 25237,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:flut"
  },
  {
    "path": "lib/app_sources/gitlab.dart",
    "chars": 9422,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:http/http.dart';\nimpor"
  },
  {
    "path": "lib/app_sources/html.dart",
    "chars": 14572,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nim"
  },
  {
    "path": "lib/app_sources/huaweiappgallery.dart",
    "chars": 3243,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:http/http.dart';\nimport 'package:obtainium/cu"
  },
  {
    "path": "lib/app_sources/izzyondroid.dart",
    "chars": 1759,
    "preview": "import 'package:obtainium/app_sources/fdroid.dart';\nimport 'package:obtainium/custom_errors.dart';\nimport 'package:obtai"
  },
  {
    "path": "lib/app_sources/jenkins.dart",
    "chars": 2300,
    "preview": "import 'dart:convert';\n\nimport 'package:http/http.dart';\nimport 'package:obtainium/custom_errors.dart';\nimport 'package:"
  },
  {
    "path": "lib/app_sources/liteapks.dart",
    "chars": 3218,
    "preview": "import 'dart:convert';\n\nimport 'package:http/http.dart';\nimport 'package:obtainium/custom_errors.dart';\nimport 'package:"
  },
  {
    "path": "lib/app_sources/mullvad.dart",
    "chars": 2220,
    "preview": "import 'package:html/parser.dart';\nimport 'package:http/http.dart';\nimport 'package:obtainium/app_sources/github.dart';\n"
  },
  {
    "path": "lib/app_sources/neutroncode.dart",
    "chars": 3428,
    "preview": "import 'package:html/parser.dart';\nimport 'package:http/http.dart';\nimport 'package:obtainium/custom_errors.dart';\nimpor"
  },
  {
    "path": "lib/app_sources/rockmods.dart",
    "chars": 4963,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport 'package:obtainium/"
  },
  {
    "path": "lib/app_sources/rustore.dart",
    "chars": 3185,
    "preview": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'pac"
  },
  {
    "path": "lib/app_sources/sourceforge.dart",
    "chars": 4202,
    "preview": "import 'package:html/parser.dart';\nimport 'package:http/http.dart';\nimport 'package:obtainium/custom_errors.dart';\nimpor"
  },
  {
    "path": "lib/app_sources/sourcehut.dart",
    "chars": 4406,
    "preview": "import 'package:html/parser.dart';\nimport 'package:http/http.dart';\nimport 'package:obtainium/app_sources/html.dart';\nim"
  },
  {
    "path": "lib/app_sources/telegramapp.dart",
    "chars": 1388,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport 'package:http/http."
  },
  {
    "path": "lib/app_sources/tencent.dart",
    "chars": 2433,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:obtainium/custom_erro"
  },
  {
    "path": "lib/app_sources/uptodown.dart",
    "chars": 4447,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:html/parser.dart';\nimport 'package:obtainium/"
  },
  {
    "path": "lib/app_sources/vivoappstore.dart",
    "chars": 3701,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:obtainium/custom_erro"
  },
  {
    "path": "lib/components/custom_app_bar.dart",
    "chars": 763,
    "preview": "import 'package:flutter/material.dart';\n\nclass CustomAppBar extends StatefulWidget {\n  const CustomAppBar({super.key, re"
  },
  {
    "path": "lib/components/generated_form.dart",
    "chars": 31042,
    "preview": "import 'dart:math';\n\nimport 'package:hsluv/hsluv.dart';\nimport 'package:easy_localization/easy_localization.dart';\nimpor"
  },
  {
    "path": "lib/components/generated_form_modal.dart",
    "chars": 2956,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutt"
  },
  {
    "path": "lib/custom_errors.dart",
    "chars": 5413,
    "preview": "import 'dart:io';\n\nimport 'package:android_package_installer/android_package_installer.dart';\nimport 'package:easy_local"
  },
  {
    "path": "lib/main.dart",
    "chars": 14088,
    "preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:obtai"
  },
  {
    "path": "lib/main_fdroid.dart",
    "chars": 79,
    "preview": "import 'main.dart' as m;\n\nvoid main() async {\n  m.fdroid = true;\n  m.main();\n}\n"
  },
  {
    "path": "lib/mass_app_sources/githubstars.dart",
    "chars": 1940,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:http/http.dart';\nimpo"
  },
  {
    "path": "lib/pages/add_app.dart",
    "chars": 27780,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutt"
  },
  {
    "path": "lib/pages/app.dart",
    "chars": 28369,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutt"
  },
  {
    "path": "lib/pages/apps.dart",
    "chars": 48397,
    "preview": "import 'dart:convert';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:flutter/material.dart"
  },
  {
    "path": "lib/pages/home.dart",
    "chars": 12774,
    "preview": "import 'dart:async';\n\nimport 'package:animations/animations.dart';\nimport 'package:app_links/app_links.dart';\nimport 'pa"
  },
  {
    "path": "lib/pages/import_export.dart",
    "chars": 34924,
    "preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:easy_localization/easy_localization.dart';\nimport 'package:flu"
  },
  {
    "path": "lib/pages/settings.dart",
    "chars": 48235,
    "preview": "import 'package:device_info_plus/device_info_plus.dart';\nimport 'package:easy_localization/easy_localization.dart';\nimpo"
  },
  {
    "path": "lib/providers/apps_provider.dart",
    "chars": 89461,
    "preview": "// Manages state related to the list of Apps tracked by Obtainium,\n// Exposes related functions such as those used to ad"
  },
  {
    "path": "lib/providers/logs_provider.dart",
    "chars": 3253,
    "preview": "import 'package:easy_localization/easy_localization.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:sqf"
  },
  {
    "path": "lib/providers/native_provider.dart",
    "chars": 664,
    "preview": "import 'dart:async';\nimport 'dart:io';\nimport 'package:android_system_font/android_system_font.dart';\nimport 'package:fl"
  },
  {
    "path": "lib/providers/notifications_provider.dart",
    "chars": 9389,
    "preview": "// Exposes functions that can be used to send notifications to the user\n// Contains a set of pre-defined ObtainiumNotifi"
  },
  {
    "path": "lib/providers/settings_provider.dart",
    "chars": 14323,
    "preview": "// Exposes functions used to save/load app settings\n\nimport 'dart:convert';\n\nimport 'package:easy_localization/easy_loca"
  },
  {
    "path": "lib/providers/source_provider.dart",
    "chars": 43619,
    "preview": "// Defines App sources and provides functions used to interact with them\n// AppSource is an abstract class with a concre"
  },
  {
    "path": "pubspec.yaml",
    "chars": 5656,
    "preview": "name: obtainium\ndescription: Get Android app updates straight from the source.\n# The following line prevents the package"
  },
  {
    "path": "sign.sh",
    "chars": 1048,
    "preview": "#!/bin/bash\nset -e\n\n# Script to sign unsigned APKs\n# Assumptions:\n# 1. Your PGP key is already imported on the locally r"
  },
  {
    "path": "test/widget_test.dart",
    "chars": 1064,
    "preview": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the ImranR98/Obtainium GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 131 files (1.3 MB), approximately 338.8k tokens, and a symbol index with 541 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!