summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PREUPLOAD.cfg1
-rw-r--r--PermissionController/Android.bp12
-rw-r--r--PermissionController/AndroidManifest.xml1
-rw-r--r--PermissionController/TEST_MAPPING68
-rw-r--r--PermissionController/iconloaderlib/build.gradle2
-rw-r--r--PermissionController/res/drawable/coarse_off_dark.gifbin170063 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/coarse_off_light.gifbin127528 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/coarse_on_dark.gifbin196366 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/coarse_on_light.gifbin149193 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/fine_off_dark.gifbin178865 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/fine_off_light.gifbin110934 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/fine_on_dark.gifbin160541 -> 0 bytes
-rw-r--r--PermissionController/res/drawable/fine_on_light.gifbin117548 -> 0 bytes
-rw-r--r--PermissionController/res/layout-television/preference_permissions_category.xml4
-rw-r--r--PermissionController/res/layout-television/preference_permissions_no_apps.xml2
-rw-r--r--PermissionController/res/layout/grant_permissions.xml1
-rw-r--r--PermissionController/res/layout/grant_permissions_material3.xml1
-rw-r--r--PermissionController/res/raw-night/coarse_loc_off.json1
-rw-r--r--PermissionController/res/raw-night/coarse_loc_on.json1
-rw-r--r--PermissionController/res/raw-night/fine_loc_off.json1
-rw-r--r--PermissionController/res/raw-night/fine_loc_on.json1
-rw-r--r--PermissionController/res/raw/coarse_loc_off.json1
-rw-r--r--PermissionController/res/raw/coarse_loc_on.json1
-rw-r--r--PermissionController/res/raw/fine_loc_off.json1
-rw-r--r--PermissionController/res/raw/fine_loc_on.json1
-rw-r--r--PermissionController/res/values-af/strings.xml26
-rw-r--r--PermissionController/res/values-am/strings.xml26
-rw-r--r--PermissionController/res/values-ar/strings.xml26
-rw-r--r--PermissionController/res/values-as/strings.xml26
-rw-r--r--PermissionController/res/values-az/strings.xml26
-rw-r--r--PermissionController/res/values-b+sr+Latn/strings.xml26
-rw-r--r--PermissionController/res/values-be/strings.xml26
-rw-r--r--PermissionController/res/values-bg/strings.xml26
-rw-r--r--PermissionController/res/values-bn/strings.xml26
-rw-r--r--PermissionController/res/values-bs/strings.xml26
-rw-r--r--PermissionController/res/values-ca/strings.xml26
-rw-r--r--PermissionController/res/values-cs/strings.xml26
-rw-r--r--PermissionController/res/values-da/strings.xml26
-rw-r--r--PermissionController/res/values-de/strings.xml26
-rw-r--r--PermissionController/res/values-el/strings.xml26
-rw-r--r--PermissionController/res/values-en-rAU/strings.xml26
-rw-r--r--PermissionController/res/values-en-rCA/strings.xml26
-rw-r--r--PermissionController/res/values-en-rGB/strings.xml26
-rw-r--r--PermissionController/res/values-en-rIN/strings.xml26
-rw-r--r--PermissionController/res/values-en-rXC/strings.xml26
-rw-r--r--PermissionController/res/values-es-rUS/strings.xml26
-rw-r--r--PermissionController/res/values-es/strings.xml26
-rw-r--r--PermissionController/res/values-et/strings.xml26
-rw-r--r--PermissionController/res/values-eu/strings.xml26
-rw-r--r--PermissionController/res/values-fa/strings.xml26
-rw-r--r--PermissionController/res/values-fi/strings.xml26
-rw-r--r--PermissionController/res/values-fr-rCA/strings.xml26
-rw-r--r--PermissionController/res/values-fr/strings.xml26
-rw-r--r--PermissionController/res/values-gl/strings.xml26
-rw-r--r--PermissionController/res/values-gu/strings.xml26
-rw-r--r--PermissionController/res/values-hi/strings.xml26
-rw-r--r--PermissionController/res/values-hr/strings.xml26
-rw-r--r--PermissionController/res/values-hu/strings.xml26
-rw-r--r--PermissionController/res/values-hy/strings.xml26
-rw-r--r--PermissionController/res/values-in/strings.xml26
-rw-r--r--PermissionController/res/values-is/strings.xml26
-rw-r--r--PermissionController/res/values-it/strings.xml26
-rw-r--r--PermissionController/res/values-iw/strings.xml26
-rw-r--r--PermissionController/res/values-ja/strings.xml26
-rw-r--r--PermissionController/res/values-ka/strings.xml26
-rw-r--r--PermissionController/res/values-kk/strings.xml26
-rw-r--r--PermissionController/res/values-km/strings.xml26
-rw-r--r--PermissionController/res/values-kn/strings.xml26
-rw-r--r--PermissionController/res/values-ko/strings.xml26
-rw-r--r--PermissionController/res/values-ky/strings.xml26
-rw-r--r--PermissionController/res/values-lo/strings.xml26
-rw-r--r--PermissionController/res/values-lt/strings.xml26
-rw-r--r--PermissionController/res/values-lv/strings.xml26
-rw-r--r--PermissionController/res/values-mk/strings.xml26
-rw-r--r--PermissionController/res/values-ml/strings.xml26
-rw-r--r--PermissionController/res/values-mn/strings.xml26
-rw-r--r--PermissionController/res/values-mr/strings.xml26
-rw-r--r--PermissionController/res/values-ms/strings.xml26
-rw-r--r--PermissionController/res/values-my/strings.xml26
-rw-r--r--PermissionController/res/values-nb/strings.xml26
-rw-r--r--PermissionController/res/values-ne/strings.xml26
-rw-r--r--PermissionController/res/values-nl/strings.xml26
-rw-r--r--PermissionController/res/values-or/strings.xml26
-rw-r--r--PermissionController/res/values-pa/strings.xml26
-rw-r--r--PermissionController/res/values-pl/strings.xml26
-rw-r--r--PermissionController/res/values-pt-rBR/strings.xml26
-rw-r--r--PermissionController/res/values-pt-rPT/strings.xml26
-rw-r--r--PermissionController/res/values-pt/strings.xml26
-rw-r--r--PermissionController/res/values-ro/strings.xml26
-rw-r--r--PermissionController/res/values-ru/strings.xml26
-rw-r--r--PermissionController/res/values-si/strings.xml26
-rw-r--r--PermissionController/res/values-sk/strings.xml26
-rw-r--r--PermissionController/res/values-sl/strings.xml26
-rw-r--r--PermissionController/res/values-sq/strings.xml26
-rw-r--r--PermissionController/res/values-sr/strings.xml26
-rw-r--r--PermissionController/res/values-sv/strings.xml26
-rw-r--r--PermissionController/res/values-sw/strings.xml26
-rw-r--r--PermissionController/res/values-ta/strings.xml26
-rw-r--r--PermissionController/res/values-te/strings.xml26
-rw-r--r--PermissionController/res/values-th/strings.xml26
-rw-r--r--PermissionController/res/values-tl/strings.xml26
-rw-r--r--PermissionController/res/values-tr/strings.xml26
-rw-r--r--PermissionController/res/values-uk/strings.xml26
-rw-r--r--PermissionController/res/values-ur/strings.xml26
-rw-r--r--PermissionController/res/values-uz/strings.xml26
-rw-r--r--PermissionController/res/values-v33/styles.xml151
-rw-r--r--PermissionController/res/values-vi/strings.xml26
-rw-r--r--PermissionController/res/values-zh-rCN/strings.xml26
-rw-r--r--PermissionController/res/values-zh-rHK/strings.xml26
-rw-r--r--PermissionController/res/values-zh-rTW/strings.xml26
-rw-r--r--PermissionController/res/values-zu/strings.xml26
-rw-r--r--PermissionController/res/values/strings.xml55
-rw-r--r--PermissionController/res/values/styles.xml20
-rw-r--r--PermissionController/res/values/themes.xml8
-rw-r--r--PermissionController/res/xml-v34/safety_center_subpage.xml22
-rw-r--r--PermissionController/res/xml/roles.xml15
-rw-r--r--PermissionController/src/android/support/wearable/view/CircledImageView.java602
-rw-r--r--PermissionController/src/android/support/wearable/view/Gusterpolator.java84
-rw-r--r--PermissionController/src/android/support/wearable/view/ProgressDrawable.java176
-rw-r--r--PermissionController/src/android/support/wearable/view/SimpleAnimatorListener.java67
-rw-r--r--PermissionController/src/android/support/wearable/view/WearableListView.java1388
-rw-r--r--PermissionController/src/com/android/permissioncontroller/DeviceUtils.java4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/PermissionController.proto2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/PermissionControllerApplication.java4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/hibernation/OWNERS1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/incident/ReportDetails.java11
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/TEST_MAPPING64
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt52
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt13
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/model/v31/AppPermissionUsage.java73
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/LocationAccessCheck.java17
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java14
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ReviewOngoingUsageActivity.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionsFragment.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionHistoryPreference.kt29
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt211
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt142
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.kt84
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionControlPreference.java7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionPreference.java8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ReviewPermissionsFragment.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/DashboardUtils.kt103
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionDetailsFragment.java307
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageV2Fragment.java248
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt32
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/ManageStandardPermissionsViewModel.kt9
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreference.java8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreferenceUtils.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewOngoingUsageViewModel.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewPermissionsViewModel.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageControlPreferenceUtils.kt10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt812
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt278
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v33/SafetyCenterQsViewModel.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt186
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/PermissionMapping.kt53
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/TEST_MAPPING10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/Role.md9
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/TEST_MAPPING17
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/BrowserRoleBehavior.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/Permission.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/RequiredComponent.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/Role.java27
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/RoleParser.java12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/model/SmsRoleBehavior.java11
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java39
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/TEST_MAPPING10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java49
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterQsFragment.java24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt77
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterUiFlags.kt35
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyGroupPreference.kt36
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyStatusPreference.java127
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt17
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterViewModel.kt5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/StatusUiData.kt80
-rw-r--r--PermissionController/tests/inprocess/Android.bp7
-rw-r--r--PermissionController/tests/mocking/Android.bp6
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/ReviewPermissionsViewModelTest.kt14
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt7
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/OWNERS3
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/ui/model/StatusUiDataTest.kt267
-rw-r--r--PermissionController/tests/outofprocess/Android.bp1
-rw-r--r--PermissionController/tests/permissionui/Android.bp11
-rw-r--r--PermissionController/tests/permissionui/AndroidTest.xml1
-rw-r--r--SafetyCenter/Config/tests/Android.bp5
-rw-r--r--SafetyCenter/ConfigLintChecker/Android.bp7
-rw-r--r--SafetyCenter/TEST_MAPPING10
-rw-r--r--framework-s/Android.bp5
-rw-r--r--framework-s/api/system-current.txt27
-rw-r--r--framework-s/java/android/app/role/RoleManager.java9
-rw-r--r--framework-s/java/android/app/role/TEST_MAPPING19
-rw-r--r--framework-s/java/android/safetycenter/SafetyCenterManager.java12
-rw-r--r--framework-s/java/android/safetycenter/SafetySourceIssue.java392
-rw-r--r--framework-s/java/android/safetycenter/TEST_MAPPING10
-rw-r--r--service/Android.bp25
-rw-r--r--service/java/com/android/permission/access/AccessCheckingService.kt85
-rw-r--r--service/java/com/android/permission/access/AccessPersistence.kt61
-rw-r--r--service/java/com/android/permission/access/AccessPolicy.kt150
-rw-r--r--service/java/com/android/permission/access/AccessState.kt80
-rw-r--r--service/java/com/android/permission/access/AccessUri.kt83
-rw-r--r--service/java/com/android/permission/access/appop/AppOpModes.kt27
-rw-r--r--service/java/com/android/permission/access/appop/BaseAppOpPolicy.kt42
-rw-r--r--service/java/com/android/permission/access/appop/PackageAppOpPolicy.kt64
-rw-r--r--service/java/com/android/permission/access/appop/UidAppOpPolicy.kt59
-rw-r--r--service/java/com/android/permission/access/data/Package.kt43
-rw-r--r--service/java/com/android/permission/access/data/Permission.kt40
-rw-r--r--service/java/com/android/permission/access/external/PackageInfoUtils.kt33
-rw-r--r--service/java/com/android/permission/access/external/PackageState.kt51
-rw-r--r--service/java/com/android/permission/access/external/UserHandle.kt31
-rw-r--r--service/java/com/android/permission/access/package-info.java (renamed from service/java/com/android/access/package-info.java)2
-rw-r--r--service/java/com/android/permission/access/permission/PermissionFlags.kt (renamed from service/java/com/android/access/AccessCheckingService.kt)9
-rw-r--r--service/java/com/android/permission/access/permission/UidPermissionPolicy.kt287
-rw-r--r--service/java/com/android/permission/access/util/IndexedList.kt56
-rw-r--r--service/java/com/android/permission/access/util/IndexedListSet.kt104
-rw-r--r--service/java/com/android/permission/access/util/IndexedMap.kt86
-rw-r--r--service/java/com/android/permission/access/util/IndexedSet.kt61
-rw-r--r--service/java/com/android/permission/access/util/IntMap.kt77
-rw-r--r--service/java/com/android/permission/access/util/IntSet.kt86
-rw-r--r--service/java/com/android/role/RoleService.java10
-rw-r--r--service/java/com/android/role/RoleShellCommand.java15
-rw-r--r--service/java/com/android/role/TEST_MAPPING21
-rw-r--r--service/java/com/android/safetycenter/TEST_MAPPING10
-rw-r--r--tests/cts/safetycenter/AndroidTest.xml1
-rw-r--r--tests/cts/safetycenter/TEST_MAPPING10
-rw-r--r--tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterMultiUsersTest.kt2
-rw-r--r--tests/cts/safetycenter/src/android/safetycenter/cts/SafetySourceIssueTest.kt365
-rw-r--r--tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterFlags.kt13
-rw-r--r--tests/cts/safetycenter/src/android/safetycenter/cts/ui/SafetyCenterSubpagesTest.kt115
242 files changed, 6249 insertions, 5191 deletions
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index ee31c505f..fc93cc505 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -5,4 +5,3 @@ commit_msg_changeid_field = true
[Hook Scripts]
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
-strings_lint_hook = ${REPO_ROOT}/frameworks/base/tools/stringslint/stringslint_sha.sh ${PREUPLOAD_COMMIT}
diff --git a/PermissionController/Android.bp b/PermissionController/Android.bp
index 5a4d2930e..c254036f0 100644
--- a/PermissionController/Android.bp
+++ b/PermissionController/Android.bp
@@ -45,7 +45,10 @@ genrule {
java_library {
name: "permissioncontroller-statsd",
sdk_version: "system_current",
-
+ min_sdk_version: "30",
+ apex_available: [
+ "com.android.permission",
+ ],
srcs: [
":statslog-permissioncontroller-java-gen",
],
@@ -136,10 +139,12 @@ android_app {
"SettingsLibUtils",
"modules-utils-build_system",
"safety-center-resources-lib",
+ "lottie",
],
proto: {
type: "lite",
+ include_dirs: ["packages/modules/Permission/PermissionController/src/com/android/permissioncontroller"],
},
lint: {
@@ -153,4 +158,9 @@ android_app {
plugins: ["java_api_finder"],
kotlincflags: ["-Xjvm-default=enable"],
+
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.permission",
+ ],
}
diff --git a/PermissionController/AndroidManifest.xml b/PermissionController/AndroidManifest.xml
index 83d598888..79ebae5b7 100644
--- a/PermissionController/AndroidManifest.xml
+++ b/PermissionController/AndroidManifest.xml
@@ -64,6 +64,7 @@
<uses-permission android:name="android.permission.LAUNCH_MULTI_PANE_SETTINGS_DEEP_LINK" />
<uses-permission android:name="android.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS"/>
<uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />
+ <uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" />
<application android:name="com.android.permissioncontroller.PermissionControllerApplication"
android:label="@string/app_name"
diff --git a/PermissionController/TEST_MAPPING b/PermissionController/TEST_MAPPING
index 0911e0d91..0ae3818fd 100644
--- a/PermissionController/TEST_MAPPING
+++ b/PermissionController/TEST_MAPPING
@@ -11,6 +11,74 @@
}
],
"file_patterns": ["res/xml/roles\\.xml"]
+ },
+ {
+ "name": "PermissionUiTestCases",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
+ ],
+ "presubmit-large": [
+ {
+ "name": "CtsPermission3TestCases",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsRoleTestCases[com.google.android.permission.apex]",
+ "options": [
+ // TODO(b/238677748): These two tests currently fails on R base image
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList"
+ },
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#removeSmsRoleHolderThenPermissionIsRevoked"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ],
+ "file_patterns": ["res/xml/roles\\.xml"]
+ },
+ {
+ "name": "PermissionUiTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ },
+ // TODO(b/238773220): These tests currently fails on R base image
+ {
+ "exclude-filter": "com.android.permissioncontroller.permissionui.ui.handheld.ManageCustomPermissionsFragmentTest#groupSummaryGetsUpdatedWhenPermissionGetsGranted"
+ },
+ {
+ "exclude-filter": "com.android.permissioncontroller.permissionui.ui.handheld.ManageCustomPermissionsFragmentTest#groupSummaryGetsUpdatedWhenPermissionGetsRevoked"
+ },
+ {
+ "exclude-filter": "com.android.permissioncontroller.permissionui.ui.handheld.ManageStandardPermissionsFragmentTest#additionalPermissionSummaryGetUpdateWhenAppGetsInstalled"
+ },
+ {
+ "exclude-filter": "com.android.permissioncontroller.permissionui.ui.handheld.ManageStandardPermissionsFragmentTest#additionalPermissionSummaryGetUpdateWhenDefinerGetsUninstalled"
+ },
+ {
+ "exclude-filter": "com.android.permissioncontroller.permissionui.ui.handheld.ManageStandardPermissionsFragmentTest#additionalPermissionSummaryGetUpdateWhenUserGetsUninstalled"
+ }
+ ]
+ },
+ {
+ "name": "CtsPermission3TestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
}
],
"imports": [
diff --git a/PermissionController/iconloaderlib/build.gradle b/PermissionController/iconloaderlib/build.gradle
index 84102758e..35ca8dee2 100644
--- a/PermissionController/iconloaderlib/build.gradle
+++ b/PermissionController/iconloaderlib/build.gradle
@@ -34,5 +34,5 @@ android {
}
dependencies {
- implementation "androidx.core:core:${ANDROID_X_VERSION}"
+ implementation "androidx.core:core"
}
diff --git a/PermissionController/res/drawable/coarse_off_dark.gif b/PermissionController/res/drawable/coarse_off_dark.gif
deleted file mode 100644
index 09a7da18d..000000000
--- a/PermissionController/res/drawable/coarse_off_dark.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/coarse_off_light.gif b/PermissionController/res/drawable/coarse_off_light.gif
deleted file mode 100644
index a5419cd91..000000000
--- a/PermissionController/res/drawable/coarse_off_light.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/coarse_on_dark.gif b/PermissionController/res/drawable/coarse_on_dark.gif
deleted file mode 100644
index a2ea07bd0..000000000
--- a/PermissionController/res/drawable/coarse_on_dark.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/coarse_on_light.gif b/PermissionController/res/drawable/coarse_on_light.gif
deleted file mode 100644
index 491edb612..000000000
--- a/PermissionController/res/drawable/coarse_on_light.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/fine_off_dark.gif b/PermissionController/res/drawable/fine_off_dark.gif
deleted file mode 100644
index 560e38a34..000000000
--- a/PermissionController/res/drawable/fine_off_dark.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/fine_off_light.gif b/PermissionController/res/drawable/fine_off_light.gif
deleted file mode 100644
index 5661b9270..000000000
--- a/PermissionController/res/drawable/fine_off_light.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/fine_on_dark.gif b/PermissionController/res/drawable/fine_on_dark.gif
deleted file mode 100644
index aadf7821b..000000000
--- a/PermissionController/res/drawable/fine_on_dark.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/drawable/fine_on_light.gif b/PermissionController/res/drawable/fine_on_light.gif
deleted file mode 100644
index a592c6305..000000000
--- a/PermissionController/res/drawable/fine_on_light.gif
+++ /dev/null
Binary files differ
diff --git a/PermissionController/res/layout-television/preference_permissions_category.xml b/PermissionController/res/layout-television/preference_permissions_category.xml
index 59412065d..ff5cc6147 100644
--- a/PermissionController/res/layout-television/preference_permissions_category.xml
+++ b/PermissionController/res/layout-television/preference_permissions_category.xml
@@ -25,7 +25,7 @@
android:paddingTop="16dp"
android:paddingBottom="16dp">
<TextView
- android:id="@+android:id/title"
+ android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/settings_category_text_color"
@@ -33,7 +33,7 @@
android:textStyle="bold"/>
<TextView
- android:id="@+android:id/summary"
+ android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
diff --git a/PermissionController/res/layout-television/preference_permissions_no_apps.xml b/PermissionController/res/layout-television/preference_permissions_no_apps.xml
index dbcd3ec25..0511ecf57 100644
--- a/PermissionController/res/layout-television/preference_permissions_no_apps.xml
+++ b/PermissionController/res/layout-television/preference_permissions_no_apps.xml
@@ -17,7 +17,7 @@
<!-- Layout used for PreferenceCategory in a PreferenceActivity. -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+android:id/title"
+ android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
diff --git a/PermissionController/res/layout/grant_permissions.xml b/PermissionController/res/layout/grant_permissions.xml
index cda679d05..5940f7f0f 100644
--- a/PermissionController/res/layout/grant_permissions.xml
+++ b/PermissionController/res/layout/grant_permissions.xml
@@ -62,6 +62,7 @@
</LinearLayout>
+ <!-- location (precise/approximate) animations -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/PermissionController/res/layout/grant_permissions_material3.xml b/PermissionController/res/layout/grant_permissions_material3.xml
index 317a33b55..a63f5d0a4 100644
--- a/PermissionController/res/layout/grant_permissions_material3.xml
+++ b/PermissionController/res/layout/grant_permissions_material3.xml
@@ -63,6 +63,7 @@
</LinearLayout>
+ <!-- location (precise/approximate) animations -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/PermissionController/res/raw-night/coarse_loc_off.json b/PermissionController/res/raw-night/coarse_loc_off.json
new file mode 100644
index 000000000..2779a0c64
--- /dev/null
+++ b/PermissionController/res/raw-night/coarse_loc_off.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Approximate_OFF_DT","ddd":0,"assets":[{"id":"comp_0","nm":"Approximate_OFF_DT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[62,62,100]},{"t":60,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Highway_Signs","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,67.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.48,-0.218],[-0.001,3.653],[5.479,-0.218],[5.999,-3.653],[-6,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.583,71.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,65.956],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,70.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.218],[0.001,3.653],[5.48,-0.218],[5.999,-3.653],[-5.999,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,74.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,68.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,222.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.217],[-0.001,3.653],[5.48,-0.217],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,226.283],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.038],[0,0],[0.292,-1.238],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.238]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,221.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.177]],"o":[[-0.042,0.177],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.276],[-6,0.275],[6,0.275],[5.894,-0.276]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,186.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.192],[0,0],[-1.626,3.1],[0.158,1.028],[0,0]],"o":[[1.626,3.1],[0,0],[0.626,-1.192],[0,0],[-0.158,1.028]],"v":[[-5.479,-0.218],[-0.001,3.652],[5.48,-0.218],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.01,190.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.036],[0,0],[1.358,0.038],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.036],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,185.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".yellow200","cl":"yellow200","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.273,-62.792],[10.273,-19.932],[5.308,43.982],[3.529,62.792]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.691,67.791],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.845,50.02],[-43.615,20.333],[-43.615,-21.96],[-34.261,-28.874],[-24.095,-28.874],[-16.368,-34.974],[-1.728,-31.72],[1.931,-37.821],[7.218,-34.567],[23.079,-42.293],[55.331,-42.293],[69.845,-50.02]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[373.948,242.314],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-113.972,-119.335],[-113.972,-89.146],[-110.288,-76.336],[-118.014,-57.426],[-110.288,-39.939],[-93.615,-15.54],[-81.414,-1.306],[-84.668,17.808],[-75.721,29.193],[-63.521,36.921],[-49.288,39.36],[-41.968,48.714],[-28.954,48.714],[-17.568,53.594],[-2.115,58.067],[5.205,65.794],[21.066,68.233],[51.972,97.107],[62.545,99.954],[75.559,99.954],[118.014,119.335]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.421,175.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-214.415,-10.167],[-193.269,2.034],[-180.255,2.034],[-172.122,4.88],[-161.548,-0.406],[-149.349,0.001],[-132.675,-7.32],[-126.575,-5.693],[-113.969,-10.167],[-96.075,-8.133],[-88.755,-2.643],[-80.215,-2.643],[-43.208,-2.643],[-22.062,-6.1],[-13.319,0.407],[-0.61,2.034],[17.384,-2.643],[35.278,-0.406],[50.731,2.034],[53.985,6.913],[73.912,4.88],[86.111,10.167],[114.578,10.167],[150.365,10.167],[159.311,4.88],[214.415,2.034]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[223.889,101.607],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.296,-34.933],[-152.296,-17.527],[-140.503,-1.668],[-129.523,3.62],[-129.523,10.94],[-120.577,15.413],[-117.729,22.327],[-88.449,34.933],[-76.251,30.867],[-68.117,23.953],[-38.43,27.207],[-25.417,28.833],[-7.93,24.767],[20.943,25.986],[31.924,29.24],[38.837,25.58],[51.443,25.58],[60.391,21.513],[86.01,18.667],[97.804,26.8],[152.297,26.393]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.103,105.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.757,-76.408],[21.757,-63.89],[13.214,-63.89],[-14.031,-38.677],[-19.724,-23.223],[-21.757,54.857],[-18.098,63.803],[-21.757,76.409]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,177.698],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.1,-42.533],[-37.413,-29.478],[-34.567,-20.938],[-28.873,-24.191],[-17.08,-23.378],[-5.693,-7.518],[12.2,-3.046],[18.3,5.495],[24.807,9.562],[38.227,11.594],[52.867,19.729],[62.525,21.355],[67.1,29.896],[67.1,42.533]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[160.753,59.919],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-139.893,-158.396],[-135.827,-143.349],[-95.566,-100.243],[-75.233,-93.736],[-51.646,-67.303],[-48.8,-54.29],[-35.38,-42.496],[-32.94,-22.57],[-24.807,-18.91],[-10.574,-14.844],[8.947,16.47],[58.56,53.477],[82.147,84.79],[102.074,96.99],[125.66,133.997],[139.893,142.536],[139.893,158.396]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.307,169.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey300","cl":"grey300","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.717,-1.007],[-31.717,1.007]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[287.883,119.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.365,-14.212],[-27.159,-14.715],[-22.239,-18.741],[-8.414,-18.741],[6.556,-19.629],[15.02,-18.202],[28.069,-14.212],[28.069,-5.406],[28.069,1.64],[28.069,10.949],[29.704,14.22],[35.239,16.731],[35.365,19.629]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[291.531,123.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-41.561,-23.371],[-37.444,-22.113],[-31.154,-25.384],[-26.499,-26.767],[-21.215,-28.151],[-18.196,-31.05],[-12.41,-31.528],[-8.761,-31.05],[-7.628,-28.906],[9.733,-22.113],[23.067,-5.129],[29.106,-0.14],[37.283,12.608],[40.931,21.004],[41.561,31.528]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[348.112,171.29],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.64,-38.155],[4.64,-8.29],[7.771,-2.101],[6.974,5.21],[2.462,11.432],[-0.966,22.989],[-7.771,38.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[251.527,139.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-19.621,11.458],[-23.788,-11.458],[23.788,-11.458]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.299,233.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-36.573,-3.452],[3.542,-3.452],[8.492,-1.858],[25.051,-3.452],[31.026,-2.655],[35.293,0.133],[36.573,2.352],[34.013,2.352],[32.887,3.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[297.973,269.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.691,-18.223],[-10.328,-18.734],[-5.207,-17.88],[1.281,-18.307],[18.009,-19.077],[25.691,-12.504],[22.789,-10.797],[14.168,0.47],[12.376,5.846],[8.45,13.615],[4.011,19.077]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[307.575,287.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[50.742,46.448],[51.669,43.468],[50.742,37.157],[55.148,32.302],[72.276,31.185],[72.276,5.64],[70.623,-1.526],[70.623,-40.523],[69.383,-42.865],[62.906,-43.554],[56.843,-42.865],[54.224,-44.381],[49.264,-44.381],[45.13,-46.448],[-72.276,-46.448]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[226.967,241.72],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-119.509,-44.611],[-97.824,-40.96],[-89.824,-34.688],[-72.741,-36.266],[-66.754,-33.154],[40.537,-34.971],[59.633,-38.882],[68.047,-38.882],[73.387,-37.306],[74.626,-33.154],[77.919,-31.804],[77.919,-26.232],[80.508,-24.928],[89.57,-21.215],[97.823,-16.038],[105.684,-14.257],[108.827,-8.431],[113.844,5.663],[119.508,8.884],[117.654,19.078],[110.284,25.092],[107.048,37.527],[104.562,44.612]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[278.637,267.243],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-51.352,2.509],[13.052,3.155],[35.386,-3.155],[51.352,-3.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.911,213.904],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[275.481,202.819],[275.481,222.082]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.805,-24.131],[-0.446,-14.804],[1.18,18.209],[-2.805,24.131]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[269.292,219.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.325,-7.523],[-4.713,-0.839],[5.806,-0.839],[16.325,7.523]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[261.745,182.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-52.188,-19.67],[-41.346,-24.51],[-9.628,-12.712],[5.098,-9.312],[20.956,-3.564],[26.135,-4.62],[34.719,-0.671],[41.671,4.326],[52.189,7.729],[46.039,15.452],[46.202,24.509]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[213.259,163.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[73.548,-6.19],[75.996,7.565],[69.525,24.299],[59.976,26.175],[53.504,28.441],[47.03,33.188],[47.03,39.488],[34.894,32.698],[26.767,21.986],[17.423,17.347],[-1.49,12.605],[-28.757,3.71],[-37.055,-16.252],[-66.354,-16.252],[-66.354,-18.782],[-69.801,-23.38],[-68.077,-26.092],[-70.654,-30.31],[-74.309,-30.31],[-75.996,-39.488]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[230.554,138.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-68.814,-67.689],[-33.186,-67.127],[-13.566,-64.287],[9.77,-52.647],[17.081,-46.04],[58.129,-44.971],[60.347,-29.873],[60.347,-12.806],[61.785,6.876],[59.395,9.068],[60.347,54.334],[65.44,54.334],[68.814,58.411],[63.612,63.472],[65.581,64.877],[63.612,67.689]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.756,235.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.636,-10.36],[-2.642,-10.95],[4.106,-13.762],[4.478,-12.242],[5.933,-6.307],[6.636,13.761]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[170.836,181.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.903,178.874],[176.77,178.874]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-46.11,-24.495],[-24.601,-24.495],[-18.978,-22.285],[10.012,-24.495],[26.288,-21.262],[39.924,-19.433],[46.11,-14.795],[41.028,24.495]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[194.482,197.586],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[163.403,74.086],[163.403,98.964]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.298,-13.017],[-2.298,-7.952],[0.038,-1.57],[0.038,13.017]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[138.776,74.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.094,-4.83],[-14.691,-5.955],[-13.004,-4.127],[-6.116,-5.041],[25.094,-5.041],[25.094,5.955]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[113.72,93.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-21.799,-26.171],[-21.799,13.635],[-20.774,20.008],[16.176,26.171],[21.799,24.503]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[143.443,79.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.626,74.857],[151.806,74.857]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[93.653,52.401],[93.653,94.366]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.723,-35.415],[-1.723,-14.469],[0.62,-12.953],[1.723,35.415]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[162.477,159.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.575,3.259],[-0.551,-3.259],[4.821,-3.259],[7.166,-1.191],[9.784,-1.191],[11.575,-3.259]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[155.932,166.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-4.489,-23.839],[-6.05,-13.917],[-7.841,-12.401],[-7.841,1.329],[-11.562,10.887],[-11.562,23.84],[11.562,23.84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.855000035903,0.862999949736,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[179.069,138.912],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey700","cl":"grey700","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.172,-14.163],[-87.624,-10.786],[-87.624,-7.25],[-91.245,-3.685],[-94.866,-5.154],[-98.486,-11.792],[-101.705,-10.384],[-105.729,-11.792],[-110.154,-14.163],[-116.994,-11.792],[-121.218,-5.355],[-119.247,-2.337],[-117.598,-2.337],[-116.19,1.083],[-110.959,2.286],[-107.137,3.899],[-97.49,3.899],[-97.49,10.725],[-88.428,11.544],[-86.819,19.59],[-68.714,22.205],[-62.64,26.027],[-55.235,33.068],[-45.78,31.79],[-35.723,31.79],[-22.848,31.79],[-17.818,34.678],[-3.957,38.5],[5.315,37.695],[13.563,34.678],[23.622,33.873],[46.757,36.891],[58.826,36.891],[67.678,33.068],[75.14,30.654],[87.996,32.666],[90.209,31.79],[108.313,29.649],[117.768,25.022],[130.243,25.424],[144.523,25.022],[148.34,20.596],[149.955,15.969],[148.34,10.725],[127.193,-42.264],[-25.865,-48.73],[-69.318,-44.784],[-72.134,-37.519],[-82.394,-31.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[308.06,59.651],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-53.521,-13.307],[-41.048,-20.863],[-32.801,-18.738],[-26.967,-20.863],[-15.902,-15.576],[-11.075,-15.576],[-11.075,-13.307],[4.818,-13.307],[6.83,-15.576],[17.29,-15.576],[20.308,-23.708],[24.532,-22.041],[35.194,-20.863],[45.454,-19.945],[47.264,-15.576],[52.695,-6.064],[46.459,23.708],[42.881,20.101],[34.646,17.883],[-4.626,17.883],[-13.177,20.101],[-23.946,20.101],[-30.387,15.26],[-38.835,16.264],[-49.296,17.271],[-56.009,14.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.974,127.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey800","cl":"grey800","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.851,0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[2.851,-0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-209.239,-23.701],[-197.204,-12.299],[-193.403,-15.149],[-193.403,-18.95],[-181.051,-21.801],[-177.251,-23.701],[-166.482,-23.701],[-157.931,-25.918],[-154.447,-25.918],[-135.761,-25.918],[-131.327,-25.918],[-124.36,-25.918],[-118.658,-25.918],[-110.424,-23.701],[-104.406,-19.108],[-98.389,-12.299],[-88.254,0.49],[-84.77,0],[-84.77,-6.282],[-81.92,-1.531],[-83.351,0],[-84.736,0.49],[-86.024,1.81],[-86.644,2.239],[-81.92,12.262],[-74.427,29.3],[-73.52,32.545],[-69.607,41.517],[-69.607,44.142],[-68.7,45.383],[-66.791,56.121],[-66.791,60.226],[-68.748,61.371],[-68.748,62.564],[-70.322,63.995],[-70.37,65.523],[-72.327,67.146],[-73.615,67.146],[-74.14,68.195],[-75.477,68.195],[-75.477,69.389],[-76.908,70.439],[-77.481,71.059],[-77.481,72.014],[-78.293,72.872],[-76.813,73.445],[-76.67,74.877],[-75.572,75.402],[-75.668,77.788],[-74.904,77.788],[-74.904,81.367],[-74.093,81.367],[-73.854,83.611],[-72.947,84.231],[-72.947,85.52],[-71.754,86.331],[-69.655,86.331],[-64.643,86.331],[-64.023,85.472],[-61.302,85.902],[-61.064,86.331],[-57.485,86.665],[-56.005,88.287],[-56.005,89.815],[-54.287,90.912],[-53.428,90.244],[-52.998,90.912],[-51.614,91.199],[-51.614,92.249],[-49.133,92.249],[-48.751,93.299],[-46.651,93.299],[-45.935,94.253],[-45.076,94.253],[-42.833,96.688],[-40.256,96.688],[-40.256,97.498],[-38.108,97.498],[-37.678,98.501],[-35.817,98.501],[-34.815,99.169],[-34.004,99.169],[-33.622,98.453],[-31.14,98.453],[-31.427,97.642],[-31.904,96.782],[-33.431,96.735],[-33.622,91.58],[-33.097,91.58],[-32.763,92.583],[-31.713,92.44],[-31.14,92.965],[-29.279,92.869],[-29.279,91.676],[-30.138,91.342],[-30.043,89.385],[-30.902,88.669],[-30.949,87.237],[-31.904,86.808],[-30.997,86.092],[-30.854,84.66],[-30.138,84.374],[-30.091,80.556],[-31.045,79.984],[-30.759,76.691],[-29.47,78.313],[-29.279,79.268],[-27.37,80.222],[-26.559,79.888],[-25.89,78.934],[-25.604,77.884],[-24.459,76.357],[-21.882,75.402],[-17.586,74.973],[-14.771,74.734],[-14.771,75.831],[-22.072,77.74],[-23.361,78.122],[-24.268,78.6],[-25.127,79.124],[-25.509,80.174],[-27.036,81.272],[-28.181,81.749],[-29.088,83.229],[-29.088,85.997],[-28.849,87.953],[-27.752,88.287],[-26.177,89.385],[-24.173,88.097],[-23.648,88.097],[-22.502,87.143],[-22.74,86.331],[-23.027,83.372],[-22.12,83.133],[-21.548,83.897],[-21.5,84.518],[-20.88,84.66],[-20.88,85.902],[-20.02,86.188],[-19.734,85.328],[-16.918,85.568],[-16.966,84.708],[-19.114,82.895],[-19.591,82.035],[-19.495,81.272],[-16.441,81.415],[-16.107,80.509],[-13.72,80.509],[-12.862,79.076],[-11.239,79.984],[-10.809,83.849],[-9.473,83.897],[-8.996,84.566],[-6.848,84.852],[-6.085,85.949],[-3.364,86.236],[-3.078,84.756],[-3.698,81.701],[-6.037,79.554],[-6.323,78.504],[-3.603,78.456],[-2.219,78.027],[-0.406,77.359],[0.549,77.74],[2.84,77.645],[4.94,77.645],[6.133,78.027],[8.567,78.6],[9.14,79.458],[11.096,79.458],[11.43,80.413],[13.149,80.413],[13.435,80.986],[14.628,81.033],[14.628,80.413],[15.868,79.936],[15.868,78.934],[16.346,81.272],[18.064,81.32],[18.064,80.222],[17.539,80.174],[17.539,78.074],[18.446,78.552],[19.973,80.031],[21.452,80.079],[21.452,82.704],[20.976,83.42],[20.976,84.518],[19.782,84.804],[19.83,85.71],[22.026,86.188],[22.884,86.999],[24.698,87.047],[25.414,87.953],[27.275,87.953],[30.855,87.953],[31.523,86.999],[32.764,87.047],[32.286,88.335],[31.761,88.956],[32.048,90.436],[36.915,90.818],[37.583,98.787],[39.97,102.366],[42.738,103.368],[44.552,106.185],[54.431,117.018],[58.582,120.216],[67.889,127.518],[73.711,130.429],[85.165,134.294],[88.458,136.013],[91.179,136.013],[97.717,142.026],[98.338,144.89],[104.494,147.849],[107.262,150],[211.975,150],[211.975,-151.69],[-210.962,-153.764]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,171.151],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey900","cl":"grey900","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,148.684],[206,148.684],[206,-148.684],[-206,-148.684]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.125490196078,0.129411764706,0.141176470588,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,172.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.66,0.66],"y":[0,0]},"t":0,"s":[294,294]},{"t":10,"s":[300,300]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":0,"s":[6]},{"t":10,"s":[0]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":20,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[64.361,64.36,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[150,150,100]},{"t":45,"s":[48.034,48.034,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.829000016755,0.885999971278,0.955999995213,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[100]},{"t":32,"s":[70]}],"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.552941203117,0.670588254929,0.921568632126,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[50]},{"t":32,"s":[20]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"CircleMatte 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Approximate_OFF_DT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.16,307.16,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[{"tm":91,"cm":"","dr":0}]} \ No newline at end of file
diff --git a/PermissionController/res/raw-night/coarse_loc_on.json b/PermissionController/res/raw-night/coarse_loc_on.json
new file mode 100644
index 000000000..b6f098d30
--- /dev/null
+++ b/PermissionController/res/raw-night/coarse_loc_on.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Approximate_ON_DT","ddd":0,"assets":[{"id":"comp_0","nm":"Approximate_ON_DT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[90,90,100]},{"t":60,"s":[62,62,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Highway_Signs","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,67.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.48,-0.218],[-0.001,3.653],[5.479,-0.218],[5.999,-3.653],[-6,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.583,71.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,65.956],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,70.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.218],[0.001,3.653],[5.48,-0.218],[5.999,-3.653],[-5.999,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,74.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,68.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,222.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.217],[-0.001,3.653],[5.48,-0.217],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,226.283],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.038],[0,0],[0.292,-1.238],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.238]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,221.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.177]],"o":[[-0.042,0.177],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.276],[-6,0.275],[6,0.275],[5.894,-0.276]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,186.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.192],[0,0],[-1.626,3.1],[0.158,1.028],[0,0]],"o":[[1.626,3.1],[0,0],[0.626,-1.192],[0,0],[-0.158,1.028]],"v":[[-5.479,-0.218],[-0.001,3.652],[5.48,-0.218],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.01,190.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.036],[0,0],[1.358,0.038],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.036],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,185.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".yellow200","cl":"yellow200","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.273,-62.792],[10.273,-19.932],[5.308,43.982],[3.529,62.792]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.691,67.791],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.845,50.02],[-43.615,20.333],[-43.615,-21.96],[-34.261,-28.874],[-24.095,-28.874],[-16.368,-34.974],[-1.728,-31.72],[1.931,-37.821],[7.218,-34.567],[23.079,-42.293],[55.331,-42.293],[69.845,-50.02]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[373.948,242.314],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-113.972,-119.335],[-113.972,-89.146],[-110.288,-76.336],[-118.014,-57.426],[-110.288,-39.939],[-93.615,-15.54],[-81.414,-1.306],[-84.668,17.808],[-75.721,29.193],[-63.521,36.921],[-49.288,39.36],[-41.968,48.714],[-28.954,48.714],[-17.568,53.594],[-2.115,58.067],[5.205,65.794],[21.066,68.233],[51.972,97.107],[62.545,99.954],[75.559,99.954],[118.014,119.335]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.421,175.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-214.415,-10.167],[-193.269,2.034],[-180.255,2.034],[-172.122,4.88],[-161.548,-0.406],[-149.349,0.001],[-132.675,-7.32],[-126.575,-5.693],[-113.969,-10.167],[-96.075,-8.133],[-88.755,-2.643],[-80.215,-2.643],[-43.208,-2.643],[-22.062,-6.1],[-13.319,0.407],[-0.61,2.034],[17.384,-2.643],[35.278,-0.406],[50.731,2.034],[53.985,6.913],[73.912,4.88],[86.111,10.167],[114.578,10.167],[150.365,10.167],[159.311,4.88],[214.415,2.034]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[223.889,101.607],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.296,-34.933],[-152.296,-17.527],[-140.503,-1.668],[-129.523,3.62],[-129.523,10.94],[-120.577,15.413],[-117.729,22.327],[-88.449,34.933],[-76.251,30.867],[-68.117,23.953],[-38.43,27.207],[-25.417,28.833],[-7.93,24.767],[20.943,25.986],[31.924,29.24],[38.837,25.58],[51.443,25.58],[60.391,21.513],[86.01,18.667],[97.804,26.8],[152.297,26.393]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.103,105.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.757,-76.408],[21.757,-63.89],[13.214,-63.89],[-14.031,-38.677],[-19.724,-23.223],[-21.757,54.857],[-18.098,63.803],[-21.757,76.409]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,177.698],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.1,-42.533],[-37.413,-29.478],[-34.567,-20.938],[-28.873,-24.191],[-17.08,-23.378],[-5.693,-7.518],[12.2,-3.046],[18.3,5.495],[24.807,9.562],[38.227,11.594],[52.867,19.729],[62.525,21.355],[67.1,29.896],[67.1,42.533]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[160.753,59.919],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-139.893,-158.396],[-135.827,-143.349],[-95.566,-100.243],[-75.233,-93.736],[-51.646,-67.303],[-48.8,-54.29],[-35.38,-42.496],[-32.94,-22.57],[-24.807,-18.91],[-10.574,-14.844],[8.947,16.47],[58.56,53.477],[82.147,84.79],[102.074,96.99],[125.66,133.997],[139.893,142.536],[139.893,158.396]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.307,169.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey300","cl":"grey300","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.717,-1.007],[-31.717,1.007]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[287.883,119.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.365,-14.212],[-27.159,-14.715],[-22.239,-18.741],[-8.414,-18.741],[6.556,-19.629],[15.02,-18.202],[28.069,-14.212],[28.069,-5.406],[28.069,1.64],[28.069,10.949],[29.704,14.22],[35.239,16.731],[35.365,19.629]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[291.531,123.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-41.561,-23.371],[-37.444,-22.113],[-31.154,-25.384],[-26.499,-26.767],[-21.215,-28.151],[-18.196,-31.05],[-12.41,-31.528],[-8.761,-31.05],[-7.628,-28.906],[9.733,-22.113],[23.067,-5.129],[29.106,-0.14],[37.283,12.608],[40.931,21.004],[41.561,31.528]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[348.112,171.29],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.64,-38.155],[4.64,-8.29],[7.771,-2.101],[6.974,5.21],[2.462,11.432],[-0.966,22.989],[-7.771,38.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[251.527,139.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-19.621,11.458],[-23.788,-11.458],[23.788,-11.458]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.299,233.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-36.573,-3.452],[3.542,-3.452],[8.492,-1.858],[25.051,-3.452],[31.026,-2.655],[35.293,0.133],[36.573,2.352],[34.013,2.352],[32.887,3.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[297.973,269.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.691,-18.223],[-10.328,-18.734],[-5.207,-17.88],[1.281,-18.307],[18.009,-19.077],[25.691,-12.504],[22.789,-10.797],[14.168,0.47],[12.376,5.846],[8.45,13.615],[4.011,19.077]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[307.575,287.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[50.742,46.448],[51.669,43.468],[50.742,37.157],[55.148,32.302],[72.276,31.185],[72.276,5.64],[70.623,-1.526],[70.623,-40.523],[69.383,-42.865],[62.906,-43.554],[56.843,-42.865],[54.224,-44.381],[49.264,-44.381],[45.13,-46.448],[-72.276,-46.448]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[226.967,241.72],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-119.509,-44.611],[-97.824,-40.96],[-89.824,-34.688],[-72.741,-36.266],[-66.754,-33.154],[40.537,-34.971],[59.633,-38.882],[68.047,-38.882],[73.387,-37.306],[74.626,-33.154],[77.919,-31.804],[77.919,-26.232],[80.508,-24.928],[89.57,-21.215],[97.823,-16.038],[105.684,-14.257],[108.827,-8.431],[113.844,5.663],[119.508,8.884],[117.654,19.078],[110.284,25.092],[107.048,37.527],[104.562,44.612]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[278.637,267.243],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-51.352,2.509],[13.052,3.155],[35.386,-3.155],[51.352,-3.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.911,213.904],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[275.481,202.819],[275.481,222.082]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.805,-24.131],[-0.446,-14.804],[1.18,18.209],[-2.805,24.131]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[269.292,219.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.325,-7.523],[-4.713,-0.839],[5.806,-0.839],[16.325,7.523]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[261.745,182.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-52.188,-19.67],[-41.346,-24.51],[-9.628,-12.712],[5.098,-9.312],[20.956,-3.564],[26.135,-4.62],[34.719,-0.671],[41.671,4.326],[52.189,7.729],[46.039,15.452],[46.202,24.509]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[213.259,163.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[73.548,-6.19],[75.996,7.565],[69.525,24.299],[59.976,26.175],[53.504,28.441],[47.03,33.188],[47.03,39.488],[34.894,32.698],[26.767,21.986],[17.423,17.347],[-1.49,12.605],[-28.757,3.71],[-37.055,-16.252],[-66.354,-16.252],[-66.354,-18.782],[-69.801,-23.38],[-68.077,-26.092],[-70.654,-30.31],[-74.309,-30.31],[-75.996,-39.488]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[230.554,138.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-68.814,-67.689],[-33.186,-67.127],[-13.566,-64.287],[9.77,-52.647],[17.081,-46.04],[58.129,-44.971],[60.347,-29.873],[60.347,-12.806],[61.785,6.876],[59.395,9.068],[60.347,54.334],[65.44,54.334],[68.814,58.411],[63.612,63.472],[65.581,64.877],[63.612,67.689]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.756,235.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.636,-10.36],[-2.642,-10.95],[4.106,-13.762],[4.478,-12.242],[5.933,-6.307],[6.636,13.761]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[170.836,181.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.903,178.874],[176.77,178.874]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-46.11,-24.495],[-24.601,-24.495],[-18.978,-22.285],[10.012,-24.495],[26.288,-21.262],[39.924,-19.433],[46.11,-14.795],[41.028,24.495]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[194.482,197.586],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[163.403,74.086],[163.403,98.964]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.298,-13.017],[-2.298,-7.952],[0.038,-1.57],[0.038,13.017]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[138.776,74.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.094,-4.83],[-14.691,-5.955],[-13.004,-4.127],[-6.116,-5.041],[25.094,-5.041],[25.094,5.955]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[113.72,93.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-21.799,-26.171],[-21.799,13.635],[-20.774,20.008],[16.176,26.171],[21.799,24.503]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[143.443,79.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.626,74.857],[151.806,74.857]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[93.653,52.401],[93.653,94.366]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.723,-35.415],[-1.723,-14.469],[0.62,-12.953],[1.723,35.415]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[162.477,159.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.575,3.259],[-0.551,-3.259],[4.821,-3.259],[7.166,-1.191],[9.784,-1.191],[11.575,-3.259]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[155.932,166.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-4.489,-23.839],[-6.05,-13.917],[-7.841,-12.401],[-7.841,1.329],[-11.562,10.887],[-11.562,23.84],[11.562,23.84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[179.069,138.912],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey700","cl":"grey700","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.172,-14.163],[-87.624,-10.786],[-87.624,-7.25],[-91.245,-3.685],[-94.866,-5.154],[-98.486,-11.792],[-101.705,-10.384],[-105.729,-11.792],[-110.154,-14.163],[-116.994,-11.792],[-121.218,-5.355],[-119.247,-2.337],[-117.598,-2.337],[-116.19,1.083],[-110.959,2.286],[-107.137,3.899],[-97.49,3.899],[-97.49,10.725],[-88.428,11.544],[-86.819,19.59],[-68.714,22.205],[-62.64,26.027],[-55.235,33.068],[-45.78,31.79],[-35.723,31.79],[-22.848,31.79],[-17.818,34.678],[-3.957,38.5],[5.315,37.695],[13.563,34.678],[23.622,33.873],[46.757,36.891],[58.826,36.891],[67.678,33.068],[75.14,30.654],[87.996,32.666],[90.209,31.79],[108.313,29.649],[117.768,25.022],[130.243,25.424],[144.523,25.022],[148.34,20.596],[149.955,15.969],[148.34,10.725],[127.193,-42.264],[-25.865,-48.73],[-69.318,-44.784],[-72.134,-37.519],[-82.394,-31.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[308.06,59.651],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-53.521,-13.307],[-41.048,-20.863],[-32.801,-18.738],[-26.967,-20.863],[-15.902,-15.576],[-11.075,-15.576],[-11.075,-13.307],[4.818,-13.307],[6.83,-15.576],[17.29,-15.576],[20.308,-23.708],[24.532,-22.041],[35.194,-20.863],[45.454,-19.945],[47.264,-15.576],[52.695,-6.064],[46.459,23.708],[42.881,20.101],[34.646,17.883],[-4.626,17.883],[-13.177,20.101],[-23.946,20.101],[-30.387,15.26],[-38.835,16.264],[-49.296,17.271],[-56.009,14.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.974,127.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey800","cl":"grey800","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.851,0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[2.851,-0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-209.239,-23.701],[-197.204,-12.299],[-193.403,-15.149],[-193.403,-18.95],[-181.051,-21.801],[-177.251,-23.701],[-166.482,-23.701],[-157.931,-25.918],[-154.447,-25.918],[-135.761,-25.918],[-131.327,-25.918],[-124.36,-25.918],[-118.658,-25.918],[-110.424,-23.701],[-104.406,-19.108],[-98.389,-12.299],[-88.254,0.49],[-84.77,0],[-84.77,-6.282],[-81.92,-1.531],[-83.351,0],[-84.736,0.49],[-86.024,1.81],[-86.644,2.239],[-81.92,12.262],[-74.427,29.3],[-73.52,32.545],[-69.607,41.517],[-69.607,44.142],[-68.7,45.383],[-66.791,56.121],[-66.791,60.226],[-68.748,61.371],[-68.748,62.564],[-70.322,63.995],[-70.37,65.523],[-72.327,67.146],[-73.615,67.146],[-74.14,68.195],[-75.477,68.195],[-75.477,69.389],[-76.908,70.439],[-77.481,71.059],[-77.481,72.014],[-78.293,72.872],[-76.813,73.445],[-76.67,74.877],[-75.572,75.402],[-75.668,77.788],[-74.904,77.788],[-74.904,81.367],[-74.093,81.367],[-73.854,83.611],[-72.947,84.231],[-72.947,85.52],[-71.754,86.331],[-69.655,86.331],[-64.643,86.331],[-64.023,85.472],[-61.302,85.902],[-61.064,86.331],[-57.485,86.665],[-56.005,88.287],[-56.005,89.815],[-54.287,90.912],[-53.428,90.244],[-52.998,90.912],[-51.614,91.199],[-51.614,92.249],[-49.133,92.249],[-48.751,93.299],[-46.651,93.299],[-45.935,94.253],[-45.076,94.253],[-42.833,96.688],[-40.256,96.688],[-40.256,97.498],[-38.108,97.498],[-37.678,98.501],[-35.817,98.501],[-34.815,99.169],[-34.004,99.169],[-33.622,98.453],[-31.14,98.453],[-31.427,97.642],[-31.904,96.782],[-33.431,96.735],[-33.622,91.58],[-33.097,91.58],[-32.763,92.583],[-31.713,92.44],[-31.14,92.965],[-29.279,92.869],[-29.279,91.676],[-30.138,91.342],[-30.043,89.385],[-30.902,88.669],[-30.949,87.237],[-31.904,86.808],[-30.997,86.092],[-30.854,84.66],[-30.138,84.374],[-30.091,80.556],[-31.045,79.984],[-30.759,76.691],[-29.47,78.313],[-29.279,79.268],[-27.37,80.222],[-26.559,79.888],[-25.89,78.934],[-25.604,77.884],[-24.459,76.357],[-21.882,75.402],[-17.586,74.973],[-14.771,74.734],[-14.771,75.831],[-22.072,77.74],[-23.361,78.122],[-24.268,78.6],[-25.127,79.124],[-25.509,80.174],[-27.036,81.272],[-28.181,81.749],[-29.088,83.229],[-29.088,85.997],[-28.849,87.953],[-27.752,88.287],[-26.177,89.385],[-24.173,88.097],[-23.648,88.097],[-22.502,87.143],[-22.74,86.331],[-23.027,83.372],[-22.12,83.133],[-21.548,83.897],[-21.5,84.518],[-20.88,84.66],[-20.88,85.902],[-20.02,86.188],[-19.734,85.328],[-16.918,85.568],[-16.966,84.708],[-19.114,82.895],[-19.591,82.035],[-19.495,81.272],[-16.441,81.415],[-16.107,80.509],[-13.72,80.509],[-12.862,79.076],[-11.239,79.984],[-10.809,83.849],[-9.473,83.897],[-8.996,84.566],[-6.848,84.852],[-6.085,85.949],[-3.364,86.236],[-3.078,84.756],[-3.698,81.701],[-6.037,79.554],[-6.323,78.504],[-3.603,78.456],[-2.219,78.027],[-0.406,77.359],[0.549,77.74],[2.84,77.645],[4.94,77.645],[6.133,78.027],[8.567,78.6],[9.14,79.458],[11.096,79.458],[11.43,80.413],[13.149,80.413],[13.435,80.986],[14.628,81.033],[14.628,80.413],[15.868,79.936],[15.868,78.934],[16.346,81.272],[18.064,81.32],[18.064,80.222],[17.539,80.174],[17.539,78.074],[18.446,78.552],[19.973,80.031],[21.452,80.079],[21.452,82.704],[20.976,83.42],[20.976,84.518],[19.782,84.804],[19.83,85.71],[22.026,86.188],[22.884,86.999],[24.698,87.047],[25.414,87.953],[27.275,87.953],[30.855,87.953],[31.523,86.999],[32.764,87.047],[32.286,88.335],[31.761,88.956],[32.048,90.436],[36.915,90.818],[37.583,98.787],[39.97,102.366],[42.738,103.368],[44.552,106.185],[54.431,117.018],[58.582,120.216],[67.889,127.518],[73.711,130.429],[85.165,134.294],[88.458,136.013],[91.179,136.013],[97.717,142.026],[98.338,144.89],[104.494,147.849],[107.262,150],[211.975,150],[211.975,-151.69],[-210.962,-153.764]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,171.151],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".grey900","cl":"grey900","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,148.684],[206,148.684],[206,-148.684],[-206,-148.684]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.125490196078,0.129411764706,0.141176470588,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,172.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.34,0.34],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[300,300]},{"t":25,"s":[294,294]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.552941203117,0.670588254929,0.921568632126,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":25,"s":[6]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Pale Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[72,72,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Blue Circle Outlines","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":10,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[64.361,64.36,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[66.714,66.714,100]},{"t":45,"s":[208.333,208.333,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.829000016755,0.885999971278,0.955999995213,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[70]},{"t":21,"s":[100]}],"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0,0,0,1]},{"t":21,"s":[0.552941203117,0.670588254929,0.921568632126,1]}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[20]},{"t":21,"s":[50]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"CircleMatte 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Approximate_ON_DT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/PermissionController/res/raw-night/fine_loc_off.json b/PermissionController/res/raw-night/fine_loc_off.json
new file mode 100644
index 000000000..559cafa58
--- /dev/null
+++ b/PermissionController/res/raw-night/fine_loc_off.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Exact_OFF_DT","ddd":0,"assets":[{"id":"comp_0","nm":"Exact_OFF_DT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[102,102,100]},{"t":60,"s":[80,80,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Location Pointer Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[18.25,51.679,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.967,0.967,0.2],"y":[1,1,1]},"o":{"x":[0.499,0.499,0.4],"y":[0,0,0]},"t":24,"s":[54,54,100]},{"t":42,"s":[10,10,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.551,0],[0,-3.55],[3.55,0],[0,3.551]],"o":[[3.55,0],[0,3.551],[-3.551,0],[0,-3.55]],"v":[[0.001,-6.429],[6.428,-0.001],[0.001,6.429],[-6.428,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.249,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.952,0],[0,-9.951],[0,0],[0,13.5]],"o":[[-9.952,0],[0,13.5],[0,0],[0,-9.951]],"v":[[0,-25.715],[-18,-7.715],[0,25.715],[18,-7.715]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,25.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Location bottom Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[13.432,6.364,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.967,0.967,0.2],"y":[1,1,1]},"o":{"x":[0.499,0.499,0.4],"y":[0,0,0]},"t":24,"s":[54,54,100]},{"t":42,"s":[10,10,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Pins_Blue","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.201,-1.878],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.4,206.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.555,165.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.115,205.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[105.514,213.902],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.878],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.878],[0,-2.055]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.789,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,111.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.531,116.994],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.438,125.251],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.856,217.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Pins_Orange","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.703,137.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.744],[0,4.128],[3.303,-0.744]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[381.288,270.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,210.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.057],[-2.201,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.2,-1.878],[0,-2.057]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.754,184.962],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.575,115.565],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey300","cl":"grey300","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[65.394,-87.762],[21.956,-25.29],[-65.394,87.762]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[77.34,207.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-29.617,35.822],[12.473,-5.331],[29.618,-35.821]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[199.566,278.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.219,9.823],[8.218,-9.823]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[201.146,227.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-33.868,-25.038],[8.293,9.519],[33.867,25.038]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[209.364,226.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.167,15.54],[-19.167,-15.54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[119.548,75.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.23,5.545],[32.282,-5.545],[55.773,-5.545],[72.23,5.545]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[387.97,276.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.098,-157.973],[9.854,-43.904],[-9.854,53.949],[-8.736,83.862],[-3.121,157.973]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[393.327,169.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-82.146,-18.015],[-17.286,18.015],[82.146,18.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[364.737,26.721],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[142.734,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[108.816,73.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[105.449,70.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-61.089,79.79],[-10.563,22.215],[30.571,-28.773],[46.604,-61.512],[61.089,-79.79]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[197.779,251.592],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-181.176,-130.71],[-103.059,-67.44],[-30.743,-4.641],[-18.758,22.842],[23.397,30.81],[65.134,54.857],[89.912,66.865],[181.176,130.71]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[252.512,144.213],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-197.801,-135.93],[-169.578,-81.272],[-25.091,29.988],[22.053,51.34],[69.798,92.618],[93.582,100.74],[139.02,95.547],[197.801,135.931]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.942,149.433],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-43.312,-42.235],[22.43,13.494],[43.312,42.235]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[45.812,287.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.949,23.783],[-18.949,-23.783]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[109.621,305.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-161.26,59.553],[-73.09,134.19],[-18.949,92.406],[161.26,-134.191]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.76,147.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-170.929,-3.155],[-48.146,106.479],[7.347,155.978],[56.846,100.678],[93.971,24.495],[114.081,-34.03],[140.8,-83.029],[163.001,-98.674],[170.928,-155.978]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[176.522,171.15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128.003,-94.842],[128.003,94.842]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.569,230.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-143.858,-121.852],[-139.604,-101.518],[143.858,121.852]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[169.948,211.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-101.126,-61.295],[6.382,43.506],[25.329,50.08],[48.533,50.08],[101.126,61.295]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[339.523,72.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[75.549,33.199],[0.527,16.447],[-24.997,16.447],[-75.549,-33.199]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[358.139,131.247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[56.267,11.975],[-22.236,-5.401],[-51.24,-5.401],[-56.267,-11.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[381.289,156.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-23.396,-110.585],[23.396,-69.624],[14.115,-1.562],[14.115,110.585]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.625,214.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.301,-106.862],[-115.301,-91.911],[68.768,50.786],[98.546,63.161],[152.3,106.862]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.44,175.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[137.091,-155.846],[25.716,1.527],[6.767,17.403],[-27.65,61.101],[-76.956,108.281],[-137.091,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[205.333,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-56.46,-44.426],[56.46,44.426]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[221.768,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-157.626,-125.059],[157.625,125.059]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[276.914,138.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[128.583,-155.739],[-82.951,117.438],[-128.583,155.739]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[173.622,164.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.363,-155.846],[-123.363,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[149.452,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[119.688,-154.492],[-119.689,154.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.376,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[94.165,-121.947],[-94.165,121.948]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[102.853,137.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey700","cl":"grey700","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.871,-11.834],[12.775,-0.847],[2.691,11.834],[-12.775,-0.336]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.038,79.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.787,-24.613],[-37.505,-22.753],[-34.63,-21.167],[-31.031,-23.281],[-9.88,-6.238],[-12.139,-3.2],[24.52,24.613],[37.505,7.844],[1.732,-21.035],[3.318,-23.281],[1.924,-24.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.647,43.549],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.533,-30.467],[28.951,-30.467],[20.804,-26.143],[14.324,-20.586],[4.618,-16.81],[1.118,-16.23],[-6.173,-7.064],[-37.533,17.139],[-22.607,30.467],[8.069,1.113],[26.699,-16.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.984,247.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey800","cl":"grey800","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,150],[206,150],[206,-150],[-206,-150]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.234999997008,0.250999989229,0.263000009574,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.851,168.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Exact Light Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.082,57.55,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[48.646,48.646,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.66,0.66],"y":[0,0]},"t":0,"s":[294,294]},{"t":10,"s":[300,300]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.552941203117,0.670588254929,0.921568632126,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":0,"s":[6]},{"t":10,"s":[0]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,149,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.6],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.8],"y":[0,0,0]},"t":0,"s":[306,306,100]},{"t":45,"s":[240,240,100]}],"ix":6,"l":2}},"ao":0,"sw":117,"sh":98,"sc":"#a77b57","ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"CircleMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Exact_OFF_DT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[{"tm":91,"cm":"","dr":0}]} \ No newline at end of file
diff --git a/PermissionController/res/raw-night/fine_loc_on.json b/PermissionController/res/raw-night/fine_loc_on.json
new file mode 100644
index 000000000..7731d7548
--- /dev/null
+++ b/PermissionController/res/raw-night/fine_loc_on.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Exact_ON_DT","ddd":0,"assets":[{"id":"comp_0","nm":"Exact_ON_DT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[80,80,100]},{"t":60,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Location Pointer Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[18.25,51.679,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.552,0.552,0.667],"y":[1,1,1]},"o":{"x":[0.046,0.046,0.333],"y":[0,0,0]},"t":28,"s":[20,20,100]},{"i":{"x":[0.468,0.468,0.667],"y":[1,1,1]},"o":{"x":[0.441,0.441,0.333],"y":[0,0,0]},"t":42,"s":[58,58,100]},{"t":60,"s":[54,54,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.551,0],[0,-3.55],[3.55,0],[0,3.551]],"o":[[3.55,0],[0,3.551],[-3.551,0],[0,-3.55]],"v":[[0.001,-6.429],[6.428,-0.001],[0.001,6.429],[-6.428,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.249,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.952,0],[0,-9.951],[0,0],[0,13.5]],"o":[[-9.952,0],[0,13.5],[0,0],[0,-9.951]],"v":[[0,-25.715],[-18,-7.715],[0,25.715],[18,-7.715]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,25.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Location bottom Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[13.432,6.364,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":28,"s":[20,20,100]},{"t":41,"s":[54,54,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Pins_Blue","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.201,-1.878],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.4,206.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.555,165.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.115,205.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[105.514,213.902],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.878],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.878],[0,-2.055]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.789,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,111.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.531,116.994],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.438,125.251],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.616000007181,0.964999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.856,217.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Pins_Orange","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.703,137.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.744],[0,4.128],[3.303,-0.744]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[381.288,270.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,210.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.057],[-2.201,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.2,-1.878],[0,-2.057]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.754,184.962],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.575,115.565],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey300","cl":"grey300","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[65.394,-87.762],[21.956,-25.29],[-65.394,87.762]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[77.34,207.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-29.617,35.822],[12.473,-5.331],[29.618,-35.821]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[199.566,278.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.219,9.823],[8.218,-9.823]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[201.146,227.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-33.868,-25.038],[8.293,9.519],[33.867,25.038]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[209.364,226.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.167,15.54],[-19.167,-15.54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[119.548,75.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.23,5.545],[32.282,-5.545],[55.773,-5.545],[72.23,5.545]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[387.97,276.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.098,-157.973],[9.854,-43.904],[-9.854,53.949],[-8.736,83.862],[-3.121,157.973]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[393.327,169.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-82.146,-18.015],[-17.286,18.015],[82.146,18.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[364.737,26.721],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[142.734,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[108.816,73.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[105.449,70.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-61.089,79.79],[-10.563,22.215],[30.571,-28.773],[46.604,-61.512],[61.089,-79.79]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[197.779,251.592],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-181.176,-130.71],[-103.059,-67.44],[-30.743,-4.641],[-18.758,22.842],[23.397,30.81],[65.134,54.857],[89.912,66.865],[181.176,130.71]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[252.512,144.213],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-197.801,-135.93],[-169.578,-81.272],[-25.091,29.988],[22.053,51.34],[69.798,92.618],[93.582,100.74],[139.02,95.547],[197.801,135.931]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.942,149.433],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-43.312,-42.235],[22.43,13.494],[43.312,42.235]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[45.812,287.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.949,23.783],[-18.949,-23.783]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[109.621,305.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-161.26,59.553],[-73.09,134.19],[-18.949,92.406],[161.26,-134.191]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.76,147.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-170.929,-3.155],[-48.146,106.479],[7.347,155.978],[56.846,100.678],[93.971,24.495],[114.081,-34.03],[140.8,-83.029],[163.001,-98.674],[170.928,-155.978]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[176.522,171.15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128.003,-94.842],[128.003,94.842]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.569,230.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-143.858,-121.852],[-139.604,-101.518],[143.858,121.852]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[169.948,211.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-101.126,-61.295],[6.382,43.506],[25.329,50.08],[48.533,50.08],[101.126,61.295]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[339.523,72.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[75.549,33.199],[0.527,16.447],[-24.997,16.447],[-75.549,-33.199]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[358.139,131.247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[56.267,11.975],[-22.236,-5.401],[-51.24,-5.401],[-56.267,-11.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[381.289,156.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-23.396,-110.585],[23.396,-69.624],[14.115,-1.562],[14.115,110.585]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.625,214.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.301,-106.862],[-115.301,-91.911],[68.768,50.786],[98.546,63.161],[152.3,106.862]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.44,175.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[137.091,-155.846],[25.716,1.527],[6.767,17.403],[-27.65,61.101],[-76.956,108.281],[-137.091,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[205.333,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-56.46,-44.426],[56.46,44.426]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[221.768,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-157.626,-125.059],[157.625,125.059]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[276.914,138.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[128.583,-155.739],[-82.951,117.438],[-128.583,155.739]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[173.622,164.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.363,-155.846],[-123.363,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[149.452,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[119.688,-154.492],[-119.689,154.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.376,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[94.165,-121.947],[-94.165,121.948]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[102.853,137.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.927,-159.713],[-0.193,-105.055],[-1.741,54.527],[-7.927,159.714]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[344.164,173.216],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.143,-7.085],[10.143,7.085]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[89.154,175.08],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey700","cl":"grey700","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.871,-11.834],[12.775,-0.847],[2.691,11.834],[-12.775,-0.336]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.038,79.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.787,-24.613],[-37.505,-22.753],[-34.63,-21.167],[-31.031,-23.281],[-9.88,-6.238],[-12.139,-3.2],[24.52,24.613],[37.505,7.844],[1.732,-21.035],[3.318,-23.281],[1.924,-24.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.647,43.549],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.533,-30.467],[28.951,-30.467],[20.804,-26.143],[14.324,-20.586],[4.618,-16.81],[1.118,-16.23],[-6.173,-7.064],[-37.533,17.139],[-22.607,30.467],[8.069,1.113],[26.699,-16.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470588235,0.388235294118,0.407843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.984,247.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey800","cl":"grey800","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,150],[206,150],[206,-150],[-206,-150]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.234999997008,0.250999989229,0.263000009574,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.851,168.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Exact Light Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.082,57.55,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[48.646,48.646,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.34,0.34],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[300,300]},{"t":25,"s":[294,294]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.552941203117,0.670588254929,0.921568632126,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":25,"s":[6]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,149,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[240,240,100]},{"t":45,"s":[306,306,100]}],"ix":6,"l":2}},"ao":0,"sw":117,"sh":98,"sc":"#a77b57","ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"CircleMatte 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Exact_ON_DT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/PermissionController/res/raw/coarse_loc_off.json b/PermissionController/res/raw/coarse_loc_off.json
new file mode 100644
index 000000000..52927c852
--- /dev/null
+++ b/PermissionController/res/raw/coarse_loc_off.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Approximate_OFF_LT","ddd":0,"assets":[{"id":"comp_0","nm":"Approximate_OFF_LT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[62,62,100]},{"t":60,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Highway_Signs","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,67.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.48,-0.218],[-0.001,3.653],[5.479,-0.218],[5.999,-3.653],[-6,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.583,71.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,65.956],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,70.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.218],[0.001,3.653],[5.48,-0.218],[5.999,-3.653],[-5.999,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,74.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,68.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,222.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.217],[-0.001,3.653],[5.48,-0.217],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,226.283],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.038],[0,0],[0.292,-1.238],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.238]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,221.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.177]],"o":[[-0.042,0.177],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.276],[-6,0.275],[6,0.275],[5.894,-0.276]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,186.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.192],[0,0],[-1.626,3.1],[0.158,1.028],[0,0]],"o":[[1.626,3.1],[0,0],[0.626,-1.192],[0,0],[-0.158,1.028]],"v":[[-5.479,-0.218],[-0.001,3.652],[5.48,-0.218],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.01,190.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.036],[0,0],[1.358,0.038],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.036],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,185.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".yellow500","cl":"yellow500","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.273,-62.792],[10.273,-19.932],[5.308,43.982],[3.529,62.792]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.691,67.791],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.845,50.02],[-43.615,20.333],[-43.615,-21.96],[-34.261,-28.874],[-24.095,-28.874],[-16.368,-34.974],[-1.728,-31.72],[1.931,-37.821],[7.218,-34.567],[23.079,-42.293],[55.331,-42.293],[69.845,-50.02]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[373.948,242.314],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-113.972,-119.335],[-113.972,-89.146],[-110.288,-76.336],[-118.014,-57.426],[-110.288,-39.939],[-93.615,-15.54],[-81.414,-1.306],[-84.668,17.808],[-75.721,29.193],[-63.521,36.921],[-49.288,39.36],[-41.968,48.714],[-28.954,48.714],[-17.568,53.594],[-2.115,58.067],[5.205,65.794],[21.066,68.233],[51.972,97.107],[62.545,99.954],[75.559,99.954],[118.014,119.335]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.421,175.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-214.415,-10.167],[-193.269,2.034],[-180.255,2.034],[-172.122,4.88],[-161.548,-0.406],[-149.349,0.001],[-132.675,-7.32],[-126.575,-5.693],[-113.969,-10.167],[-96.075,-8.133],[-88.755,-2.643],[-80.215,-2.643],[-43.208,-2.643],[-22.062,-6.1],[-13.319,0.407],[-0.61,2.034],[17.384,-2.643],[35.278,-0.406],[50.731,2.034],[53.985,6.913],[73.912,4.88],[86.111,10.167],[114.578,10.167],[150.365,10.167],[159.311,4.88],[214.415,2.034]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[223.889,101.607],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.296,-34.933],[-152.296,-17.527],[-140.503,-1.668],[-129.523,3.62],[-129.523,10.94],[-120.577,15.413],[-117.729,22.327],[-88.449,34.933],[-76.251,30.867],[-68.117,23.953],[-38.43,27.207],[-25.417,28.833],[-7.93,24.767],[20.943,25.986],[31.924,29.24],[38.837,25.58],[51.443,25.58],[60.391,21.513],[86.01,18.667],[97.804,26.8],[152.297,26.393]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.103,105.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.757,-76.408],[21.757,-63.89],[13.214,-63.89],[-14.031,-38.677],[-19.724,-23.223],[-21.757,54.857],[-18.098,63.803],[-21.757,76.409]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,177.698],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.1,-42.533],[-37.413,-29.478],[-34.567,-20.938],[-28.873,-24.191],[-17.08,-23.378],[-5.693,-7.518],[12.2,-3.046],[18.3,5.495],[24.807,9.562],[38.227,11.594],[52.867,19.729],[62.525,21.355],[67.1,29.896],[67.1,42.533]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[160.753,59.919],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-139.893,-158.396],[-135.827,-143.349],[-95.566,-100.243],[-75.233,-93.736],[-51.646,-67.303],[-48.8,-54.29],[-35.38,-42.496],[-32.94,-22.57],[-24.807,-18.91],[-10.574,-14.844],[8.947,16.47],[58.56,53.477],[82.147,84.79],[102.074,96.99],[125.66,133.997],[139.893,142.536],[139.893,158.396]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.307,169.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey500","cl":"grey500","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.717,-1.007],[-31.717,1.007]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[287.883,119.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.365,-14.212],[-27.159,-14.715],[-22.239,-18.741],[-8.414,-18.741],[6.556,-19.629],[15.02,-18.202],[28.069,-14.212],[28.069,-5.406],[28.069,1.64],[28.069,10.949],[29.704,14.22],[35.239,16.731],[35.365,19.629]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[291.531,123.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-41.561,-23.371],[-37.444,-22.113],[-31.154,-25.384],[-26.499,-26.767],[-21.215,-28.151],[-18.196,-31.05],[-12.41,-31.528],[-8.761,-31.05],[-7.628,-28.906],[9.733,-22.113],[23.067,-5.129],[29.106,-0.14],[37.283,12.608],[40.931,21.004],[41.561,31.528]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[348.112,171.29],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.64,-38.155],[4.64,-8.29],[7.771,-2.101],[6.974,5.21],[2.462,11.432],[-0.966,22.989],[-7.771,38.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[251.527,139.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-19.621,11.458],[-23.788,-11.458],[23.788,-11.458]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.299,233.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-36.573,-3.452],[3.542,-3.452],[8.492,-1.858],[25.051,-3.452],[31.026,-2.655],[35.293,0.133],[36.573,2.352],[34.013,2.352],[32.887,3.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[297.973,269.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.691,-18.223],[-10.328,-18.734],[-5.207,-17.88],[1.281,-18.307],[18.009,-19.077],[25.691,-12.504],[22.789,-10.797],[14.168,0.47],[12.376,5.846],[8.45,13.615],[4.011,19.077]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[307.575,287.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[50.742,46.448],[51.669,43.468],[50.742,37.157],[55.148,32.302],[72.276,31.185],[72.276,5.64],[70.623,-1.526],[70.623,-40.523],[69.383,-42.865],[62.906,-43.554],[56.843,-42.865],[54.224,-44.381],[49.264,-44.381],[45.13,-46.448],[-72.276,-46.448]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[226.967,241.72],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-119.509,-44.611],[-97.824,-40.96],[-89.824,-34.688],[-72.741,-36.266],[-66.754,-33.154],[40.537,-34.971],[59.633,-38.882],[68.047,-38.882],[73.387,-37.306],[74.626,-33.154],[77.919,-31.804],[77.919,-26.232],[80.508,-24.928],[89.57,-21.215],[97.823,-16.038],[105.684,-14.257],[108.827,-8.431],[113.844,5.663],[119.508,8.884],[117.654,19.078],[110.284,25.092],[107.048,37.527],[104.562,44.612]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[278.637,267.243],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-51.352,2.509],[13.052,3.155],[35.386,-3.155],[51.352,-3.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.911,213.904],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[275.481,202.819],[275.481,222.082]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.805,-24.131],[-0.446,-14.804],[1.18,18.209],[-2.805,24.131]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[269.292,219.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.325,-7.523],[-4.713,-0.839],[5.806,-0.839],[16.325,7.523]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[261.745,182.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-52.188,-19.67],[-41.346,-24.51],[-9.628,-12.712],[5.098,-9.312],[20.956,-3.564],[26.135,-4.62],[34.719,-0.671],[41.671,4.326],[52.189,7.729],[46.039,15.452],[46.202,24.509]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[213.259,163.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[73.548,-6.19],[75.996,7.565],[69.525,24.299],[59.976,26.175],[53.504,28.441],[47.03,33.188],[47.03,39.488],[34.894,32.698],[26.767,21.986],[17.423,17.347],[-1.49,12.605],[-28.757,3.71],[-37.055,-16.252],[-66.354,-16.252],[-66.354,-18.782],[-69.801,-23.38],[-68.077,-26.092],[-70.654,-30.31],[-74.309,-30.31],[-75.996,-39.488]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[230.554,138.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-68.814,-67.689],[-33.186,-67.127],[-13.566,-64.287],[9.77,-52.647],[17.081,-46.04],[58.129,-44.971],[60.347,-29.873],[60.347,-12.806],[61.785,6.876],[59.395,9.068],[60.347,54.334],[65.44,54.334],[68.814,58.411],[63.612,63.472],[65.581,64.877],[63.612,67.689]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.756,235.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.636,-10.36],[-2.642,-10.95],[4.106,-13.762],[4.478,-12.242],[5.933,-6.307],[6.636,13.761]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[170.836,181.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.903,178.874],[176.77,178.874]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-46.11,-24.495],[-24.601,-24.495],[-18.978,-22.285],[10.012,-24.495],[26.288,-21.262],[39.924,-19.433],[46.11,-14.795],[41.028,24.495]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[194.482,197.586],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[163.403,74.086],[163.403,98.964]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.298,-13.017],[-2.298,-7.952],[0.038,-1.57],[0.038,13.017]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[138.776,74.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.094,-4.83],[-14.691,-5.955],[-13.004,-4.127],[-6.116,-5.041],[25.094,-5.041],[25.094,5.955]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[113.72,93.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-21.799,-26.171],[-21.799,13.635],[-20.774,20.008],[16.176,26.171],[21.799,24.503]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[143.443,79.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.626,74.857],[151.806,74.857]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[93.653,52.401],[93.653,94.366]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.723,-35.415],[-1.723,-14.469],[0.62,-12.953],[1.723,35.415]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[162.477,159.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.575,3.259],[-0.551,-3.259],[4.821,-3.259],[7.166,-1.191],[9.784,-1.191],[11.575,-3.259]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[155.932,166.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-4.489,-23.839],[-6.05,-13.917],[-7.841,-12.401],[-7.841,1.329],[-11.562,10.887],[-11.562,23.84],[11.562,23.84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[179.069,138.912],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".green100","cl":"green100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.172,-14.163],[-87.624,-10.786],[-87.624,-7.25],[-91.245,-3.685],[-94.866,-5.154],[-98.486,-11.792],[-101.705,-10.384],[-105.729,-11.792],[-110.154,-14.163],[-116.994,-11.792],[-121.218,-5.355],[-119.247,-2.337],[-117.598,-2.337],[-116.19,1.083],[-110.959,2.286],[-107.137,3.899],[-97.49,3.899],[-97.49,10.725],[-88.428,11.544],[-86.819,19.59],[-68.714,22.205],[-62.64,26.027],[-55.235,33.068],[-45.78,31.79],[-35.723,31.79],[-22.848,31.79],[-17.818,34.678],[-3.957,38.5],[5.315,37.695],[13.563,34.678],[23.622,33.873],[46.757,36.891],[58.826,36.891],[67.678,33.068],[75.14,30.654],[87.996,32.666],[90.209,31.79],[108.313,29.649],[117.768,25.022],[130.243,25.424],[144.523,25.022],[148.34,20.596],[149.955,15.969],[148.34,10.725],[127.193,-42.264],[-25.865,-48.73],[-69.318,-44.784],[-72.134,-37.519],[-82.394,-31.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[308.06,59.651],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-53.521,-13.307],[-41.048,-20.863],[-32.801,-18.738],[-26.967,-20.863],[-15.902,-15.576],[-11.075,-15.576],[-11.075,-13.307],[4.818,-13.307],[6.83,-15.576],[17.29,-15.576],[20.308,-23.708],[24.532,-22.041],[35.194,-20.863],[45.454,-19.945],[47.264,-15.576],[52.695,-6.064],[46.459,23.708],[42.881,20.101],[34.646,17.883],[-4.626,17.883],[-13.177,20.101],[-23.946,20.101],[-30.387,15.26],[-38.835,16.264],[-49.296,17.271],[-56.009,14.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.974,127.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey100","cl":"grey100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.851,0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[2.851,-0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-209.239,-23.701],[-197.204,-12.299],[-193.403,-15.149],[-193.403,-18.95],[-181.051,-21.801],[-177.251,-23.701],[-166.482,-23.701],[-157.931,-25.918],[-154.447,-25.918],[-135.761,-25.918],[-131.327,-25.918],[-124.36,-25.918],[-118.658,-25.918],[-110.424,-23.701],[-104.406,-19.108],[-98.389,-12.299],[-88.254,0.49],[-84.77,0],[-84.77,-6.282],[-81.92,-1.531],[-83.351,0],[-84.736,0.49],[-86.024,1.81],[-86.644,2.239],[-81.92,12.262],[-74.427,29.3],[-73.52,32.545],[-69.607,41.517],[-69.607,44.142],[-68.7,45.383],[-66.791,56.121],[-66.791,60.226],[-68.748,61.371],[-68.748,62.564],[-70.322,63.995],[-70.37,65.523],[-72.327,67.146],[-73.615,67.146],[-74.14,68.195],[-75.477,68.195],[-75.477,69.389],[-76.908,70.439],[-77.481,71.059],[-77.481,72.014],[-78.293,72.872],[-76.813,73.445],[-76.67,74.877],[-75.572,75.402],[-75.668,77.788],[-74.904,77.788],[-74.904,81.367],[-74.093,81.367],[-73.854,83.611],[-72.947,84.231],[-72.947,85.52],[-71.754,86.331],[-69.655,86.331],[-64.643,86.331],[-64.023,85.472],[-61.302,85.902],[-61.064,86.331],[-57.485,86.665],[-56.005,88.287],[-56.005,89.815],[-54.287,90.912],[-53.428,90.244],[-52.998,90.912],[-51.614,91.199],[-51.614,92.249],[-49.133,92.249],[-48.751,93.299],[-46.651,93.299],[-45.935,94.253],[-45.076,94.253],[-42.833,96.688],[-40.256,96.688],[-40.256,97.498],[-38.108,97.498],[-37.678,98.501],[-35.817,98.501],[-34.815,99.169],[-34.004,99.169],[-33.622,98.453],[-31.14,98.453],[-31.427,97.642],[-31.904,96.782],[-33.431,96.735],[-33.622,91.58],[-33.097,91.58],[-32.763,92.583],[-31.713,92.44],[-31.14,92.965],[-29.279,92.869],[-29.279,91.676],[-30.138,91.342],[-30.043,89.385],[-30.902,88.669],[-30.949,87.237],[-31.904,86.808],[-30.997,86.092],[-30.854,84.66],[-30.138,84.374],[-30.091,80.556],[-31.045,79.984],[-30.759,76.691],[-29.47,78.313],[-29.279,79.268],[-27.37,80.222],[-26.559,79.888],[-25.89,78.934],[-25.604,77.884],[-24.459,76.357],[-21.882,75.402],[-17.586,74.973],[-14.771,74.734],[-14.771,75.831],[-22.072,77.74],[-23.361,78.122],[-24.268,78.6],[-25.127,79.124],[-25.509,80.174],[-27.036,81.272],[-28.181,81.749],[-29.088,83.229],[-29.088,85.997],[-28.849,87.953],[-27.752,88.287],[-26.177,89.385],[-24.173,88.097],[-23.648,88.097],[-22.502,87.143],[-22.74,86.331],[-23.027,83.372],[-22.12,83.133],[-21.548,83.897],[-21.5,84.518],[-20.88,84.66],[-20.88,85.902],[-20.02,86.188],[-19.734,85.328],[-16.918,85.568],[-16.966,84.708],[-19.114,82.895],[-19.591,82.035],[-19.495,81.272],[-16.441,81.415],[-16.107,80.509],[-13.72,80.509],[-12.862,79.076],[-11.239,79.984],[-10.809,83.849],[-9.473,83.897],[-8.996,84.566],[-6.848,84.852],[-6.085,85.949],[-3.364,86.236],[-3.078,84.756],[-3.698,81.701],[-6.037,79.554],[-6.323,78.504],[-3.603,78.456],[-2.219,78.027],[-0.406,77.359],[0.549,77.74],[2.84,77.645],[4.94,77.645],[6.133,78.027],[8.567,78.6],[9.14,79.458],[11.096,79.458],[11.43,80.413],[13.149,80.413],[13.435,80.986],[14.628,81.033],[14.628,80.413],[15.868,79.936],[15.868,78.934],[16.346,81.272],[18.064,81.32],[18.064,80.222],[17.539,80.174],[17.539,78.074],[18.446,78.552],[19.973,80.031],[21.452,80.079],[21.452,82.704],[20.976,83.42],[20.976,84.518],[19.782,84.804],[19.83,85.71],[22.026,86.188],[22.884,86.999],[24.698,87.047],[25.414,87.953],[27.275,87.953],[30.855,87.953],[31.523,86.999],[32.764,87.047],[32.286,88.335],[31.761,88.956],[32.048,90.436],[36.915,90.818],[37.583,98.787],[39.97,102.366],[42.738,103.368],[44.552,106.185],[54.431,117.018],[58.582,120.216],[67.889,127.518],[73.711,130.429],[85.165,134.294],[88.458,136.013],[91.179,136.013],[97.717,142.026],[98.338,144.89],[104.494,147.849],[107.262,150],[211.975,150],[211.975,-151.69],[-210.962,-153.764]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.952941176471,0.956862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,171.151],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,148.684],[206,148.684],[206,-148.684],[-206,-148.684]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,172.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue900","cl":"blue900","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.66,0.66],"y":[0,0]},"t":0,"s":[294,294]},{"t":10,"s":[300,300]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":0,"s":[6]},{"t":10,"s":[0]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".blue900","cl":"blue900","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"t":20,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[64.361,64.36,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[150,150,100]},{"t":45,"s":[48.034,48.034,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.829000016755,0.885999971278,0.955999995213,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[100]},{"t":32,"s":[70]}],"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[50]},{"t":32,"s":[20]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"CircleMatte 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Approximate_OFF_LT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[{"tm":91,"cm":"","dr":0}]} \ No newline at end of file
diff --git a/PermissionController/res/raw/coarse_loc_on.json b/PermissionController/res/raw/coarse_loc_on.json
new file mode 100644
index 000000000..2be289c67
--- /dev/null
+++ b/PermissionController/res/raw/coarse_loc_on.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Approximate_ON_LT","ddd":0,"assets":[{"id":"comp_0","nm":"Approximate_ON_LT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[90,90,100]},{"t":60,"s":[62,62,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Highway_Signs","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,67.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.48,-0.218],[-0.001,3.653],[5.479,-0.218],[5.999,-3.653],[-6,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.583,71.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.584,65.956],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.19],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.19],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,70.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.218],[0.001,3.653],[5.48,-0.218],[5.999,-3.653],[-5.999,-3.653]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,74.086],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.037],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.037],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.129],[0,-1.046],[-2.496,0.129],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.904,68.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.176]],"o":[[-0.042,0.176],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.275],[-6,0.275],[6,0.275],[5.894,-0.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,222.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.193],[0,0],[-1.626,3.099],[0.158,1.029],[0,0]],"o":[[1.626,3.099],[0,0],[0.626,-1.193],[0,0],[-0.158,1.029]],"v":[[-5.479,-0.217],[-0.001,3.653],[5.48,-0.217],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,226.283],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.037],[0,0],[1.358,0.038],[0,0],[0.292,-1.238],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.037],[0,0],[0,0],[-0.292,-1.238]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,221.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.029,-0.191],[0,0],[0.041,0.177]],"o":[[-0.042,0.177],[0,0],[-0.03,-0.191],[0,0]],"v":[[-5.894,-0.276],[-6,0.275],[6,0.275],[5.894,-0.276]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.941000007181,0.995999983245,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,186.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.626,-1.192],[0,0],[-1.626,3.1],[0.158,1.028],[0,0]],"o":[[1.626,3.1],[0,0],[0.626,-1.192],[0,0],[-0.158,1.028]],"v":[[-5.479,-0.218],[-0.001,3.652],[5.48,-0.218],[5.999,-3.652],[-5.999,-3.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258999992819,0.522000002394,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.01,190.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.321,-0.036],[0,0],[1.358,0.038],[0,0],[0.292,-1.237],[0,0]],"o":[[0,0],[-1.358,0.038],[0,0],[-1.321,-0.036],[0,0],[0,0],[-0.292,-1.237]],"v":[[5.065,-1.046],[2.496,0.128],[0,-1.046],[-2.496,0.128],[-5.065,-1.046],[-5.894,1.046],[5.894,1.046]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917999985639,0.263000009574,0.20800000359,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.011,185.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".yellow500","cl":"yellow500","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-10.273,-62.792],[10.273,-19.932],[5.308,43.982],[3.529,62.792]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.691,67.791],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.845,50.02],[-43.615,20.333],[-43.615,-21.96],[-34.261,-28.874],[-24.095,-28.874],[-16.368,-34.974],[-1.728,-31.72],[1.931,-37.821],[7.218,-34.567],[23.079,-42.293],[55.331,-42.293],[69.845,-50.02]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[373.948,242.314],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-113.972,-119.335],[-113.972,-89.146],[-110.288,-76.336],[-118.014,-57.426],[-110.288,-39.939],[-93.615,-15.54],[-81.414,-1.306],[-84.668,17.808],[-75.721,29.193],[-63.521,36.921],[-49.288,39.36],[-41.968,48.714],[-28.954,48.714],[-17.568,53.594],[-2.115,58.067],[5.205,65.794],[21.066,68.233],[51.972,97.107],[62.545,99.954],[75.559,99.954],[118.014,119.335]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.421,175.3],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-214.415,-10.167],[-193.269,2.034],[-180.255,2.034],[-172.122,4.88],[-161.548,-0.406],[-149.349,0.001],[-132.675,-7.32],[-126.575,-5.693],[-113.969,-10.167],[-96.075,-8.133],[-88.755,-2.643],[-80.215,-2.643],[-43.208,-2.643],[-22.062,-6.1],[-13.319,0.407],[-0.61,2.034],[17.384,-2.643],[35.278,-0.406],[50.731,2.034],[53.985,6.913],[73.912,4.88],[86.111,10.167],[114.578,10.167],[150.365,10.167],[159.311,4.88],[214.415,2.034]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[223.889,101.607],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.296,-34.933],[-152.296,-17.527],[-140.503,-1.668],[-129.523,3.62],[-129.523,10.94],[-120.577,15.413],[-117.729,22.327],[-88.449,34.933],[-76.251,30.867],[-68.117,23.953],[-38.43,27.207],[-25.417,28.833],[-7.93,24.767],[20.943,25.986],[31.924,29.24],[38.837,25.58],[51.443,25.58],[60.391,21.513],[86.01,18.667],[97.804,26.8],[152.297,26.393]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[304.103,105.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.757,-76.408],[21.757,-63.89],[13.214,-63.89],[-14.031,-38.677],[-19.724,-23.223],[-21.757,54.857],[-18.098,63.803],[-21.757,76.409]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[210.57,177.698],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.1,-42.533],[-37.413,-29.478],[-34.567,-20.938],[-28.873,-24.191],[-17.08,-23.378],[-5.693,-7.518],[12.2,-3.046],[18.3,5.495],[24.807,9.562],[38.227,11.594],[52.867,19.729],[62.525,21.355],[67.1,29.896],[67.1,42.533]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[160.753,59.919],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-139.893,-158.396],[-135.827,-143.349],[-95.566,-100.243],[-75.233,-93.736],[-51.646,-67.303],[-48.8,-54.29],[-35.38,-42.496],[-32.94,-22.57],[-24.807,-18.91],[-10.574,-14.844],[8.947,16.47],[58.56,53.477],[82.147,84.79],[102.074,96.99],[125.66,133.997],[139.893,142.536],[139.893,158.396]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,0.737254901961,0.01568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.307,169.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey500","cl":"grey500","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31.717,-1.007],[-31.717,1.007]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[287.883,119.11],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.365,-14.212],[-27.159,-14.715],[-22.239,-18.741],[-8.414,-18.741],[6.556,-19.629],[15.02,-18.202],[28.069,-14.212],[28.069,-5.406],[28.069,1.64],[28.069,10.949],[29.704,14.22],[35.239,16.731],[35.365,19.629]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[291.531,123.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-41.561,-23.371],[-37.444,-22.113],[-31.154,-25.384],[-26.499,-26.767],[-21.215,-28.151],[-18.196,-31.05],[-12.41,-31.528],[-8.761,-31.05],[-7.628,-28.906],[9.733,-22.113],[23.067,-5.129],[29.106,-0.14],[37.283,12.608],[40.931,21.004],[41.561,31.528]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[348.112,171.29],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.64,-38.155],[4.64,-8.29],[7.771,-2.101],[6.974,5.21],[2.462,11.432],[-0.966,22.989],[-7.771,38.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[251.527,139.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-19.621,11.458],[-23.788,-11.458],[23.788,-11.458]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[259.299,233.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-36.573,-3.452],[3.542,-3.452],[8.492,-1.858],[25.051,-3.452],[31.026,-2.655],[35.293,0.133],[36.573,2.352],[34.013,2.352],[32.887,3.451]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[297.973,269.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.691,-18.223],[-10.328,-18.734],[-5.207,-17.88],[1.281,-18.307],[18.009,-19.077],[25.691,-12.504],[22.789,-10.797],[14.168,0.47],[12.376,5.846],[8.45,13.615],[4.011,19.077]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[307.575,287.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[50.742,46.448],[51.669,43.468],[50.742,37.157],[55.148,32.302],[72.276,31.185],[72.276,5.64],[70.623,-1.526],[70.623,-40.523],[69.383,-42.865],[62.906,-43.554],[56.843,-42.865],[54.224,-44.381],[49.264,-44.381],[45.13,-46.448],[-72.276,-46.448]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[226.967,241.72],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-119.509,-44.611],[-97.824,-40.96],[-89.824,-34.688],[-72.741,-36.266],[-66.754,-33.154],[40.537,-34.971],[59.633,-38.882],[68.047,-38.882],[73.387,-37.306],[74.626,-33.154],[77.919,-31.804],[77.919,-26.232],[80.508,-24.928],[89.57,-21.215],[97.823,-16.038],[105.684,-14.257],[108.827,-8.431],[113.844,5.663],[119.508,8.884],[117.654,19.078],[110.284,25.092],[107.048,37.527],[104.562,44.612]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[278.637,267.243],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-51.352,2.509],[13.052,3.155],[35.386,-3.155],[51.352,-3.155]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.911,213.904],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[275.481,202.819],[275.481,222.082]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.805,-24.131],[-0.446,-14.804],[1.18,18.209],[-2.805,24.131]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[269.292,219.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-16.325,-7.523],[-4.713,-0.839],[5.806,-0.839],[16.325,7.523]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[261.745,182.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-52.188,-19.67],[-41.346,-24.51],[-9.628,-12.712],[5.098,-9.312],[20.956,-3.564],[26.135,-4.62],[34.719,-0.671],[41.671,4.326],[52.189,7.729],[46.039,15.452],[46.202,24.509]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[213.259,163.422],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[73.548,-6.19],[75.996,7.565],[69.525,24.299],[59.976,26.175],[53.504,28.441],[47.03,33.188],[47.03,39.488],[34.894,32.698],[26.767,21.986],[17.423,17.347],[-1.49,12.605],[-28.757,3.71],[-37.055,-16.252],[-66.354,-16.252],[-66.354,-18.782],[-69.801,-23.38],[-68.077,-26.092],[-70.654,-30.31],[-74.309,-30.31],[-75.996,-39.488]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[230.554,138.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-68.814,-67.689],[-33.186,-67.127],[-13.566,-64.287],[9.77,-52.647],[17.081,-46.04],[58.129,-44.971],[60.347,-29.873],[60.347,-12.806],[61.785,6.876],[59.395,9.068],[60.347,54.334],[65.44,54.334],[68.814,58.411],[63.612,63.472],[65.581,64.877],[63.612,67.689]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[243.756,235.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.636,-10.36],[-2.642,-10.95],[4.106,-13.762],[4.478,-12.242],[5.933,-6.307],[6.636,13.761]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[170.836,181.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.903,178.874],[176.77,178.874]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-46.11,-24.495],[-24.601,-24.495],[-18.978,-22.285],[10.012,-24.495],[26.288,-21.262],[39.924,-19.433],[46.11,-14.795],[41.028,24.495]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[194.482,197.586],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[163.403,74.086],[163.403,98.964]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[2.298,-13.017],[-2.298,-7.952],[0.038,-1.57],[0.038,13.017]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[138.776,74.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-25.094,-4.83],[-14.691,-5.955],[-13.004,-4.127],[-6.116,-5.041],[25.094,-5.041],[25.094,5.955]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[113.72,93.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-21.799,-26.171],[-21.799,13.635],[-20.774,20.008],[16.176,26.171],[21.799,24.503]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[143.443,79.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.626,74.857],[151.806,74.857]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[93.653,52.401],[93.653,94.366]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.723,-35.415],[-1.723,-14.469],[0.62,-12.953],[1.723,35.415]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[162.477,159.858],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.575,3.259],[-0.551,-3.259],[4.821,-3.259],[7.166,-1.191],[9.784,-1.191],[11.575,-3.259]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[155.932,166.01],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-4.489,-23.839],[-6.05,-13.917],[-7.841,-12.401],[-7.841,1.329],[-11.562,10.887],[-11.562,23.84],[11.562,23.84]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[179.069,138.912],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".green100","cl":"green100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.172,-14.163],[-87.624,-10.786],[-87.624,-7.25],[-91.245,-3.685],[-94.866,-5.154],[-98.486,-11.792],[-101.705,-10.384],[-105.729,-11.792],[-110.154,-14.163],[-116.994,-11.792],[-121.218,-5.355],[-119.247,-2.337],[-117.598,-2.337],[-116.19,1.083],[-110.959,2.286],[-107.137,3.899],[-97.49,3.899],[-97.49,10.725],[-88.428,11.544],[-86.819,19.59],[-68.714,22.205],[-62.64,26.027],[-55.235,33.068],[-45.78,31.79],[-35.723,31.79],[-22.848,31.79],[-17.818,34.678],[-3.957,38.5],[5.315,37.695],[13.563,34.678],[23.622,33.873],[46.757,36.891],[58.826,36.891],[67.678,33.068],[75.14,30.654],[87.996,32.666],[90.209,31.79],[108.313,29.649],[117.768,25.022],[130.243,25.424],[144.523,25.022],[148.34,20.596],[149.955,15.969],[148.34,10.725],[127.193,-42.264],[-25.865,-48.73],[-69.318,-44.784],[-72.134,-37.519],[-82.394,-31.305]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[308.06,59.651],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-53.521,-13.307],[-41.048,-20.863],[-32.801,-18.738],[-26.967,-20.863],[-15.902,-15.576],[-11.075,-15.576],[-11.075,-13.307],[4.818,-13.307],[6.83,-15.576],[17.29,-15.576],[20.308,-23.708],[24.532,-22.041],[35.194,-20.863],[45.454,-19.945],[47.264,-15.576],[52.695,-6.064],[46.459,23.708],[42.881,20.101],[34.646,17.883],[-4.626,17.883],[-13.177,20.101],[-23.946,20.101],[-30.387,15.26],[-38.835,16.264],[-49.296,17.271],[-56.009,14.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.974,127.35],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".grey100","cl":"grey100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.851,0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[2.851,-0.95],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-209.239,-23.701],[-197.204,-12.299],[-193.403,-15.149],[-193.403,-18.95],[-181.051,-21.801],[-177.251,-23.701],[-166.482,-23.701],[-157.931,-25.918],[-154.447,-25.918],[-135.761,-25.918],[-131.327,-25.918],[-124.36,-25.918],[-118.658,-25.918],[-110.424,-23.701],[-104.406,-19.108],[-98.389,-12.299],[-88.254,0.49],[-84.77,0],[-84.77,-6.282],[-81.92,-1.531],[-83.351,0],[-84.736,0.49],[-86.024,1.81],[-86.644,2.239],[-81.92,12.262],[-74.427,29.3],[-73.52,32.545],[-69.607,41.517],[-69.607,44.142],[-68.7,45.383],[-66.791,56.121],[-66.791,60.226],[-68.748,61.371],[-68.748,62.564],[-70.322,63.995],[-70.37,65.523],[-72.327,67.146],[-73.615,67.146],[-74.14,68.195],[-75.477,68.195],[-75.477,69.389],[-76.908,70.439],[-77.481,71.059],[-77.481,72.014],[-78.293,72.872],[-76.813,73.445],[-76.67,74.877],[-75.572,75.402],[-75.668,77.788],[-74.904,77.788],[-74.904,81.367],[-74.093,81.367],[-73.854,83.611],[-72.947,84.231],[-72.947,85.52],[-71.754,86.331],[-69.655,86.331],[-64.643,86.331],[-64.023,85.472],[-61.302,85.902],[-61.064,86.331],[-57.485,86.665],[-56.005,88.287],[-56.005,89.815],[-54.287,90.912],[-53.428,90.244],[-52.998,90.912],[-51.614,91.199],[-51.614,92.249],[-49.133,92.249],[-48.751,93.299],[-46.651,93.299],[-45.935,94.253],[-45.076,94.253],[-42.833,96.688],[-40.256,96.688],[-40.256,97.498],[-38.108,97.498],[-37.678,98.501],[-35.817,98.501],[-34.815,99.169],[-34.004,99.169],[-33.622,98.453],[-31.14,98.453],[-31.427,97.642],[-31.904,96.782],[-33.431,96.735],[-33.622,91.58],[-33.097,91.58],[-32.763,92.583],[-31.713,92.44],[-31.14,92.965],[-29.279,92.869],[-29.279,91.676],[-30.138,91.342],[-30.043,89.385],[-30.902,88.669],[-30.949,87.237],[-31.904,86.808],[-30.997,86.092],[-30.854,84.66],[-30.138,84.374],[-30.091,80.556],[-31.045,79.984],[-30.759,76.691],[-29.47,78.313],[-29.279,79.268],[-27.37,80.222],[-26.559,79.888],[-25.89,78.934],[-25.604,77.884],[-24.459,76.357],[-21.882,75.402],[-17.586,74.973],[-14.771,74.734],[-14.771,75.831],[-22.072,77.74],[-23.361,78.122],[-24.268,78.6],[-25.127,79.124],[-25.509,80.174],[-27.036,81.272],[-28.181,81.749],[-29.088,83.229],[-29.088,85.997],[-28.849,87.953],[-27.752,88.287],[-26.177,89.385],[-24.173,88.097],[-23.648,88.097],[-22.502,87.143],[-22.74,86.331],[-23.027,83.372],[-22.12,83.133],[-21.548,83.897],[-21.5,84.518],[-20.88,84.66],[-20.88,85.902],[-20.02,86.188],[-19.734,85.328],[-16.918,85.568],[-16.966,84.708],[-19.114,82.895],[-19.591,82.035],[-19.495,81.272],[-16.441,81.415],[-16.107,80.509],[-13.72,80.509],[-12.862,79.076],[-11.239,79.984],[-10.809,83.849],[-9.473,83.897],[-8.996,84.566],[-6.848,84.852],[-6.085,85.949],[-3.364,86.236],[-3.078,84.756],[-3.698,81.701],[-6.037,79.554],[-6.323,78.504],[-3.603,78.456],[-2.219,78.027],[-0.406,77.359],[0.549,77.74],[2.84,77.645],[4.94,77.645],[6.133,78.027],[8.567,78.6],[9.14,79.458],[11.096,79.458],[11.43,80.413],[13.149,80.413],[13.435,80.986],[14.628,81.033],[14.628,80.413],[15.868,79.936],[15.868,78.934],[16.346,81.272],[18.064,81.32],[18.064,80.222],[17.539,80.174],[17.539,78.074],[18.446,78.552],[19.973,80.031],[21.452,80.079],[21.452,82.704],[20.976,83.42],[20.976,84.518],[19.782,84.804],[19.83,85.71],[22.026,86.188],[22.884,86.999],[24.698,87.047],[25.414,87.953],[27.275,87.953],[30.855,87.953],[31.523,86.999],[32.764,87.047],[32.286,88.335],[31.761,88.956],[32.048,90.436],[36.915,90.818],[37.583,98.787],[39.97,102.366],[42.738,103.368],[44.552,106.185],[54.431,117.018],[58.582,120.216],[67.889,127.518],[73.711,130.429],[85.165,134.294],[88.458,136.013],[91.179,136.013],[97.717,142.026],[98.338,144.89],[104.494,147.849],[107.262,150],[211.975,150],[211.975,-151.69],[-210.962,-153.764]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.952941176471,0.956862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,171.151],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[57.694,49,0],"ix":2,"l":2},"a":{"a":0,"k":[232.123,166.357,0],"ix":1,"l":2},"s":{"a":0,"k":[79.922,79.922,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,148.684],[206,148.684],[206,-148.684],[-206,-148.684]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223.279,172.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue900","cl":"blue900","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.34,0.34],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[300,300]},{"t":25,"s":[294,294]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":25,"s":[6]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Pale Orange Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[206,150,0],"ix":1,"l":2},"s":{"a":0,"k":[72,72,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Blue Circle Outlines","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":10,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[64.361,64.36,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[66.714,66.714,100]},{"t":45,"s":[208.333,208.333,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.829000016755,0.885999971278,0.955999995213,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[70]},{"t":21,"s":[100]}],"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.164],[34.165,0],[0,34.165],[-34.165,0]],"o":[[0,34.165],[-34.165,0],[0,-34.164],[34.165,0]],"v":[[61.861,-0.001],[0,61.861],[-61.861,-0.001],[0,-61.861]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0,0,0,1]},{"t":21,"s":[0.552941203117,0.670588254929,0.921568632126,1]}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[20]},{"t":21,"s":[50]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.361,64.361],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"CircleMatte 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Approximate_ON_LT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/PermissionController/res/raw/fine_loc_off.json b/PermissionController/res/raw/fine_loc_off.json
new file mode 100644
index 000000000..3aa81bab5
--- /dev/null
+++ b/PermissionController/res/raw/fine_loc_off.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Exact_OFF_LT","ddd":0,"assets":[{"id":"comp_0","nm":"Exact_OFF_LT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[102,102,100]},{"t":60,"s":[80,80,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Location Pointer Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[18.25,51.679,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.967,0.967,0.2],"y":[1,1,1]},"o":{"x":[0.499,0.499,0.4],"y":[0,0,0]},"t":24,"s":[54,54,100]},{"t":42,"s":[10,10,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.551,0],[0,-3.55],[3.55,0],[0,3.551]],"o":[[3.55,0],[0,3.551],[-3.551,0],[0,-3.55]],"v":[[0.001,-6.429],[6.428,-0.001],[0.001,6.429],[-6.428,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.249,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.952,0],[0,-9.951],[0,0],[0,13.5]],"o":[[-9.952,0],[0,13.5],[0,0],[0,-9.951]],"v":[[0,-25.715],[-18,-7.715],[0,25.715],[18,-7.715]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196080506,0.305882364511,0.65098041296,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,25.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Location bottom Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[13.432,6.364,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.967,0.967,0.2],"y":[1,1,1]},"o":{"x":[0.499,0.499,0.4],"y":[0,0,0]},"t":24,"s":[54,54,100]},{"t":42,"s":[10,10,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue900","cl":"blue900","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.201,-1.878],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.4,206.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.555,165.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.115,205.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[105.514,213.902],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.878],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.878],[0,-2.055]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.789,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,111.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.531,116.994],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.438,125.251],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.856,217.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Pins_Orange","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.703,137.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.744],[0,4.128],[3.303,-0.744]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[381.288,270.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,210.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.057],[-2.201,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.2,-1.878],[0,-2.057]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.754,184.962],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.575,115.565],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey500","cl":"grey500","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[65.394,-87.762],[21.956,-25.29],[-65.394,87.762]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[77.34,207.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-29.617,35.822],[12.473,-5.331],[29.618,-35.821]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[199.566,278.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.219,9.823],[8.218,-9.823]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[201.146,227.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-33.868,-25.038],[8.293,9.519],[33.867,25.038]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[209.364,226.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.167,15.54],[-19.167,-15.54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[119.548,75.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.23,5.545],[32.282,-5.545],[55.773,-5.545],[72.23,5.545]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[387.97,276.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.098,-157.973],[9.854,-43.904],[-9.854,53.949],[-8.736,83.862],[-3.121,157.973]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[393.327,169.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-82.146,-18.015],[-17.286,18.015],[82.146,18.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[364.737,26.721],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[142.734,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[108.816,73.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[105.449,70.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-61.089,79.79],[-10.563,22.215],[30.571,-28.773],[46.604,-61.512],[61.089,-79.79]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[197.779,251.592],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-181.176,-130.71],[-103.059,-67.44],[-30.743,-4.641],[-18.758,22.842],[23.397,30.81],[65.134,54.857],[89.912,66.865],[181.176,130.71]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[252.512,144.213],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-197.801,-135.93],[-169.578,-81.272],[-25.091,29.988],[22.053,51.34],[69.798,92.618],[93.582,100.74],[139.02,95.547],[197.801,135.931]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.942,149.433],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-43.312,-42.235],[22.43,13.494],[43.312,42.235]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[45.812,287.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.949,23.783],[-18.949,-23.783]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[109.621,305.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-161.26,59.553],[-73.09,134.19],[-18.949,92.406],[161.26,-134.191]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.76,147.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-170.929,-3.155],[-48.146,106.479],[7.347,155.978],[56.846,100.678],[93.971,24.495],[114.081,-34.03],[140.8,-83.029],[163.001,-98.674],[170.928,-155.978]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[176.522,171.15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128.003,-94.842],[128.003,94.842]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.569,230.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-143.858,-121.852],[-139.604,-101.518],[143.858,121.852]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[169.948,211.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-101.126,-61.295],[6.382,43.506],[25.329,50.08],[48.533,50.08],[101.126,61.295]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[339.523,72.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[75.549,33.199],[0.527,16.447],[-24.997,16.447],[-75.549,-33.199]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[358.139,131.247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[56.267,11.975],[-22.236,-5.401],[-51.24,-5.401],[-56.267,-11.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[381.289,156.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-23.396,-110.585],[23.396,-69.624],[14.115,-1.562],[14.115,110.585]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.625,214.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.301,-106.862],[-115.301,-91.911],[68.768,50.786],[98.546,63.161],[152.3,106.862]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.44,175.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[137.091,-155.846],[25.716,1.527],[6.767,17.403],[-27.65,61.101],[-76.956,108.281],[-137.091,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[205.333,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-56.46,-44.426],[56.46,44.426]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[221.768,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-157.626,-125.059],[157.625,125.059]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[276.914,138.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[128.583,-155.739],[-82.951,117.438],[-128.583,155.739]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[173.622,164.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.363,-155.846],[-123.363,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[149.452,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[119.688,-154.492],[-119.689,154.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.376,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[94.165,-121.947],[-94.165,121.948]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[102.853,137.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".green100","cl":"green100","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.871,-11.834],[12.775,-0.847],[2.691,11.834],[-12.775,-0.336]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.038,79.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.787,-24.613],[-37.505,-22.753],[-34.63,-21.167],[-31.031,-23.281],[-9.88,-6.238],[-12.139,-3.2],[24.52,24.613],[37.505,7.844],[1.732,-21.035],[3.318,-23.281],[1.924,-24.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.647,43.549],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.533,-30.467],[28.951,-30.467],[20.804,-26.143],[14.324,-20.586],[4.618,-16.81],[1.118,-16.23],[-6.173,-7.064],[-37.533,17.139],[-22.607,30.467],[8.069,1.113],[26.699,-16.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.984,247.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey100","cl":"grey100","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,150],[206,150],[206,-150],[-206,-150]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.952941176471,0.956862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.851,168.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Exact Light Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.082,57.55,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[48.646,48.646,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue900","cl":"blue900","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.66,0.66],"y":[0,0]},"t":0,"s":[294,294]},{"t":10,"s":[300,300]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":0,"s":[6]},{"t":10,"s":[0]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,149,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.6],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.8],"y":[0,0,0]},"t":0,"s":[306,306,100]},{"t":45,"s":[240,240,100]}],"ix":6,"l":2}},"ao":0,"sw":117,"sh":98,"sc":"#a77b57","ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"CircleMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Exact_OFF_LT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[{"tm":91,"cm":"","dr":0}]} \ No newline at end of file
diff --git a/PermissionController/res/raw/fine_loc_on.json b/PermissionController/res/raw/fine_loc_on.json
new file mode 100644
index 000000000..344942361
--- /dev/null
+++ b/PermissionController/res/raw/fine_loc_on.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":91,"w":300,"h":300,"nm":"Location_Accuracy_Exact_ON_LT","ddd":0,"assets":[{"id":"comp_0","nm":"Exact_ON_LT","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.5,49,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":15,"s":[80,80,100]},{"t":60,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Location Pointer Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[18.25,51.679,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.552,0.552,0.667],"y":[1,1,1]},"o":{"x":[0.046,0.046,0.333],"y":[0,0,0]},"t":28,"s":[20,20,100]},{"i":{"x":[0.468,0.468,0.667],"y":[1,1,1]},"o":{"x":[0.441,0.441,0.333],"y":[0,0,0]},"t":42,"s":[58,58,100]},{"t":60,"s":[54,54,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.551,0],[0,-3.55],[3.55,0],[0,3.551]],"o":[[3.55,0],[0,3.551],[-3.551,0],[0,-3.55]],"v":[[0.001,-6.429],[6.428,-0.001],[0.001,6.429],[-6.428,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.249,18.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.952,0],[0,-9.951],[0,0],[0,13.5]],"o":[[-9.952,0],[0,13.5],[0,0],[0,-9.951]],"v":[[0,-25.715],[-18,-7.715],[0,25.715],[18,-7.715]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196080506,0.305882364511,0.65098041296,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.25,25.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Location bottom Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[58.298,63.254,0],"ix":2,"l":2},"a":{"a":0,"k":[13.432,6.364,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.001,0.001,0.001],"y":[0,0,0]},"t":28,"s":[20,20,100]},{"t":41,"s":[54,54,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.135],[6.037,0],[0,2.134],[-6.038,0]],"o":[[0,2.134],[-6.038,0],[0,-2.135],[6.037,0]],"v":[[10.933,0],[0.001,3.863],[-10.933,0],[0.001,-3.863]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.432,6.364],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":28,"op":600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue900","cl":"blue900","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.201,-1.878],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.4,206.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.555,165.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.115,205.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[105.514,213.902],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.055],[-2.2,-1.878],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.878],[0,-2.055]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[171.789,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,111.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[281.531,116.994],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.055],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.055]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[312.438,125.251],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[329.856,217.762],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Pins_Orange","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.703,137.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.744],[0,4.128],[3.303,-0.744]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[381.288,270.794],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.2,-1.879],[0,1.371]],"o":[[-1.733,0],[0,1.371],[2.201,-1.879],[0,-2.056]],"v":[[0,-4.128],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[368.126,210.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.733,0],[0,-2.057],[-2.201,-1.878],[0,1.37]],"o":[[-1.734,0],[0,1.37],[2.2,-1.878],[0,-2.057]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.128],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[350.754,184.962],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.734,0],[0,-2.056],[-2.201,-1.879],[0,1.371]],"o":[[-1.734,0],[0,1.371],[2.2,-1.879],[0,-2.056]],"v":[[0,-4.129],[-3.303,-0.743],[0,4.129],[3.303,-0.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.948999980852,0.6,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.575,115.565],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey500","cl":"grey500","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[65.394,-87.762],[21.956,-25.29],[-65.394,87.762]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[77.34,207.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-29.617,35.822],[12.473,-5.331],[29.618,-35.821]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[199.566,278.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.219,9.823],[8.218,-9.823]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[201.146,227.853],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-33.868,-25.038],[8.293,9.519],[33.867,25.038]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[209.364,226.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[19.167,15.54],[-19.167,-15.54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[119.548,75.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.23,5.545],[32.282,-5.545],[55.773,-5.545],[72.23,5.545]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[387.97,276.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.098,-157.973],[9.854,-43.904],[-9.854,53.949],[-8.736,83.862],[-3.121,157.973]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[393.327,169.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-82.146,-18.015],[-17.286,18.015],[82.146,18.015]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[364.737,26.721],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[142.734,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[108.816,73.718],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.193,59.098],[50.193,-59.098]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[105.449,70.281],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-61.089,79.79],[-10.563,22.215],[30.571,-28.773],[46.604,-61.512],[61.089,-79.79]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[197.779,251.592],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-181.176,-130.71],[-103.059,-67.44],[-30.743,-4.641],[-18.758,22.842],[23.397,30.81],[65.134,54.857],[89.912,66.865],[181.176,130.71]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[252.512,144.213],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-197.801,-135.93],[-169.578,-81.272],[-25.091,29.988],[22.053,51.34],[69.798,92.618],[93.582,100.74],[139.02,95.547],[197.801,135.931]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[245.942,149.433],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-43.312,-42.235],[22.43,13.494],[43.312,42.235]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[45.812,287.214],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.949,23.783],[-18.949,-23.783]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[109.621,305.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-161.26,59.553],[-73.09,134.19],[-18.949,92.406],[161.26,-134.191]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.76,147.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-170.929,-3.155],[-48.146,106.479],[7.347,155.978],[56.846,100.678],[93.971,24.495],[114.081,-34.03],[140.8,-83.029],[163.001,-98.674],[170.928,-155.978]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[176.522,171.15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128.003,-94.842],[128.003,94.842]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.569,230.353],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-143.858,-121.852],[-139.604,-101.518],[143.858,121.852]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[169.948,211.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-101.126,-61.295],[6.382,43.506],[25.329,50.08],[48.533,50.08],[101.126,61.295]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[339.523,72.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[75.549,33.199],[0.527,16.447],[-24.997,16.447],[-75.549,-33.199]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[358.139,131.247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[56.267,11.975],[-22.236,-5.401],[-51.24,-5.401],[-56.267,-11.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[381.289,156.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-23.396,-110.585],[23.396,-69.624],[14.115,-1.562],[14.115,110.585]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[301.625,214.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.301,-106.862],[-115.301,-91.911],[68.768,50.786],[98.546,63.161],[152.3,106.862]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[163.44,175.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[137.091,-155.846],[25.716,1.527],[6.767,17.403],[-27.65,61.101],[-76.956,108.281],[-137.091,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[205.333,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-56.46,-44.426],[56.46,44.426]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[221.768,59.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-157.626,-125.059],[157.625,125.059]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[276.914,138.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[128.583,-155.739],[-82.951,117.438],[-128.583,155.739]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[173.622,164.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.363,-155.846],[-123.363,155.846]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[149.452,169.349],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[119.688,-154.492],[-119.689,154.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128.376,167.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[94.165,-121.947],[-94.165,121.948]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[102.853,137.12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.927,-159.713],[-0.193,-105.055],[-1.741,54.527],[-7.927,159.714]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[344.164,173.216],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.143,-7.085],[10.143,7.085]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.505882352941,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[89.154,175.08],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".green100","cl":"green100","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.871,-11.834],[12.775,-0.847],[2.691,11.834],[-12.775,-0.336]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[260.038,79.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-35.787,-24.613],[-37.505,-22.753],[-34.63,-21.167],[-31.031,-23.281],[-9.88,-6.238],[-12.139,-3.2],[24.52,24.613],[37.505,7.844],[1.732,-21.035],[3.318,-23.281],[1.924,-24.613]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.647,43.549],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.533,-30.467],[28.951,-30.467],[20.804,-26.143],[14.324,-20.586],[4.618,-16.81],[1.118,-16.23],[-6.173,-7.064],[-37.533,17.139],[-22.607,30.467],[8.069,1.113],[26.699,-16.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.917647058824,0.839215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.984,247.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".grey100","cl":"grey100","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[230.884,168.455,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-206,150],[206,150],[206,-150],[-206,-150]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.952941176471,0.956862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[220.851,168.936],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Exact Light Outlines","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.082,57.55,0],"ix":2,"l":2},"a":{"a":0,"k":[231.35,167.715,0],"ix":1,"l":2},"s":{"a":0,"k":[48.646,48.646,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue900","cl":"blue900","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101.086,101.086,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.34,0.34],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[300,300]},{"t":25,"s":[294,294]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.090196078431,0.305882352941,0.650980392157,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":25,"s":[6]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[98.741,98.741],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":1,"nm":"Scale Controller","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,149,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[240,240,100]},{"t":45,"s":[306,306,100]}],"ix":6,"l":2}},"ao":0,"sw":117,"sh":98,"sc":"#a77b57","ip":0,"op":585,"st":-15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"CircleMatte 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[82.705,0],[0,-82.705],[-82.705,0],[0,82.705]],"o":[[-82.705,0],[0,82.705],[82.705,0],[0,-82.705]],"v":[[-0.125,-149.938],[-149.875,-0.188],[-0.125,149.562],[149.625,-0.188]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":-1,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[15.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[228,150],[-238,150],[-266,122],[-266,-122],[-238,-150],[228,-150],[256,-122],[256,122]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Exact_ON_LT","tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[58.5,49,0],"ix":1,"l":2},"s":{"a":0,"k":[307.2,307.2,100],"ix":6,"l":2}},"ao":0,"w":117,"h":98,"ip":0,"op":585,"st":-15,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/PermissionController/res/values-af/strings.xml b/PermissionController/res/values-af/strings.xml
index 9f4b10a4b..fc436d0f2 100644
--- a/PermissionController/res/values-af/strings.xml
+++ b/PermissionController/res/values-af/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dag}other{# dae}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 uur}other{# uur}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min.}other{# min.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek.}other{# sek.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dag}other{# dae}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min.}other{# min.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek.}other{# sek.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Enige toestemming"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Enige tyd"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Afgelope 7 dae"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Afgelope 24 uur"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Afgelope 1 uur"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Afgelope 15 minute"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Afgelope 1 minuut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Afgelope # dag}other{Afgelope # dae}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Afgelope # uur}other{Afgelope # uur}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Afgelope # minuut}other{Afgelope # minute}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Geen toestemminggebruike nie"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Mees onlangse toegang in enige tydperk"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Mees onlangse toegang in afgelope 7 dae"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Toestemminggebruik in afgelope 1 uur"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Toestemminggebruik in afgelope 15 minute"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Toestemminggebruik in afgelope 1 minuut"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nie in die afgelope 24 uur gebruik nie"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nie in die afgelope 7 dae gebruik nie"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nie in die afgelope # dag gebruik nie}other{Nie in die afgelope # dae gebruik nie}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nie in die afgelope # uur gebruik nie}other{Nie in die afgelope # uur gebruik nie}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Gebruik deur 1 program}other{Gebruik deur # programme}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Sien alles in Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Gefiltreer volgens: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nie toegelaat nie"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Sien meer programme wat toegang tot alle lêers het"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dag}other{# dae}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 uur}other{# uur}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuut}other{# minute}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekonde}other{# sekondes}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuut}other{# minute}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekonde}other{# sekondes}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Toestemmingonthounotas"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ongebruikte program"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ongebruikte programme"</string>
diff --git a/PermissionController/res/values-am/strings.xml b/PermissionController/res/values-am/strings.xml
index 8bec4bc12..0250bdf2d 100644
--- a/PermissionController/res/values-am/strings.xml
+++ b/PermissionController/res/values-am/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ቀን}one{# ቀኖች}other{# ቀኖች}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ሰዓት}one{# ሰዓቶች}other{# ሰዓቶች}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ደቂቃ}one{# ደቂቃዎች}other{# ደቂቃዎች}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 ሴኮ}one{# ሰከንዶች}other{# ሰከንዶች}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ቀን}one{# ቀን}other{# ቀናት}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ሰዓት}one{# ሰዓት}other{# ሰዓታት}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# ደቂቃ}one{# ደቂቃ}other{# ደቂቃዎች}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ሰከንድ}one{# ሰከንድ}other{# ሰከንዶች}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ማናቸውም ፈቃድ"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"በማንኛውም ጊዜ"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ባለፉት 7 ቀኖች"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ባለፉት 24 ሰዓቶች"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"ባለፈው 1 ሰዓት"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ባለፉት 15 ደቂቃዎች"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ባለፈው 1 ደቂቃ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ያለፈው # ቀን}one{ያለፈው # ቀን}other{ያለፉት # ቀናት}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{ባለፈው # ሰዓት}one{ባለፈው # ሰዓት}other{ባለፉት # ሰዓታት}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ባለፈው # ደቂቃ}one{ባለፈው # ደቂቃ}other{ባለፉት # ደቂቃዎች}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ምንም ፈቃድ አጠቃቀሞች የሉም"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"በማናቸውም ጊዜ ያለ የቅርብ ጊዜ መዳረስ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ባለፉት 7 ቀናት በጣም የቅርብ ጊዜ መዳረስ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ባለፈው 1 ሰዓት የፈቃድ አጠቃቀም"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ባለፉት 15 ደቂቃዎች ውስጥ የፈቃድ አጠቃቀም"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ባለፈው 1 ደቂቃ የፈቃድ አጠቃቀም"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ባለፉት 24 ሰዓታት ውስጥ ስራ ላይ አልዋለም"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ባለፉት 7 ቀናት ውስጥ ስራ ላይ አልዋለም"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ባለፈው # ቀን ውስጥ ስራ ላይ አልዋለም}one{ባለፈው # ቀን ውስጥ ስራ ላይ አልዋለም}other{ባለፉት # ቀናት ውስጥ ስራ ላይ አልዋለም}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ባለፈው # ሰዓት ውስጥ ስራ ላይ አልዋለም}one{ባለፈው # ሰዓት ውስጥ ስራ ላይ አልዋለም}other{ባለፉት # ሰዓታት ውስጥ ስራ ላይ አልዋለም}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{በ1 መተግበሪያ ስራ ላይ ውሏል}one{በ# መተግበሪያዎች ስራ ላይ ውለዋል}other{በ# መተግበሪያዎች ስራ ላይ ውለዋል}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ሁሉንም በዳሽ ቦርድ ውስጥ ይመልከቱ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"የተጣራው በ፦ <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"አይፈቀድም"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ሁሉንም ፋይሎች መድረስ የሚችሉ ተጨማሪ መተግበሪያዎችን ይመልከቱ"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ቀን}one{# ቀኖች}other{# ቀኖች}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ሰዓት}one{# ሰዓቶች}other{# ሰዓቶች}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 ደቂቃ}one{# ደቂቃዎች}other{# ደቂቃዎች}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 ሰከንድ}one{# ሰከንዶች}other{# ሰከንዶች}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ሰዓት}one{# ሰዓት}other{# ሰዓታት}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# ደቂቃ}one{# ደቂቃ}other{# ደቂቃዎች}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ሰከንድ}one{# ሰከንድ}other{# ሰከንዶች}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"የፈቃድ አስታዋሾች"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ጥቅም ላይ ያልዋለ መተግበሪያ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ጥቅም ላይ ያልዋሉ መተግበሪያዎች"</string>
diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml
index d8e2d02ab..07c143352 100644
--- a/PermissionController/res/values-ar/strings.xml
+++ b/PermissionController/res/values-ar/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{يوم واحد}zero{# يوم}two{يومان}few{# أيام}many{# يومًا}other{# يوم}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان}few{# ساعات}many{# ساعةً}other{# ساعة}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{دقيقة واحدة}zero{# دقيقة}two{دقيقتان}few{# دقائق}many{# دقيقةً}other{# دقيقة}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{ثانية واحدة}zero{# ثانية}two{ثانيتان}few{# ثوانٍ}many{# ثانيةً}other{# ثانية}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{يوم واحد}zero{# يوم}two{يومان}few{# أيام}many{# يومًا}other{# يوم}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان}few{# ساعات}many{# ساعةً}other{# ساعة}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{دقيقة واحدة}zero{# دقيقة}two{دقيقتان}few{# دقائق}many{# دقيقة}other{# دقيقة}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{ثانية واحدة}zero{# ثانية}two{ثانيتان}few{# ثوانٍ}many{# ثانيةً}other{# ثانية}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"أيّ إذن"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"أي وقت"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"آخر 7 أيام"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"آخر 24 ساعة"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"آخر ساعة"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"آخر 15 دقيقة"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"الدقيقة الماضية"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{آخر يوم}zero{آخر # يوم}two{آخر يومَين}few{آخر # أيام}many{آخر # يومًا}other{آخر # يوم}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{آخر ساعة}zero{آخر # ساعة}two{آخر ساعتين}few{آخر # ساعات}many{آخر # ساعة}other{آخر # ساعة}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{آخر دقيقة}zero{آخر # دقيقة}two{آخر دقيقتين}few{آخر # دقائق}many{آخر # دقيقة}other{آخر # دقيقة}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"لم يتمّ استخدام الأذونات"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"آخر إذن وصول في أي وقت"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"الاستخدامات الحديثة لإذن الوصول خلال آخر 7 أيام"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"استخدام الإذن خلال الساعة الأخيرة"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"استخدام الإذن خلال آخر 15 دقيقة"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"استخدام الإذن خلال الدقيقة الماضية"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"لم يتم استخدام الإذن في آخر 24 ساعة."</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"لم يتم استخدام الإذن في آخر 7 أيام."</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{لم يتم استخدام الإذن في اليوم السابق.}zero{لم يتم استخدام الإذن في الأيام الـ # السابقة.}two{لم يتم استخدام الإذن في اليومين السابقين.}few{لم يتم استخدام الإذن في الأيام الـ # السابقة.}many{لم يتم استخدام الإذن في الأيام الـ # السابقة.}other{لم يتم استخدام الإذن في الأيام الـ # السابقة.}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{لم يتم استخدام الإذن خلال الساعة السابقة}zero{لم يتم استخدام الإذن خلال الساعات الـ # السابقة.}two{لم يتم استخدام الإذن خلال الساعتين السابقتين.}few{لم يتم استخدام الإذن خلال الساعات الـ # السابقة.}many{لم يتم استخدام الإذن خلال الساعات الـ # السابقة.}other{لم يتم استخدام الإذن خلال الساعات الـ # السابقة.}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{يستخدِمه تطبيق واحد.}zero{يستخدِمه # تطبيق.}two{يستخدِمه تطبيقان.}few{يستخدِمه # تطبيقات.}many{يستخدِمه # تطبيقًا.}other{يستخدِمه # تطبيق.}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"الاطّلاع على الكل في \"لوحة البيانات\""</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"تمّت الفلترة حسب: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"الأذونات غير المسموح بها"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"الاطّلاع على تطبيقات أكثر يمكنها الوصول إلى كل الملفات"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{يوم واحد}zero{# يوم}two{يومان}few{# أيام}many{# يومًا}other{# يوم}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان}few{# ساعات}many{# ساعةً}other{# ساعة}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{دقيقة واحدة}zero{# دقيقة}two{دقيقتان}few{# دقائق}many{# دقيقةً}other{# دقيقة}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{ثانية واحدة}zero{# ثانية}two{ثانيتان}few{# ثوانٍ}many{# ثانيةً}other{# ثانية}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{ساعة واحدة}zero{# ساعة}two{ساعتان}few{# ساعات}many{# ساعةً}other{# ساعة}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{دقيقة واحدة}zero{# دقيقة}two{دقيقتان}few{# دقائق}many{# دقيقةً}other{# دقيقة}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{ثانية واحدة}zero{# ثانية}two{ثانيتان}few{# ثوانٍ}many{# ثانية}other{# ثانية}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"تذكيرات الأذونات"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"تطبيق واحد غير مستخدم"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"عدد التطبيقات غير المُستخدمة: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-as/strings.xml b/PermissionController/res/values-as/strings.xml
index c339ec354..6bb5e8007 100644
--- a/PermissionController/res/values-as/strings.xml
+++ b/PermissionController/res/values-as/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{১ দিন}one{# দিন}other{# দিন}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{১ ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{১ মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{১ ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# দিন}one{# দিন}other{# দিন}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"যিকোনো অনুমতি"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"যিকোনো সময়ত"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"যোৱা ৭ দিনত"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"যোৱা ২৪ ঘণ্টাত"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"যোৱা ১ ঘণ্টাত"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"যোৱা ১৫ মিনিটত"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"যোৱা ১ মিনিটত"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{যোৱা # দিনত}one{যোৱা # দিনত}other{যোৱা # দিনত}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{যোৱা # ঘণ্টাত}one{যোৱা # ঘণ্টাত}other{যোৱা # ঘণ্টাত}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{যোৱা # মিনিটত}one{যোৱা # মিনিটত}other{যোৱা # মিনিটত}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"অনুমতি ব্যৱহাৰ কৰা হোৱা নাই"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"সৰ্বসময়ৰ একেবাৰে শেহতীয়াকৈ কৰা এক্সেছ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"যোৱা ৭ দিনত একেবাৰে শেহতীয়া এক্সেছ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"যোৱা ১ মিনিটত কৰা অনুমতিৰ ব্যৱহাৰ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"যোৱা ১৫ মিনিটত কৰা অনুমতিৰ ব্যৱহাৰ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"যোৱা ১ মিনিটত কৰা অনুমতিৰ ব্যৱহাৰ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"যোৱা ২৪ ঘণ্টাত ব্যৱহাৰ কৰা হোৱা নাই"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"যোৱা ৭ দিনত ব্যৱহাৰ কৰা হোৱা নাই"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{যোৱা # দিনত ব্যৱহাৰ কৰা হোৱা নাই}one{যোৱা # দিনত ব্যৱহাৰ কৰা হোৱা নাই}other{যোৱা # দিনত ব্যৱহাৰ কৰা হোৱা নাই}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{যোৱা # ঘণ্টাত ব্যৱহাৰ কৰা হোৱা নাই}one{যোৱা # ঘণ্টাত ব্যৱহাৰ কৰা হোৱা নাই}other{যোৱা # ঘণ্টাত ব্যৱহাৰ কৰা হোৱা নাই}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{১ টা এপে ব্যৱহাৰ কৰিছে}one{# টা এপে ব্যৱহাৰ কৰিছে}other{# টা এপে ব্যৱহাৰ কৰিছে}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ডেশ্বব’ৰ্ডত আটাইবোৰ চাওক"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"এই অনুসৰি ফিল্টাৰ কৰা: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"অনুমতি নাই"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"আটাইবোৰ ফাইল এক্সেছ কৰিব পৰা অধিক এপ্‌ চাওক"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{১ দিন}one{# দিন}other{# দিন}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{১ ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{১ মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{১ ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"অনুমতি বিষয়ক ৰিমাইণ্ডাৰ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"১ টা অব্যৱহৃত এপ্‌"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> টা অব্যৱহৃত এপ্‌"</string>
diff --git a/PermissionController/res/values-az/strings.xml b/PermissionController/res/values-az/strings.xml
index ca119aa53..bbe6f6bd4 100644
--- a/PermissionController/res/values-az/strings.xml
+++ b/PermissionController/res/values-az/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 gün}other{# gün}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 saat}other{# saat}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 dəq}other{# dəq}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 san}other{# san}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# gün}other{# gün}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# dəq}other{# dəq}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# san}other{# san}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Hər hansı icazə"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"İstənilən vaxt"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Son 7 gün"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Son 24 saat"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Son 1 saat"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Son 15 dəqiqə"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Son 1 dəqiqə"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Son # gün}other{Son # gün}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Son # saat}other{Son # saat}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Son # dəqiqə}other{Son # dəqiqə}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"İcazələrdən istifadə olunmayıb"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"İstənilən vaxt üçün fəaliyyət"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Son 7 gün ərzindəki fəaliyyət"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Son 1 saat ərzində icazə istifadəsi"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Son 15 dəqiqə ərzində icazə istifadəsi"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Son 1 dəqiqə ərinzdə icazə istifadəsi"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Son 24 saat ərzində istifadə edilməyib"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Son 7 gün ərzində istifadə edilməyib"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Son # gün ərzində istifadə edilməyib}other{Son # gün ərzində istifadə edilməyib}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Son # saat ərzində istifadə edilməyib}other{Son # saat ərzində istifadə edilməyib}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 tətbiq istifadə edir}other{# tətbiq istifadə edir}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Hamısına İdarə panelində baxın"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrlədi: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"İcazə verilməyib"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Bütün fayllara giriş edə bilən digər tətbiqlərə baxın"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 gün}other{# gün}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 saat}other{# saat}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 dəqiqə}other{# dəqiqə}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 saniyə}other{# saniyə}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# dəqiqə}other{# dəqiqə}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# saniyə}other{# saniyə}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"İcazə xatırladıcıları"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 tətbiq istifadə edilmir"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> istifadə olunmayan tətbiq"</string>
diff --git a/PermissionController/res/values-b+sr+Latn/strings.xml b/PermissionController/res/values-b+sr+Latn/strings.xml
index 32a2295f6..7462cb376 100644
--- a/PermissionController/res/values-b+sr+Latn/strings.xml
+++ b/PermissionController/res/values-b+sr+Latn/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 sat}one{# sat}few{# sata}other{# sati}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek}one{# sek}few{# sek}other{# sek}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek}one{# sek}few{# sek}other{# sek}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Bilo koja dozvola"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Bilo kada"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Poslednjih 7 dana"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Poslednja 24 sata"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Poslednji sat"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Poslednjih 15 minuta"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Poslednji minut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Poslednji # dan}one{Poslednji # dan}few{Poslednja # dana}other{Poslednjih # dana}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Poslednji # sat}one{Poslednji # sat}few{Poslednja # sata}other{Poslednjih # sati}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Poslednji # minut}one{Poslednji # minut}few{Poslednja # minuta}other{Poslednjih # minuta}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Dozvole nisu korišćene"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Najskoriji pristup u bilo kom trenutku"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Najskoriji pristup u poslednjih 7 dana"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Korišćenje dozvola u poslednjih sat vremena"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Korišćenje dozvole u poslednjih 15 minuta"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Korišćenje dozvola u poslednjem minutu"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nije korišćeno u poslednja 24 sata"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nije korišćeno u poslednjih 7 dana"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nije korišćeno tokom poslednjeg # dana}one{Nije korišćeno tokom poslednjeg # dana}few{Nije korišćeno tokom poslednja # dana}other{Nije korišćeno tokom poslednjih # dana}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nije korišćeno tokom poslednjeg # sata}one{Nije korišćeno tokom poslednjeg # sata}few{Nije korišćeno tokom poslednja # sata}other{Nije korišćeno tokom poslednjih # sati}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Koristi 1 aplikacija}one{Koristi # aplikacija}few{Koriste # aplikacije}other{Koristi # aplikacija}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Prikaži sve na kontrolnoj tabli"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrirano prema: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nije dozvoljeno"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Prikaži još aplikacija sa pristupom svim fajlovima"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 sat}one{# sat}few{# sata}other{# sati}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minut}one{# minut}few{# minuta}other{# minuta}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}one{# minut}few{# minuta}other{# minuta}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Podsetnici za dozvole"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplikacija koja se ne koristi"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Aplikacija koje se ne koriste: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-be/strings.xml b/PermissionController/res/values-be/strings.xml
index a45533fd6..d81f8b339 100644
--- a/PermissionController/res/values-be/strings.xml
+++ b/PermissionController/res/values-be/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 дзень}one{# дзень}few{# дні}many{# дзён}other{# дня}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 гадзіна}one{# гадзіна}few{# гадзіны}many{# гадзін}other{# гадзіны}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 хв}one{# хв}few{# хв}many{# хв}other{# хв}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 с}one{# с}few{# с}many{# с}other{# с}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# дзень}one{# дзень}few{# дні}many{# дзён}other{# дня}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# гадзіна}one{# гадзіна}few{# гадзіны}many{# гадзін}other{# гадзіны}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# хв}one{# хв}few{# хв}many{# хв}other{# хв}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# с}one{# с}few{# с}many{# с}other{# с}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Любы дазвол"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"За любы час"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"За апошнія 7 дзён"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"За апошнія 24 гадзіны"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"За апошнюю гадзіну"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"За апошнія 15 хвілін"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"За апошнюю хвіліну"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{За апошні # дзень}one{За апошні # дзень}few{За апошнія # дні}many{За апошнія # дзён}other{За апошнія # дня}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{За апошнюю # гадзіну}one{За апошнюю # гадзіну}few{За апошнія # гадзіны}many{За апошнія # гадзін}other{За апошнія # гадзіны}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{За апошнюю # хвіліну}one{За апошнюю # хвіліну}few{За апошнія # хвіліны}many{За апошнія # хвілін}other{За апошнія # хвіліны}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Без выкарыстання дазволаў"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Доступы за ўвесь час"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Доступы за апошнія 7 дзён"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Выкарыстанне дазволаў за апошнюю гадзіну"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Выкарыстаннне дазволаў за апошнія 15 хвілін"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Выкарыстанне дазволаў за апошнюю хвіліну"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"За апошнія 24 гадзіны доступ не выкарыстоўваўся"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"За апошнія 7 сутак доступ не выкарыстоўваўся"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{За апошнія # суткі дазвол не выкарыстоўваўся}one{За апошнія # суткі дазвол не выкарыстоўваўся}few{За апошнія # сутак дазвол не выкарыстоўваўся}many{За апошнія # сутак дазвол не выкарыстоўваўся}other{За апошнія # сутак дазвол не выкарыстоўваўся}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{За апошнюю # гадзіну дазвол не выкарыстоўваўся}one{За апошнюю # гадзіну дазвол не выкарыстоўваўся}few{За апошнія # гадзіны дазвол не выкарыстоўваўся}many{За апошнія # гадзін дазвол не выкарыстоўваўся}other{За апошнія # гадзіны дазвол не выкарыстоўваўся}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Выкарыстоўваецца 1 праграмай}one{Выкарыстоўваецца # праграмай}few{Выкарыстоўваецца # праграмамі}many{Выкарыстоўваецца # праграмамі}other{Выкарыстоўваецца # праграмы}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Паказаць усе на панэлі кіравання"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Параметр фільтравання: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Забаронена"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Праглядзець іншыя праграмы, якія маюць доступ да ўсіх файлаў"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 дзень}one{# дзень}few{# дні}many{# дзён}other{# дня}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 гадзіна}one{# гадзіна}few{# гадзіны}many{# гадзін}other{# гадзіны}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 хвіліна}one{# хвіліна}few{# хвіліны}many{# хвілін}other{# хвіліны}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# гадзіна}one{# гадзіна}few{# гадзіны}many{# гадзін}other{# гадзіны}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# хвіліна}one{# хвіліна}few{# хвіліны}many{# хвілін}other{# хвіліны}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Напаміны пра дазволы"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 праграма не выкарыстоўваецца"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Колькасць праграм не ў карыстанні: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-bg/strings.xml b/PermissionController/res/values-bg/strings.xml
index 0275e3353..1cb263d39 100644
--- a/PermissionController/res/values-bg/strings.xml
+++ b/PermissionController/res/values-bg/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ден}other{# дни}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 час}other{# часа}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мин}other{# мин}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 сек}other{# сек}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ден}other{# дни}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# час}other{# часа}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мин}other{# мин}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# сек}other{# сек}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Всички разрешения"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"По всяко време"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Последните 7 дни"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Последните 24 часа"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Последния 1 час"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Последните 15 минути"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Последната минута"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Последният # ден}other{Последните # дни}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Последният # час}other{Последните # часа}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Последната # минута}other{Последните # минути}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Разрешенията не са използвани"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Най-скорошен достъп във всеки един момент"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Най-скорошен достъп през последните 7 дни"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Използвани разрешения през последния час"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Използвани разрешения през последните 15 минути"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Използвани разрешения през последната минута"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Не е използвано през последните 24 часа"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Не е използвано през последните 7 дни"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Не е използвано през последния # ден}other{Не е използвано през последните # дни}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Не е използвано през последния # час}other{Не е използвано през последните # часа}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Използва се от 1 приложение}other{Използва се от # приложения}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Преглед на всичко в таблото за управление"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Филтрирано по: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Не е разрешено"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Вижте още приложения, които имат достъп до всички файлове"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ден}other{# дни}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 час}other{# часа}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минута}other{# минути}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}other{# секунди}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# час}other{# часа}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минута}other{# минути}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}other{# секунди}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Напомняния за разрешения"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 неизползвано приложение"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> неизползвани приложения"</string>
diff --git a/PermissionController/res/values-bn/strings.xml b/PermissionController/res/values-bn/strings.xml
index 356e84d92..dab405bc0 100644
--- a/PermissionController/res/values-bn/strings.xml
+++ b/PermissionController/res/values-bn/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{১ দিন}one{# দিন}other{# দিন}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{১ ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{১ মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# দিন}one{# দিন}other{# দিন}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"যেকোন অনুমতি"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"যেকোনও সময়"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"গত ৭ দিন"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"গত ২৪ ঘন্টায়"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"শেষ ১ ঘণ্টা"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"গত ১৫ মিনিট"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"গত ১ মিনিটে"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{গত # দিন}one{গত # দিন}other{গত # দিন}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{গত # ঘণ্টায়}one{গত # ঘণ্টায়}other{গত # ঘণ্টায়}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{গত # মিনিটে}one{গত # মিনিটে}other{গত # মিনিটে}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"কোন অনুমতির ব্যবহার হয়নি"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"সাম্প্রতিক ব্যবহার"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"গত ৭ দিনের মধ্যে সাম্প্রতিক অ্যাক্সেস"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"গত ১ ঘণ্টার মধ্যে অনুমতির ব্যবহার"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"গত ১৫ মিনিটের মধ্যে অনুমতির ব্যবহার"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"গত ১ মিনিটের মধ্যে অনুমতির ব্যবহার"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"গত ২৪ ঘন্টায় ব্যবহার করা হয়নি"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"গত ৭ দিনে ব্যবহার করা হয়নি"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{গত # দিনে ব্যবহার করা হয়নি}one{গত # দিনে ব্যবহার করা হয়নি}other{গত # দিনে ব্যবহার করা হয়নি}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{গত # ঘণ্টায় ব্যবহার করা হয়নি}one{গত # ঘণ্টায় ব্যবহার করা হয়নি}other{গত # ঘণ্টায় ব্যবহার করা হয়নি}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{১টি অ্যাপ ব্যবহার করেছে}one{#টি অ্যাপ ব্যবহার করেছে}other{#টি অ্যাপ ব্যবহার করেছে}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"সবকিছু ড্যাশবোর্ডে দেখুন"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"এই অনুযায়ী ফিল্টার করা হয়েছে: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"অনুমোদিত নয়"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"সব ফাইল অ্যাক্সেস করতে পারবে এমন আরও অ্যাপ দেখুন"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{১ দিন}one{# দিন}other{# দিন}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{১ ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{১ মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ঘণ্টা}one{# ঘণ্টা}other{# ঘণ্টা}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# মিনিট}one{# মিনিট}other{# মিনিট}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"অনুমতির রিমাইন্ডার"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"ব্যবহার হয়নি এমন ১টি অ্যাপ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"ব্যবহার হয়নি এমন <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>টি অ্যাপ"</string>
diff --git a/PermissionController/res/values-bs/strings.xml b/PermissionController/res/values-bs/strings.xml
index 97a5e4395..de42dcf4e 100644
--- a/PermissionController/res/values-bs/strings.xml
+++ b/PermissionController/res/values-bs/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}one{# s}few{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# h}one{# h}few{# h}other{# h}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}one{# s}few{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Sva odobrenja"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Bilo kad"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Posljednjih 7 dana"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Posljednja 24 sata"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Posljednji sat"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Posljednjih 15 minuta"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Posljednja minuta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Posljednji dan}one{Posljednji # dan}few{Posljednja # dana}other{Posljednjih # dana}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Posljednji sat}one{Posljednjih # h}few{Posljednja # h}other{Posljednjih # h}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Posljednja minuta}one{Posljednja # min}few{Posljednje # min}other{Posljednjih # min}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Odobrenje nije upotrijebljeno"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Najnoviji pristup u bilo koje vrijeme"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Najnoviji pristup u posljednjih 7 dana"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Korištena odobrenja u posljenji 1 sat"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Korištena odobrenja u posljednjih 15 minuta"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Korištena odobrenja u protekloj minuti"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nije korišteno u posljednja 24 h"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nije korišteno u posljednjih 7 dana"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nije korišteno u proteklom danu}one{Nije korišteno u proteklom # danu}few{Nije korišteno u protekla # dana}other{Nije korišteno u proteklih # dana}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nije korišteno u proteklom satu}one{Nije korišteno u protekli # h}few{Nije korišteno u protekla # h}other{Nije korišteno u proteklih # h}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Koristi 1 aplikacija}one{Koristi # aplikacija}few{Koriste # aplikacije}other{Koristi # aplikacija}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Prikaži sve na kontrolnoj tabli"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrirano prema: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nije dozvoljeno"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Pogledajte više aplikacija koje imaju pristup svim fajlovima"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 s}one{# s}few{# s}other{# s}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# h}one{# h}few{# h}other{# h}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# s}one{# s}few{# s}other{# s}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Podsjetnici odobrenja"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nekorištena aplikacija"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Broj nekorištenih aplikacija: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-ca/strings.xml b/PermissionController/res/values-ca/strings.xml
index 0f834c6ec..501a52171 100644
--- a/PermissionController/res/values-ca/strings.xml
+++ b/PermissionController/res/values-ca/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dia}other{# dies}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}other{# hores}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dia}other{# dies}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}other{# hores}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Qualsevol permís"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"En qualsevol moment"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 darrers dies"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Darreres 24 hores"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últims 15 minuts"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Últim minut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Darrer dia}other{# darrers dies}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Darrera hora}other{Darreres # hores}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Darrer minut}other{Darrers # minuts}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Cap ús de permisos"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Accés més recents en qualsevol moment"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Accés més recents durant els 7 darrers dies"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Ús de permisos durant l\'última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Ús de permisos durant els últims 15 minuts"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Ús de permisos durant l\'últim minut"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"No s\'ha utilitzat en les 24 darreres hores"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"No s\'ha utilitzat en els 7 darrers dies"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{No s\'ha utilitzat en el darrer dia}other{No s\'ha utilitzat en els darrers # dies}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{No s\'ha utilitzat en la darrera hora}other{No s\'ha utilitzat en les darreres # hores}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Utilitzat per 1 aplicació}other{Utilitzat per # aplicacions}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Mostra-ho tot al tauler"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrats per: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Sense permís"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Mostra més aplicacions que poden accedir a tots els fitxers"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dia}other{# dies}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}other{# hores}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minut}other{# minuts}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segon}other{# segons}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}other{# hores}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}other{# minuts}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segon}other{# segons}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Recordatoris de permisos"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplicació no utilitzada"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplicacions no utilitzades"</string>
diff --git a/PermissionController/res/values-cs/strings.xml b/PermissionController/res/values-cs/strings.xml
index 17130da1c..376a04f37 100644
--- a/PermissionController/res/values-cs/strings.xml
+++ b/PermissionController/res/values-cs/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 den}few{# dny}many{# dne}other{# dní}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hodina}few{# hodiny}many{# hodiny}other{# hodin}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}few{# min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}few{# s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# den}few{# dny}many{# dne}other{# dní}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hodinu}few{# hodiny}many{# hodiny}other{# hodin}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}few{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}few{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Všechna oprávnění"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Kdykoli"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Posledních 7 dní"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Posledních 24 hodin"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Poslední hodina"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Posledních 15 minut"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Poslední minuta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Poslední den}few{Poslední # dny}many{Posledních # dne}other{Posledních # dní}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Poslední hodina}few{Poslední # hodiny}many{Posledních # hodiny}other{Posledních # hodin}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Poslední minuta}few{Poslední # minuty}many{Posledních # minuty}other{Posledních # minut}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Žádné využití oprávnění"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Poslední využití kdykoli"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Poslední použití za 7 dnů"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Využití oprávnění za poslední hodinu"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Využití oprávnění za posledních 15 minut"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Využití oprávnění za poslední minutu"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Během uplynulých 24 hodin nepoužito"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Během posledních 7 dní nepoužito"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Během uplynulého dne nepoužito}few{Během uplynulých # dní nepoužito}many{Během uplynulých # dne nepoužito}other{Během uplynulých # dní nepoužito}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Během uplynulé hodiny nepoužito}few{Během uplynulých # hodin nepoužito}many{Během uplynulých # hodiny nepoužito}other{Během uplynulých # hodin nepoužito}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Využíváno 1 aplikací}few{Využíváno # aplikacemi}many{Využíváno # aplikace}other{Využíváno # aplikacemi}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Zobrazit vše na panelu"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrováno podle: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nepovoleno"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Zobrazit další aplikace s přístupem ke všem souborům"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 den}few{# dny}many{# dne}other{# dní}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hodina}few{# hodiny}many{# hodiny}other{# hodin}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuta}few{# minuty}many{# minuty}other{# minut}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekund}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hodinu}few{# hodiny}many{# hodiny}other{# hodin}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuta}few{# minuty}many{# minuty}other{# minut}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunda}few{# sekundy}many{# sekundy}other{# sekund}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Připomenutí o oprávněních"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Nepoužívané aplikace: 1"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Nepoužívané aplikace: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-da/strings.xml b/PermissionController/res/values-da/strings.xml
index fac9d1702..559cdd967 100644
--- a/PermissionController/res/values-da/strings.xml
+++ b/PermissionController/res/values-da/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dag}one{# dag}other{# dage}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 time}one{# time}other{# timer}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min.}one{# min.}other{# min.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek.}one{# sek.}other{# sek.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dag}one{# dag}other{# dage}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# time}one{# time}other{# timer}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min.}one{# min.}other{# min.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek.}one{# sek.}other{# sek.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Alle tilladelser"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Nogensinde"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"De seneste 7 dage"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"De seneste 24 timer"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Den seneste time"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"De seneste 15 minutter"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Seneste minut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Seneste dag}one{Seneste # dag}other{Seneste # dage}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Seneste time}one{Seneste # time}other{Seneste # timer}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Seneste minut}one{Seneste # minut}other{Seneste # minutter}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ingen brug af tilladelsen"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Seneste adgang nogensinde"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Seneste adgang i de sidste 7 dage"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Anvendte tilladelser den seneste time"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Anvendte tilladelser i de sidste 15 minutter"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Anvendte tilladelser det seneste minut"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ikke brugt i de seneste 24 timer"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Ikke brugt i de seneste 7 dage"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Ikke brugt i # dag}one{Ikke brugt i # dag}other{Ikke brugt i de seneste # dage}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Ikke brugt i # time}one{Ikke brugt i # time}other{Ikke brugt i de seneste # timer}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Anvendes af 1 app}one{Anvendes af # app}other{Anvendes af # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Se alt i kontrolpanelet"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtreret efter: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ikke tilladt"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Se flere apps, som kan tilgå alle filer"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dag}one{# dag}other{# dage}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 time}one{# time}other{# timer}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minut}one{# minut}other{# minutter}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekund}one{# sekund}other{# sekunder}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# time}one{# time}other{# timer}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}one{# minut}other{# minutter}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekund}one{# sekund}other{# sekunder}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Påmindelser om tilladelse"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app, du ikke bruger"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apps, du ikke bruger"</string>
diff --git a/PermissionController/res/values-de/strings.xml b/PermissionController/res/values-de/strings.xml
index 498ef4471..18ab6f1a8 100644
--- a/PermissionController/res/values-de/strings.xml
+++ b/PermissionController/res/values-de/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 Tag}other{# Tage}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 Stunde}other{# Stunden}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# Tag}other{# Tage}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# Stunde}other{# Stunden}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Alle Berechtigungen"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Beliebiger Zeitraum"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Letzte 7 Tage"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Letzte 24 Stunden"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Letzte Stunde"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Letzte 15 Minuten"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Letzte Minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Letzter Tag}other{Letzte # Tage}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Letzte Stunde}other{Letzte # Stunden}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Letzte Minute}other{Letzte # Minuten}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Keine Berechtigungen verwendet"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Letzter Zugriff zu einem beliebigen Zeitpunkt"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Letzter Zugriff in den letzten 7 Tagen"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Berechtigungsnutzungen (letzte Stunde)"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Berechtigungsnutzungen (letzte 15 Minuten)"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Berechtigungsnutzungen (letzte Minute)"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"In den letzten 24 Stunden nicht verwendet"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"In den letzten 7 Tagen nicht verwendet"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Innerhalb des letzten Tages nicht verwendet}other{In den letzten # Tagen nicht verwendet}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Innerhalb der letzten Stunde nicht verwendet}other{In den letzten # Stunden nicht verwendet}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Von 1 App verwendet}other{Von # Apps verwendet}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Alle im Dashboard ansehen"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Gefiltert nach: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nicht zugelassen"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Weitere Apps anzeigen, die auf alle Dateien zugreifen können"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 Tag}other{# Tage}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 Stunde}other{# Stunden}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 Minute}other{# Minuten}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 Sekunde}other{# Sekunden}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# Stunde}other{# Stunden}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# Minute}other{# Minuten}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# Sekunde}other{# Sekunden}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Berechtigungserinnerungen"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nicht verwendete App"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> nicht verwendete Apps"</string>
diff --git a/PermissionController/res/values-el/strings.xml b/PermissionController/res/values-el/strings.xml
index 045d2a1d6..72fb45553 100644
--- a/PermissionController/res/values-el/strings.xml
+++ b/PermissionController/res/values-el/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ημέρα}other{# ημέρες}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ώρα}other{# ώρες}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 λεπτό}other{# λεπτά}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 δευτ.}other{# δευτ.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ημέρα}other{# ημέρες}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ώρα}other{# ώρες}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# λεπτό}other{# λεπτά}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# δευτερόλεπτο}other{# δευτερόλεπτα}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Οποιαδήποτε άδεια"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"οποιαδήποτε στιγμή"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"τελευταίες 7 ημέρες"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"τελευταίες 24 ώρες"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"τελευταία 1 ώρα"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"τελευταία 15 λεπτά"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"τελευταίο 1 λεπτό"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Τελευταία # ημέρα}other{Τελευταίες # ημέρες}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Τελευταία # ώρα}other{Τελευταίες # ώρες}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Τελευταίο # λεπτό}other{Τελευταία # λεπτά}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Καμία χρήση δικαιωμάτων"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Πιο πρόσφατη πρόσβαση ανά πάσα στιγμή"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Πιο πρόσφατη πρόσβαση τις τελευταίες 7 ημέρες"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Χρήση άδειας την τελευταία 1 ώρα"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Χρήση αδειών τα τελευταία 15 λεπτά"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Χρήση άδειας το τελευταίο 1 λεπτό"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Δεν έχει χρησιμοποιηθεί τις τελευταίες 24 ώρες"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Δεν έχει χρησιμοποιηθεί τις τελευταίες επτά ημέρες"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Δεν έχει χρησιμοποιηθεί την τελευταία # ημέρα}other{Δεν έχει χρησιμοποιηθεί τις τελευταίες # ημέρες}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Δεν έχει χρησιμοποιηθεί την τελευταία # ώρα}other{Δεν έχει χρησιμοποιηθεί τις τελευταίες # ώρες}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Χρησιμοποιείται από 1 εφαρμογή}other{Χρησιμοποιείται από # εφαρμογές}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Εμφάνιση όλων στον Πίνακα ελέγχου"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Φιλτράρισμα κατά: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Δεν επιτρέπεται"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Δείτε περισσότερες εφαρμογές με πρόσβαση σε όλα τα αρχεία"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ημέρα}other{# ημέρες}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ώρα}other{# ώρες}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 λεπτό}other{# λεπτά}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 δευτερόλεπτο}other{# δευτερόλεπτα}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ώρα}other{# ώρες}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# λεπτό}other{# λεπτά}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# δευτερόλεπτο}other{# δευτερόλεπτα}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Υπενθυμίσεις άδειας"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 εφαρμογή που δεν χρησιμοποιείται"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> εφαρμογές που δεν χρησιμοποιούνται"</string>
diff --git a/PermissionController/res/values-en-rAU/strings.xml b/PermissionController/res/values-en-rAU/strings.xml
index acf7006c4..643596a3d 100644
--- a/PermissionController/res/values-en-rAU/strings.xml
+++ b/PermissionController/res/values-en-rAU/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# mins}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}other{# secs}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# mins}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sec}other{# secs}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Any permission"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Any time"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Last 7 days"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Last 24 hours"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Last 1 hour"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Last 15 minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Last 1 minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Last # day}other{Last # days}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Last # hour}other{Last # hours}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Last # minute}other{Last # minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"No permission usages"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Most recent access at any time"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Most recent access in last 7 days"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Permission usage in last 1 hour"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Permission usage in last 15 minutes"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Permission usage in last 1 minute"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Not used in past 24 hours"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Not used in past 7 days"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Not used in past # day}other{Not used in past # days}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Not used in past # hour}other{Not used in past # hours}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Used by 1 app}other{Used by # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"See all in Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtered by: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Not allowed"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"See more apps that can access all files"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 second}other{# seconds}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# second}other{# seconds}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Permission reminders"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 unused app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> unused apps"</string>
diff --git a/PermissionController/res/values-en-rCA/strings.xml b/PermissionController/res/values-en-rCA/strings.xml
index acf7006c4..643596a3d 100644
--- a/PermissionController/res/values-en-rCA/strings.xml
+++ b/PermissionController/res/values-en-rCA/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# mins}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}other{# secs}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# mins}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sec}other{# secs}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Any permission"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Any time"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Last 7 days"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Last 24 hours"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Last 1 hour"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Last 15 minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Last 1 minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Last # day}other{Last # days}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Last # hour}other{Last # hours}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Last # minute}other{Last # minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"No permission usages"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Most recent access at any time"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Most recent access in last 7 days"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Permission usage in last 1 hour"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Permission usage in last 15 minutes"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Permission usage in last 1 minute"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Not used in past 24 hours"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Not used in past 7 days"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Not used in past # day}other{Not used in past # days}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Not used in past # hour}other{Not used in past # hours}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Used by 1 app}other{Used by # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"See all in Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtered by: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Not allowed"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"See more apps that can access all files"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 second}other{# seconds}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# second}other{# seconds}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Permission reminders"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 unused app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> unused apps"</string>
diff --git a/PermissionController/res/values-en-rGB/strings.xml b/PermissionController/res/values-en-rGB/strings.xml
index 66efc45a9..61064f83a 100644
--- a/PermissionController/res/values-en-rGB/strings.xml
+++ b/PermissionController/res/values-en-rGB/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# mins}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}other{# secs}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# mins}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sec}other{# secs}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Any permission"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Any time"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Last 7 days"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Last 24 hours"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Last 1 hour"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Last 15 minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Last 1 minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Last # day}other{Last # days}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Last # hour}other{Last # hours}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Last # minute}other{Last # minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"No permission usages"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Most recent access at any time"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Most recent access in last 7 days"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Permission usage in last 1 hour"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Permission usage in last 15 minutes"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Permission usage in last 1 minute"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Not used in past 24 hours"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Not used in past 7 days"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Not used in past # day}other{Not used in past # days}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Not used in past # hour}other{Not used in past # hours}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Used by 1 app}other{Used by # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"See all in Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtered by: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Not allowed"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"See more apps that can access all files"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 second}other{# seconds}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# second}other{# seconds}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Permission reminders"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 unused app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> unused apps"</string>
diff --git a/PermissionController/res/values-en-rIN/strings.xml b/PermissionController/res/values-en-rIN/strings.xml
index 66efc45a9..61064f83a 100644
--- a/PermissionController/res/values-en-rIN/strings.xml
+++ b/PermissionController/res/values-en-rIN/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# mins}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}other{# secs}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# day}other{# days}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# mins}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sec}other{# secs}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Any permission"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Any time"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Last 7 days"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Last 24 hours"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Last 1 hour"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Last 15 minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Last 1 minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Last # day}other{Last # days}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Last # hour}other{Last # hours}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Last # minute}other{Last # minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"No permission usages"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Most recent access at any time"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Most recent access in last 7 days"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Permission usage in last 1 hour"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Permission usage in last 15 minutes"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Permission usage in last 1 minute"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Not used in past 24 hours"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Not used in past 7 days"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Not used in past # day}other{Not used in past # days}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Not used in past # hour}other{Not used in past # hours}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Used by 1 app}other{Used by # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"See all in Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtered by: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Not allowed"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"See more apps that can access all files"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 day}other{# days}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hour}other{# hours}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 second}other{# seconds}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hour}other{# hours}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# second}other{# seconds}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Permission reminders"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 unused app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> unused apps"</string>
diff --git a/PermissionController/res/values-en-rXC/strings.xml b/PermissionController/res/values-en-rXC/strings.xml
index b78542f94..59ad100b9 100644
--- a/PermissionController/res/values-en-rXC/strings.xml
+++ b/PermissionController/res/values-en-rXC/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="ACCESS_TIME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%2$s</xliff:g>‎‏‎‎‏‏‏‎ • ‎‏‎‎‏‏‎<xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎1 day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‎‎‎‏‎# days‎‏‎‎‏‎}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎1 hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‎‎‎# hours‎‏‎‎‏‎}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎1 min‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎# mins‎‏‎‎‏‎}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎1 sec‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎# secs‎‏‎‎‏‎}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎# day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‎‏‎# days‎‏‎‎‏‎}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎# hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‏‏‎‎‎# hours‎‏‎‎‏‎}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎# min‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‎# mins‎‏‎‎‏‎}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎# sec‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎# secs‎‏‎‎‏‎}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎Any permission‎‏‎‎‏‎"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‎‏‎‎‏‏‎Any time‎‏‎‎‏‎"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎Last 7 days‎‏‎‎‏‎"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‏‏‎‏‏‎Last 24 hours‎‏‎‎‏‎"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎Last 1 hour‎‏‎‎‏‎"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎Last 15 minutes‎‏‎‎‏‎"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‎‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎Last 1 minute‎‏‎‎‏‎"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎Last # day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎Last # days‎‏‎‎‏‎}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎Last # hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‎Last # hours‎‏‎‎‏‎}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎Last # minute‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‏‎Last # minutes‎‏‎‎‏‎}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎No permission usages‎‏‎‎‏‎"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‏‏‎Most recent access at any time‎‏‎‎‏‎"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎Most recent access in last 7 days‎‏‎‎‏‎"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‎Permission usage in last 1 hour‎‏‎‎‏‎"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‎Permission usage in last 15 minutes‎‏‎‎‏‎"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‎Permission usage in last 1 minute‎‏‎‎‏‎"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎Not used in past 24 hours‎‏‎‎‏‎"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‎‎Not used in past 7 days‎‏‎‎‏‎"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‏‎Not used in past # day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‏‎Not used in past # days‎‏‎‎‏‎}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎Not used in past # hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‏‏‏‏‎‎Not used in past # hours‎‏‎‎‏‎}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎Used by 1 app‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‎‎‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎Used by # apps‎‏‎‎‏‎}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎See all in Dashboard‎‏‎‎‏‎"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‏‏‏‏‏‎‎Filtered by: ‎‏‎‎‏‏‎<xliff:g id="PERM">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‎‏‏‎‎Not allowed‎‏‎‎‏‎"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‎‎See more apps that can access all files‎‏‎‎‏‎"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎1 day‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‎‎‎‏‎# days‎‏‎‎‏‎}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎1 hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎# hours‎‏‎‎‏‎}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‎‏‎1 minute‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‏‎‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‎‏‎# minutes‎‏‎‎‏‎}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎1 second‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎# seconds‎‏‎‎‏‎}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎# hour‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎# hours‎‏‎‎‏‎}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎‏‎# minute‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‎‎‏‎‎‏‎# minutes‎‏‎‎‏‎}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎# second‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‎‎# seconds‎‏‎‎‏‎}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‏‏‎‎‎Permission reminders‎‏‎‎‏‎"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎1 unused app‎‏‎‎‏‎"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‏‎<xliff:g id="NUMBER_OF_APPS">%s</xliff:g>‎‏‎‎‏‏‏‎ unused apps‎‏‎‎‏‎"</string>
diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml
index ead99b5eb..5821f070b 100644
--- a/PermissionController/res/values-es-rUS/strings.xml
+++ b/PermissionController/res/values-es-rUS/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 día}many{# días}other{# días}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# día}many{# días}other{# días}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# segundo}many{# segundos}other{# segundos}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Cualquier permiso"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Cualquier momento"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 días"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Último día (#)}many{Últimos # días}other{Últimos # días}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Última hora (#)}many{Últimas # horas}other{Últimas # horas}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Último minuto (#)}many{Últimos # minutos}other{Últimos # minutos}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ningún uso de permisos"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acceso más reciente en cualquier momento"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acceso más reciente en los últimos 7 días"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso de permisos en la última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso de permisos en los últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso de permisos en el último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Sin uso en las últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"No se usó en los últimos 7 días"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{No se usó en el último día (#)}many{No se usó en los últimos # días}other{No se usó en los últimos # días}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{No se usó en la última hora (#)}many{No se usó en las últimas # horas}other{No se usó en las últimas # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{En uso por parte de 1 app}many{En uso por parte de # apps}other{En uso por parte de # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver todo en el panel"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrado por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Sin permiso"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Ver más apps que pueden acceder a todos los archivos"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 día}many{# días}other{# días}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}many{# minutos}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}many{# segundos}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}many{# segundos}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Recordatorios de permisos"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app en desuso"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apps que no usas"</string>
diff --git a/PermissionController/res/values-es/strings.xml b/PermissionController/res/values-es/strings.xml
index eed42bcf2..363eb7ab7 100644
--- a/PermissionController/res/values-es/strings.xml
+++ b/PermissionController/res/values-es/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 día}many{# días}other{# días}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# día}many{# días}other{# días}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Cualquier permiso"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Cualquier fecha"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 días"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Último día}many{Últimos # días}other{Últimos # días}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Última hora}many{Últimas # horas}other{Últimas # horas}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Último minuto}many{Últimos # minutos}other{Últimos # minutos}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"No se han usado los permisos"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acceso más reciente en cualquier momento"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acceso más reciente en los últimos 7 días"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso de permisos en la última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso de permisos en los últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso de permisos en el último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"No se ha usado en las últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"No se ha usado en los últimos 7 días"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{No se ha usado en el último día}many{No se ha usado en los últimos # días}other{No se ha usado en los últimos # días}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{No se ha usado en la última hora}many{No se ha usado en las últimas # horas}other{No se ha usado en las últimas # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Usado por 1 aplicación}many{Usado por # aplicaciones}other{Usado por # aplicaciones}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver todo en el panel de control"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrados por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"No permitido"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Ver más aplicaciones que pueden acceder a todos los archivos"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 día}many{# días}other{# días}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}many{# minutos}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}many{# segundos}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}many{# segundos}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Recordatorios de permisos"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplicación no usada"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplicaciones no usadas"</string>
diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml
index e46ce49ca..9538ffaf9 100644
--- a/PermissionController/res/values-et/strings.xml
+++ b/PermissionController/res/values-et/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 päev}other{# päeva}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 tund}other{# tundi}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# päev}other{# päeva}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# tund}other{# tundi}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Mis tahes luba"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Mis tahes ajal"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Viimased seitse päeva"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Viimased 24 tundi"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Viimane tund"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Viimased 15 minutit"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Viimane 1 minut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Viimane päev}other{Viimased # päeva}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Viimane tund}other{Viimased # tundi}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Viimane minut}other{Viimased # minutit}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Lube pole kasutatud"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Hiljutisim juurdepääs mis tahes ajal"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Hiljutisim juurdepääs viimase 7 päeva jooksul"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Lubade kasutus viimase 1 tunni jooksul"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Lubade kasutus viimase 15 minuti jooksul"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Lubade kasutus viimase 1 minuti jooksul"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Pole viimase 24 tunni jooksul kasutatud"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Pole viimase 7 päeva jooksul kasutatud"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Pole viimase # päeva jooksul kasutatud}other{Pole viimase # päeva jooksul kasutatud}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Pole viimase # tunni jooksul kasutatud}other{Pole viimase # tunni jooksul kasutatud}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Kasutab 1 rakendus}other{Kasutavad # rakendust}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Kuva kõik juhtpaneelil"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtreerimisalus: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Pole lubatud"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Kuva rohkem rakendusi, mis kõigile failidele juurde pääsevad"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 päev}other{# päeva}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 tund}other{# tundi}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minut}other{# minutit}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekund}other{# sekundit}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# tund}other{# tundi}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}other{# minutit}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekund}other{# sekundit}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Loa meeldetuletused"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 kasutamata rakendus"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> kasutamata rakendust"</string>
diff --git a/PermissionController/res/values-eu/strings.xml b/PermissionController/res/values-eu/strings.xml
index 8eb01a0b0..cd993e6ff 100644
--- a/PermissionController/res/values-eu/strings.xml
+++ b/PermissionController/res/values-eu/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 egun}other{# egun}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ordu}other{# ordu}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# egun}other{# egun}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ordu}other{# ordu}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Edozein baimen"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Edonoiz"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Azken 7 egunetan"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Azken 24 orduetan"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Azken orduan"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Azken 15 minutuetan"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Azken minutuan"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Azken # egunean}other{Azken # egunetan}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Azken # orduan}other{Azken # orduetan}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Azken # minutuan}other{Azken # minutuetan}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ez da eskatu baimenik"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Orain arteko azken sarbidea"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Azken zazpi egunetako azken sarbidea"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Azken ordubetean baimenei eman zaien erabilera"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Azken 15 minutuetan baimenei eman zaien erabilera"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Azken minutuan baimenei eman zaien erabilera"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ez da erabili azken 24 orduetan"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Ez da erabili azken zazpi egunetan"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Ez da erabili azken # egunean}other{Ez da erabili azken # egunetan}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Ez da erabili azken # orduan}other{Ez da erabili azken # orduetan}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Aplikazio batek erabili du}other{# aplikaziok erabili dute}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ikusi guztiak panelean"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Iragazteko irizpidea: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Baimendu gabe"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Ikusi fitxategi guztiak atzi ditzaketen aplikazio gehiago"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 egun}other{# egun}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ordu}other{# ordu}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minutu}other{# minutu}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}other{# segundo}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ordu}other{# ordu}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minutu}other{# minutu}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}other{# segundo}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Baimenen abisuak"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Erabiltzen ez den 1 aplikazio"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Erabiltzen ez diren <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplikazio"</string>
diff --git a/PermissionController/res/values-fa/strings.xml b/PermissionController/res/values-fa/strings.xml
index c0a896418..37417306a 100644
--- a/PermissionController/res/values-fa/strings.xml
+++ b/PermissionController/res/values-fa/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{یک روز}one{# روز}other{# روز}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{یک ساعت}one{# ساعت}other{# ساعت}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{یک دقیقه}one{# دقیقه}other{# دقیقه}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{یک ثانیه}one{# ثانیه}other{# ثانیه}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# روز}one{# روز}other{# روز}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ساعت}one{# ساعت}other{# ساعت}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# دقیقه}one{# دقیقه}other{# دقیقه}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ثانیه}one{# ثانیه}other{# ثانیه}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"همه مجوزها"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"هر زمانی"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"۷ روز گذشته"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"۲۴ ساعت اخیر"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"۱ ساعت اخیر"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"۱۵ دقیقه اخیر"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"۱ دقیقه اخیر"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# روز گذشته}one{# روز گذشته}other{# روز گذشته}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# ساعت گذشته}one{# ساعت گذشته}other{# ساعت گذشته}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# دقیقه گذشته}one{# دقیقه گذشته}other{# دقیقه گذشته}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"هیچ مجوزی استفاده نشده است"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"آخرین دسترسی در هرزمانی"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"آخرین دسترسی در ۷ روز گذشته"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"پراستفاده‌ترین مجوزها در ۱ ساعت گذشته"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"پراستفاده‌ترین مجوزها در ۱۵ دقیقه گذشته"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"پراستفاده‌ترین مجوزها در ۱ دقیقه گذشته"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"در ۲۴ ساعت گذشته استفاده نشده است"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"در ۷ روز گذشته استفاده نشده است"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{در # روز گذشته استفاده نشده است}one{در # روز گذشته استفاده نشده است}other{در # روز گذشته استفاده نشده است}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{در # ساعت گذشته استفاده نشده است}one{در # ساعت گذشته استفاده نشده است}other{در # ساعت گذشته استفاده نشده است}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{یک برنامه از آن استفاده کرده است}one{# برنامه از آن استفاده کرده است}other{# برنامه از آن استفاده کرده است}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"دیدن همه موارد در داشبورد"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"فیلترشده براساس: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"اجازه ندادن"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"دیدن برنامه‌های دیگری که به همه فایل‌ها دسترسی دارند"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{یک روز}one{# روز}other{# روز}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{یک ساعت}one{# ساعت}other{# ساعت}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{یک دقیقه}one{# دقیقه}other{# دقیقه}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{یک ثانیه}one{# ثانیه}other{# ثانیه}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ساعت}one{# ساعت}other{# ساعت}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# دقیقه}one{# دقیقه}other{# دقیقه}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ثانیه}one{# ثانیه}other{# ثانیه}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"یادآوری‌های مجوز"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"۱ برنامه استفاده‌نشده"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> برنامه استفاده‌نشده"</string>
diff --git a/PermissionController/res/values-fi/strings.xml b/PermissionController/res/values-fi/strings.xml
index d1435c1d6..f75b1e258 100644
--- a/PermissionController/res/values-fi/strings.xml
+++ b/PermissionController/res/values-fi/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 päivä}other{# päivää}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 tunti}other{# tuntia}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# päivä}other{# päivää}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# tunti}other{# tuntia}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Kaikki käyttöoikeudet"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Milloin tahansa"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Viimeiset 7 päivää"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Viimeiset 24 tuntia"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Viimeisin tunti"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Viimeiset 15 minuuttia"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Viimeinen minuutti"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Edellinen päivä}other{Viimeiset # päivää}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Viimeisin tunti}other{Viimeiset # tuntia}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Viimeinen minuutti}other{Viimeiset # minuuttia}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Käyttöoikeuksia ei käytetty"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Viimeksi käytetyt koska tahansa"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Viimeksi käytetyt viimeisten 7 päivän ajalta"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Lupien käyttö viimeisen tunnin ajalta"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Lupien käyttö viimeisten 15 min ajalta"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Lupien käyttö viimeisen minuutin ajalta"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ei käytetty 24 viime tunnin aikana"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Ei käytetty 7 viime päivän aikana"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Ei käytetty viimeisen päivän aikana}other{Ei käytetty # viime päivän aikana}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Ei käytetty viimeisen tunnin aikana}other{Ei käytetty # viime tunnin aikana}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 sovelluksen käyttämä}other{# sovelluksen käyttämä}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Näytä kaikki ohjauspaneelissa"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Suodatusperuste: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ei sallittu"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Muut sovellukset, joilla on pääsy kaikkiin tiedostoihin"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 päivä}other{# päivää}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 tunti}other{# tuntia}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuutti}other{# minuuttia}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunti}other{# sekuntia}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# tunti}other{# tuntia}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuutti}other{# minuuttia}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunti}other{# sekuntia}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Käyttölupamuistutukset"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 käyttämätön sovellus"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> käyttämätöntä sovellusta"</string>
diff --git a/PermissionController/res/values-fr-rCA/strings.xml b/PermissionController/res/values-fr-rCA/strings.xml
index 76e412a1f..2e393980d 100644
--- a/PermissionController/res/values-fr-rCA/strings.xml
+++ b/PermissionController/res/values-fr-rCA/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 jour}one{# jour}many{# jours}other{# jours}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 heure}one{# heure}many{# heures}other{# heures}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}many{# mins}other{# mins}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}one{# sec}many{# secs}other{# secs}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# jour}one{# jour}many{# de jours}other{# jours}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# heure}one{# heure}many{# d\'heures}other{# heures}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}many{# de minutes}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}one{# s}many{# de secondes}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Toute autorisation"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"À tout moment"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Les 7 derniers jours"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Les 24 dernières heures"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"La dernière heure"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Les 15 dernières minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Dernière minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Depuis # jour}one{Depuis # jour}many{Depuis # de jours}other{Depuis # jours}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Depuis # heure}one{Depuis # heure}many{Depuis # d\'heures}other{Depuis # heures}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Depuis # minute}one{Depuis # minute}many{Depuis # de minutes}other{Depuis # minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Aucune autoris. d\'utilisation"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"L\'accès le plus récent en tout temps"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Accès le plus récent au cours des 7 derniers jours"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Utilisation des autorisat. dans la dernière heure"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Utilisation des autor. dans les 15 dern. minutes"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Utilisation des autorisat. dans la dernière minute"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Aucune utilisation au cours des dernières 24 heures"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Inutilisée au cours des 7 derniers jours"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Aucune utilisation depuis # jour}one{Aucune utilisation depuis # jour}many{Aucune utilisation depuis # de jours}other{Aucune utilisation depuis # jours}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Aucune utilisation depuis # heure}one{Aucune utilisation depuis # heure}many{Aucune utilisation depuis # d\'heures}other{Aucune utilisation depuis # heures}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Utilisation : 1 application}one{Utilisation : # application}many{Utilisation : # applications}other{Utilisation : # applications}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Tout afficher dans le tableau de bord"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtré par : <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Non autorisées"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Afficher d\'autres applis pouvant accéder à tous les fichiers"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 jour}one{# jour}many{# jours}other{# jours}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 heure}one{# heure}many{# heures}other{# heures}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}one{# minute}many{# minutes}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 seconde}one{# seconde}many{# secondes}other{# secondes}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# heure}one{# heure}many{# d\'heures}other{# heures}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}one{# minute}many{# de minutes}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# seconde}one{# seconde}many{# de secondes}other{# secondes}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Rappels d\'autorisation"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 application non utilisée"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> applications non utilisées"</string>
diff --git a/PermissionController/res/values-fr/strings.xml b/PermissionController/res/values-fr/strings.xml
index 2f01f9786..8a2bf8f03 100644
--- a/PermissionController/res/values-fr/strings.xml
+++ b/PermissionController/res/values-fr/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 jour}one{# jour}many{# jours}other{# jours}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 heure}one{# heure}many{# heures}other{# heures}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}one{# s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# jour}one{# jour}many{# jours}other{# jours}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}one{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Toute autorisation"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Indifférent"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 derniers jours"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Dernières 24 heures"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Dernière heure"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 dernières minutes"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Dernière minute"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Dernier jour (#)}one{Dernier jour (#)}many{# derniers jours}other{# derniers jours}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Dernière heure (#)}one{Dernière heure (#)}many{# dernières heures}other{# dernières heures}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Dernière minute (#)}one{Dernière minute (#)}many{# dernières minutes}other{# dernières minutes}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Aucune autorisation utilisée"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Tous les accès les plus récents"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Accès les plus récents (7 derniers jours)"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Autorisations utilisées (dernière heure)"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Autorisations utilisées (15 dernières minutes)"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Autorisations utilisées (dernière minute)"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Aucune utilisation au cours des dernières 24 heures"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Aucune utilisation au cours des 7 derniers jours"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Non utilisée au cours du dernier jour (#)}one{Non utilisée au cours du dernier jour (#)}many{Non utilisée au cours des # derniers jours}other{Non utilisée au cours des # derniers jours}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Non utilisée au cours de la dernière heure (#)}one{Non utilisée au cours de la dernière heure (#)}many{Non utilisée au cours des # dernières heures}other{Non utilisée au cours des # dernières heures}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Utilisation par 1 appli}one{Utilisation par # appli}many{Utilisation par # applis}other{Utilisation par # applis}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Tout afficher dans le tableau de bord"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Données filtrées par : <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Non autorisées"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Voir plus d\'applis pouvant accéder à tous les fichiers"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 jour}one{# jour}many{# jours}other{# jours}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 heure}one{# heure}many{# heures}other{# heures}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minute}one{# minute}many{# minutes}other{# minutes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 seconde}one{# seconde}many{# secondes}other{# secondes}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# heure}one{# heure}many{# heures}other{# heures}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minute}one{# minute}many{# minutes}other{# minutes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# seconde}one{# seconde}many{# secondes}other{# secondes}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Rappels relatifs aux autorisations"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 application inutilisée"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> applications inutilisées"</string>
diff --git a/PermissionController/res/values-gl/strings.xml b/PermissionController/res/values-gl/strings.xml
index 5692c2710..960f901d2 100644
--- a/PermissionController/res/values-gl/strings.xml
+++ b/PermissionController/res/values-gl/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 día}other{# días}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# día}other{# días}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Calquera permiso"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"En calquera momento"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 días"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Últimos día}other{Últimos # días}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Última hora}other{Últimas # horas}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Último minuto}other{Últimos # minutos}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Non se utilizaron os permisos"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acceso máis recente en todo o tempo"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acceso máis recente nos últimos 7 días"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso dos permisos durante a última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso dos permisos durante os últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso dos permisos durante o último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Non se utilizou nas últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Non se utilizou nos últimos 7 días"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Non se utilizou no último día}other{Non se utilizou nos últimos # días}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Non se utilizou na última hora}other{Non se utilizou nas últimas # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Permiso usado por 1 aplicación}other{Permiso usado por # aplicacións}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver todo no panel de control"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Vista filtrada por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Permiso non concedido"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Ver máis aplicacións con acceso a todos os ficheiros"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 día}other{# días}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Recordatorios de permisos"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplicación que non se usa"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplicacións que non se usan"</string>
diff --git a/PermissionController/res/values-gu/strings.xml b/PermissionController/res/values-gu/strings.xml
index 76fd4affc..9e9f42906 100644
--- a/PermissionController/res/values-gu/strings.xml
+++ b/PermissionController/res/values-gu/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 દિવસ}one{# દિવસ}other{# દિવસ}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 કલાક}one{# કલાક}other{# કલાક}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 મિનિટ}one{# મિનિટ}other{# મિનિટ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# દિવસ}one{# દિવસ}other{# દિવસ}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# કલાક}one{# કલાક}other{# કલાક}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# મિનિટ}one{# મિનિટ}other{# મિનિટ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"કોઈપણ પરવાનગી"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ગમે ત્યારે"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"છેલ્લા 7 દિવસ"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"છેલ્લા 24 કલાક"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"છેલ્લો 1 કલાક"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"છેલ્લી 15 મિનિટ"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"છેલ્લી 1 મિનિટ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{છેલ્લો # દિવસ}one{છેલ્લો # દિવસ}other{છેલ્લા # દિવસ}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{છેલ્લો # કલાક}one{છેલ્લો # કલાક}other{છેલ્લા # કલાક}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{છેલ્લી # મિનિટ}one{છેલ્લી # મિનિટ}other{છેલ્લી # મિનિટ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"પરવાનગીનો ઉપયોગ થયો નથી"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"કોઈ પણ સમયે સૌથી તાજેતરનો ઍક્સેસ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"છેલ્લા 7 દિવસમાં સૌથી તાજેતરનો ઍક્સેસ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"છેલ્લા 1 કલાકમાં પરવાનગીનો વપરાશ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"છેલ્લી 15 મિનિટમાં પરવાનગીનો ઉપયોગ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"છેલ્લી 1 મિનિટમાં પરવાનગીનો ઉપયોગ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"છેલ્લા 24 કલાકમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"છેલ્લા 7 દિવસમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{છેલ્લા # દિવસમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}one{છેલ્લા # દિવસમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}other{છેલ્લા # દિવસમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{છેલ્લા # કલાકમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}one{છેલ્લા # કલાકમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}other{છેલ્લા # કલાકમાં કોઈ ઉપયોગ કરવામાં આવ્યો નથી}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ઍપ દ્વારા ઉપયોગ કરવામાં આવ્યો}one{# ઍપ દ્વારા ઉપયોગ કરવામાં આવ્યો}other{# ઍપ દ્વારા ઉપયોગ કરવામાં આવ્યો}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"બધી વિગતો ડૅશબોર્ડમાં જુઓ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"આના અનુસાર ફિલ્ટર કર્યું: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"મંજૂરી નથી"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"બધી ફાઇલોને ઍક્સેસ કરી શકે તેવી વધુ ઍપ જુઓ"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 દિવસ}one{# દિવસ}other{# દિવસ}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 કલાક}one{# કલાક}other{# કલાક}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 મિનિટ}one{# મિનિટ}other{# મિનિટ}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# કલાક}one{# કલાક}other{# કલાક}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# મિનિટ}one{# મિનિટ}other{# મિનિટ}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"મંજૂરીના રિમાઇન્ડર"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ન વપરાયેલી ઍપ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ન વપરાયેલી ઍપ"</string>
diff --git a/PermissionController/res/values-hi/strings.xml b/PermissionController/res/values-hi/strings.xml
index c6935b926..241899de9 100644
--- a/PermissionController/res/values-hi/strings.xml
+++ b/PermissionController/res/values-hi/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 दिन}one{# दिन}other{# दिन}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 घंटा}one{# घंटा}other{# घंटे}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 मिनट}one{# मिनट}other{# मिनट}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# दिन}one{# दिन}other{# दिन}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# घंटा}one{# घंटा}other{# घंटे}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# मिनट}one{# मिनट}other{# मिनट}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# सेकंड}one{# सेकंड}other{# सेकंड}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"कोई भी अनुमति"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"किसी भी समय"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"पिछले सात दिनों में"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"पिछले 24 घंटों में"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"पिछले एक घंटे में"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"पिछले 15 मिनट में"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"आखिरी एक मिनट"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{पिछला # दिन}one{पिछला # दिन}other{पिछले # दिन}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{पिछला # घंटा}one{पिछला # घंटा}other{पिछले # घंटे}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{पिछला # मिनट}one{पिछला # मिनट}other{पिछले # मिनट}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"अनुमति का इस्तेमाल नहीं हुआ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"किसी भी समय सबसे हाल ही में ऐक्सेस किए गए ऐप्लिकेशन"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"पिछले सात दिनों में सबसे हाल के ऐक्सेस"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"पिछले एक घंटे में अनुमति का इस्तेमाल"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"पिछले 15 मिनटों में अनुमति का इस्तेमाल"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"पिछले एक मिनट में अनुमति का इस्तेमाल"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"पिछले 24 घंटों में इस्तेमाल नहीं किया गया"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"पिछले सात दिनों में इस्तेमाल नहीं किया गया"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{पिछले # दिन में इस्तेमाल नहीं की गई}one{पिछले # दिन में इस्तेमाल नहीं की गई}other{पिछले # दिनों में इस्तेमाल नहीं की गई}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{पिछले # घंटे में इस्तेमाल नहीं की गई}one{पिछले # घंटे में इस्तेमाल नहीं की गई}other{पिछले # घंटों में इस्तेमाल नहीं की गई}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ऐप्लिकेशन ने इस्तेमाल किया}one{# ऐप्लिकेशन ने इस्तेमाल किया}other{# ऐप्लिकेशन ने इस्तेमाल किया}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"डैशबोर्ड में सभी को देखें"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"इससे फ़िल्टर किया गया: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"इन ऐप्लिकेशन के पास अनुमति नहींं है"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ऐसे और ऐप्लिकेशन देखें जो सभी फ़ाइलों को ऐक्सेस कर सकते हैं"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 दिन}one{# दिन}other{# दिन}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 घंटा}one{# घंटा}other{# घंटे}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 मिनट}one{# मिनट}other{# मिनट}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# घंटा}one{# घंटा}other{# घंटे}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# मिनट}one{# मिनट}other{# मिनट}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# सेकंड}one{# सेकंड}other{# सेकंड}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"अनुमति रिमाइंडर"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"एक ऐप्लिकेशन इस्तेमाल नहीं किया जा रहा"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ऐप्लिकेशन इस्तेमाल नहीं किए जा रहे"</string>
diff --git a/PermissionController/res/values-hr/strings.xml b/PermissionController/res/values-hr/strings.xml
index 2b2b1dea0..cfb2b49ed 100644
--- a/PermissionController/res/values-hr/strings.xml
+++ b/PermissionController/res/values-hr/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}one{# s}few{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dan}one{# dan}few{# dana}other{# dana}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}one{# s}few{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Bilo koje dopuštenje"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Bilo kad"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Posljednjih tjedan dana"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Posljednja 24 sata"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Posljednjih sat vremena"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Posljednjih 15 minuta"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Posljednja minuta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{posljednji # dan}one{Posljednji # dan}few{Posljednja # dana}other{Posljednjih # dana}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Posljednjih sat vremena}one{Posljednji # sat}few{Posljednja # sata}other{Posljednjih # sati}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Posljednja # minuta}one{Posljednja # minuta}few{Posljednje # minute}other{Posljednjih # minuta}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nema upotreba dopuštenja"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Posljednji pristup u bilo koje vrijeme"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Posljednji pristup u prethodnih tjedan dana"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Upotreba dopuštenja u posljednjih sat vremena"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Upotreba dopuštenja u posljednjih 15 minuta"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Upotreba dopuštenja u posljednjoj minuti"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nije korišteno u posljednja 24 sata"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nije korišteno u posljednjih sedam dana"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nije korišteno u posljednji # dan}one{Nije korišteno u posljednji # dan}few{Nije korišteno u posljednja # dana}other{Nije korišteno u posljednjih # dana}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nije korišteno u posljednji # sat}one{Nije korišteno u posljednji # sat}few{Nije korišteno u posljednja # sata}other{Nije korišteno u posljednjih # sati}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Koristi 1 aplikacija}one{Koristi # aplikacija}few{Koriste # aplikacije}other{Koristi # aplikacija}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Pogledajte sve na nadzornoj ploči"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrirano po: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nemaju dopuštenje"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Pogledajte koje još aplikacije imaju pristup svim datotekama"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dan}one{# dan}few{# dana}other{# dana}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 h}one{# h}few{# h}other{# h}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 min}one{# min}few{# min}other{# min}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 s}one{# s}few{# s}other{# s}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# sat}one{# sat}few{# sata}other{# sati}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# min}one{# min}few{# min}other{# min}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# s}one{# s}few{# s}other{# s}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Podsjetnici za dopuštenja"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nekorištena aplikacija"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Nekorištenih aplikacija: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-hu/strings.xml b/PermissionController/res/values-hu/strings.xml
index 9b45a8143..a525cb224 100644
--- a/PermissionController/res/values-hu/strings.xml
+++ b/PermissionController/res/values-hu/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 nap}other{# nap}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 óra}other{# óra}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 perc}other{# perc}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 mp}other{# mp}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# nap}other{# nap}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# óra}other{# óra}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# perc}other{# perc}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# mp}other{# mp}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Bármely engedély"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Bármikor"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Elmúlt 7 nap"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Elmúlt 24 óra"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Elmúlt 1 óra"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Elmúlt 15 perc"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Elmúlt 1 perc"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Elmúlt # nap}other{Elmúlt # nap}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Elmúlt # óra}other{Elmúlt # óra}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Elmúlt # perc}other{Elmúlt # perc}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nincs engedélyhasználat"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Legutóbbi hozzáférés bármikor"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Legutóbbi hozzáférés az elmúlt hét nap során"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Engedélyhasználat az elmúlt egy órában"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Engedélyhasználat az elmúlt 15 percben"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Engedélyhasználat az elmúlt egy percben"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Semmi nem használta az elmúlt 24 órában"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Semmi nem használta az elmúlt hét napban"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nem volt használva az elmúlt # nap során}other{Semmi nem használta az elmúlt # napban}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nem volt használva az elmúlt # óra során}other{Semmi nem használta az elmúlt # órában}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 alkalmazás használta}other{# alkalmazás használta}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Összes megtekintése az irányítópulton"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Szűrés alapja: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nem engedélyezett"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"További, minden fájlhoz hozzáférő alkalmazások megtekintése"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 nap}other{# nap}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 óra}other{# óra}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 perc}other{# perc}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 másodperc}other{# másodperc}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# óra}other{# óra}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# perc}other{# perc}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# másodperc}other{# másodperc}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Engedélyekre vonatkozó emlékeztetők"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nem használt alkalmazás"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> nem használt alkalmazás"</string>
diff --git a/PermissionController/res/values-hy/strings.xml b/PermissionController/res/values-hy/strings.xml
index 0c57d6f61..7854ee6fb 100644
--- a/PermissionController/res/values-hy/strings.xml
+++ b/PermissionController/res/values-hy/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 օր}one{# օր}other{# օր}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ժամ}one{# ժամ}other{# ժամ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 րոպե}one{# րոպե}other{# րոպե}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 վրկ}one{# վրկ}other{# վրկ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# օր}one{# օր}other{# օր}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ժամ}one{# ժամ}other{# ժամ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# րոպե}one{# րոպե}other{# րոպե}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# վրկ}one{# վրկ}other{# վրկ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Բոլոր թույլտվությունները"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Ցանկացած ժամանակ"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Վերջին 7 օրում"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Վերջին 24 ժամում"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Վերջին ժամում"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Վերջին 15 րոպեում"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Վերջին 1 րոպեում"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Վերջին # օրում}one{Վերջին # օրում}other{Վերջին # օրում}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Վերջին # ժամում}one{Վերջին # ժամում}other{Վերջին # ժամում}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Վերջին # րոպեում}one{Վերջին # րոպեում}other{Վերջին # րոպեում}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Թույլտվություններ չեն կիրառվել"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Վերջին օգտագործումը ցանկացած ժամանակ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Վերջին օգտագործումը վերջին 7 օրում"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Թույլտվությունների օգտագործումը վերջին 1 ժամում"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Թույլտվությունների օգտագործումը վերջին 15 րոպեում"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Թույլտվությունների օգտագործումը վերջին 1 րոպեում"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Չի օգտագործվել վերջին 24 ժամվա ընթացքում"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Չի օգտագործվել վերջին 7 օրվա ընթացքում"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Չի օգտագործվել վերջին # օրվա ընթացքում}one{Չի օգտագործվել վերջին # օրվա ընթացքում}other{Չի օգտագործվել վերջին # օրվա ընթացքում}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Չի օգտագործվել վերջին # ժամվա ընթացքում}one{Չի օգտագործվել վերջին # ժամվա ընթացքում}other{Չի օգտագործվել վերջին # ժամվա ընթացքում}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Օգտագործվում է 1 հավելվածի կողմից}one{Օգտագործվում է # հավելվածի կողմից}other{Օգտագործվում է # հավելվածի կողմից}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Դիտել բոլորը կառավարման վահանակում"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Զտիչ՝ <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Արգելված"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Տեսնել այլ հավելվածներ, որոնց հասանելի են բոլոր ֆայլերը"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 օր}one{# օր}other{# օր}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ժամ}one{# ժամ}other{# ժամ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 րոպե}one{# րոպե}other{# րոպե}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 վայրկյան}one{# վայրկյան}other{# վայրկյան}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ժամ}one{# ժամ}other{# ժամ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# րոպե}one{# րոպե}other{# րոպե}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# վայրկյան}one{# վայրկյան}other{# վայրկյան}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Հիշեցումներ թույլտվությունների մասին"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 չօգտագործվող հավելված"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> չօգտագործվող հավելված"</string>
diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml
index 11cd4dfe7..0b39e4520 100644
--- a/PermissionController/res/values-in/strings.xml
+++ b/PermissionController/res/values-in/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 hari}other{# hari}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 jam}other{# jam}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 mnt}other{# mnt}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 dtk}other{# dtk}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# hari}other{# hari}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# menit}other{# menit}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# detik}other{# detik}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Izin apa pun"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Kapan saja"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 hari terakhir"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 jam terakhir"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 jam terakhir"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 menit terakhir"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 menit terakhir"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# hari terakhir}other{# hari terakhir}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# jam terakhir}other{# jam terakhir}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# menit terakhir}other{# menit terakhir}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Tidak ada penggunaan izin"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Akses terbaru kapan saja"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Akses terbaru dalam 7 hari terakhir"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Penggunaan izin dalam 1 jam terakhir"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Penggunaan izin dalam 15 menit terakhir"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Penggunaan izin dalam 1 menit terakhir"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Tidak digunakan dalam 24 jam terakhir"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Tidak digunakan dalam 7 hari terakhir"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Tidak digunakan dalam # hari terakhir}other{Tidak digunakan dalam # hari terakhir}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Tidak digunakan dalam # jam terakhir}other{Tidak digunakan dalam # jam terakhir}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Digunakan 1 aplikasi}other{Digunakan # aplikasi}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Lihat semua di Dasbor"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Difilter menurut: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Tidak diizinkan"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Lihat aplikasi lain yang dapat mengakses semua file"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 hari}other{# hari}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 jam}other{# jam}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 menit}other{# menit}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 detik}other{# detik}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# menit}other{# menit}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# detik}other{# detik}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Pengingat izin"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplikasi yang tidak digunakan"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplikasi tidak digunakan"</string>
diff --git a/PermissionController/res/values-is/strings.xml b/PermissionController/res/values-is/strings.xml
index ea631a8ce..97d15ba7f 100644
--- a/PermissionController/res/values-is/strings.xml
+++ b/PermissionController/res/values-is/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dagur}one{# dagur}other{# dagar}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 klukkustund}one{# klukkustund}other{# klukkustundir}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 mín.}one{# mín.}other{# mín.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek.}one{# sek.}other{# sek.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dagur}one{# dagur}other{# dagar}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# klukkustund}one{# klukkustund}other{# klukkustundir}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# mín.}one{# mín.}other{# mín.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek.}one{# sek.}other{# sek.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Hvaða heimild sem er"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Hvenær sem er"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Síðustu sjö daga"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Síðasti sólarhringur"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Síðustu klukkustund"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Síðustu 15 mínútur"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Síðasta mínúta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Undanfarinn # dag}one{Undanfarinn # dag}other{Undanfarna # daga}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Síðustu # klst.}one{Síðustu # klst.}other{Síðustu # klst.}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Síðasta # mín.}one{Síðustu # mín.}other{Síðustu # mín.}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Engin heimildanotkun"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Síðasti aðgangur, hvenær sem er"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Síðasti aðgangur síðustu 7 daga"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Heimildanotkun síðustu klukkustund"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Heimildanotkun síðustu 15 mínútur"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Heimildanotkun síðustu mínútu"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ekki notað síðasta sólarhringinn"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Ekki notað síðastliðna 7 daga"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Ekki notað undanfarinn # dag}one{Ekki notað undanfarinn # dag}other{Ekki notað undanfarna # daga}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Ekki notað síðustu # klst.}one{Ekki notað síðustu # klst.}other{Ekki notað síðustu # klst.}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Notað af 1 forriti}one{Notað af # forriti}other{Notað af # forritum}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Sjá allt á stjórnborði"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Síað eftir: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ekki heimilað"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Sjá fleiri forrit sem geta opnað allar skrár"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dagur}one{# dagur}other{# dagar}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 klukkustund}one{# klukkustund}other{# klukkustundir}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 mínúta}one{# mínúta}other{# mínútur}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekúnda}one{# sekúnda}other{# sekúndur}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# klukkustund}one{# klukkustund}other{# klukkustundir}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# mínúta}one{# mínúta}other{# mínútur}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekúnda}one{# sekúnda}other{# sekúndur}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Áminningar um heimild"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ónotað forrit"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ónotuð forrit"</string>
diff --git a/PermissionController/res/values-it/strings.xml b/PermissionController/res/values-it/strings.xml
index 7199e0045..c37a5671f 100644
--- a/PermissionController/res/values-it/strings.xml
+++ b/PermissionController/res/values-it/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 giorno}many{# giorni}other{# giorni}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ora}many{# ore}other{# ore}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}many{# sec}other{# sec}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# giorno}many{# giorni}other{# giorni}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ora}many{# ore}other{# ore}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sec}many{# sec}other{# sec}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Qualsiasi autorizzazione"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Qualsiasi data"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Ultimi 7 giorni"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Ultime 24 ore"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Ultima ora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Ultimi 15 minuti"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Ultimo minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Ultimo giorno}many{Ultimi # giorni}other{Ultimi # giorni}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Ultima ora}many{Ultime # ore}other{Ultime # ore}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Ultimo minuto}many{Ultimi # minuti}other{Ultimi # minuti}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Autorizzazioni non usate"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Accesso più recente in qualsiasi momento"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Accesso più recente negli ultimi 7 giorni"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso autorizzazioni nell\'ultima ora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso autorizzazioni negli ultimi 15 minuti"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso autorizzazioni nell\'ultimo minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Autorizzazione non utilizzata nelle ultime 24 ore"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Autorizzazione non utilizzata negli ultimi 7 giorni"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Autorizzazione non utilizzata nell\'ultimo giorno}many{Autorizzazione non utilizzata negli ultimi # giorni}other{Autorizzazione non utilizzata negli ultimi # giorni}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Autorizzazione non utilizzata nell\'ultima ora}many{Autorizzazione non utilizzata nelle ultime # ore}other{Autorizzazione non utilizzata nelle ultime # ore}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Autorizzazione usata da 1 app}many{Used by # apps}other{Autorizzazione usata da # app}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Mostra tutto nella Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrata per: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Non autorizzate"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Visualizza altre app che possono accedere a tutti i file"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 giorno}many{# giorni}other{# giorni}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ora}many{# ore}other{# ore}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}many{# minuti}other{# minuti}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 secondo}many{# secondi}other{# secondi}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ora}many{# ore}other{# ore}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}many{# minuti}other{# minuti}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# secondo}many{# secondi}other{# secondi}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Promemoria autorizzazione"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app inutilizzata"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> app inutilizzate"</string>
diff --git a/PermissionController/res/values-iw/strings.xml b/PermissionController/res/values-iw/strings.xml
index 4525e9c1b..696b5cac7 100644
--- a/PermissionController/res/values-iw/strings.xml
+++ b/PermissionController/res/values-iw/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{יום אחד}two{יומיים}many{# ימים}other{# ימים}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{שעה אחת}two{שעתיים}many{# שעות}other{# שעות}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{דקה אחת}two{# דקות}many{# דקות}other{# דקות}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{יום אחד}two{יומיים}many{# ימים}other{# ימים}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{שעה}two{שעתיים}many{# שעות}other{# שעות}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{דקה אחת}two{# דקות}many{# דקות}other{# דקות}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"כל הרשאה שהיא"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"בכל עת"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 הימים האחרונים"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ב-24 השעות החולפות"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"בשעה האחרונה"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 הדקות האחרונות"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"הדקה האחרונה"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ביום האחרון}two{ביומיים האחרונים}many{ב-# הימים האחרונים}other{ב-# הימים האחרונים}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{בשעה האחרונה}two{בשעתיים האחרונות}many{ב-# השעות האחרונות}other{ב-# השעות האחרונות}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{בדקה האחרונה}two{ב-# הדקות האחרונות}many{ב-# הדקות האחרונות}other{ב-# הדקות האחרונות}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"אין שימוש בהרשאות"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"הגישה האחרונה בכל מסגרת זמן"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"הגישה האחרונה ב-7 הימים האחרונים"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"שימוש בהרשאות בשעה האחרונה"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"שימוש בהרשאות ב-15 הדקות האחרונות"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"שימוש בהרשאות בדקה האחרונה"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"לא נעשה שימוש ב-24 השעות האחרונות"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"לא נעשה שימוש ב-7 הימים האחרונים"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{לא נעשה שימוש ביום האחרון}two{לא נעשה שימוש ביומיים האחרונים}many{לא נעשה שימוש ב-# הימים האחרונים}other{לא נעשה שימוש ב-# הימים האחרונים}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{לא נעשה שימוש בשעה האחרונה}two{לא נעשה שימוש בשעתיים האחרונות}many{לא נעשה שימוש ב-# השעות האחרונות}other{לא נעשה שימוש ב-# השעות האחרונות}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{בשימוש על ידי אפליקציה אחת}two{בשימוש על ידי # אפליקציות}many{בשימוש על ידי # אפליקציות}other{בשימוש על ידי # אפליקציות}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"הצגת כל הפרטים במרכז השליטה"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"סינון לפי: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"אין הרשאה"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"לצפייה באפליקציות נוספות שיכולות לגשת לכל הקבצים"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{יום אחד}two{יומיים}many{# ימים}other{# ימים}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{שעה אחת}two{שעתיים}many{# שעות}other{# שעות}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{דקה אחת}two{# דקות}many{# דקות}other{# דקות}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{שעה}two{שעתיים}many{# שעות}other{# שעות}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{דקה אחת}two{# דקות}many{# דקות}other{# דקות}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"תזכורות להרשאות"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"אפליקציה אחת שמזמן לא השתמשת בה"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> אפליקציות שמזמן לא השתמשת בהן"</string>
diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml
index 200e704fd..db8fd2cc4 100644
--- a/PermissionController/res/values-ja/strings.xml
+++ b/PermissionController/res/values-ja/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 日}other{# 日}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 時間}other{# 時間}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 分}other{# 分}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# 日}other{# 日}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# 時間}other{# 時間}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# 分}other{# 分}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"すべての権限"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"全期間"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"過去 7 日間"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"過去 24 時間"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"過去 1 時間"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"過去 15 分間"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"過去 1 分間"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{過去 # 日}other{過去 # 日間}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{過去 # 時間}other{過去 # 時間}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{過去 # 分間}other{過去 # 分間}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"権限の使用はなし"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"最近のアクセス状況(常時)"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"最近のアクセス状況(過去 7 日間)"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"権限の使用状況(過去 1 時間)"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"権限の使用状況(過去 15 分間)"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"権限の使用状況(過去 1 分間)"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"過去 24 時間では使用されていません"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"過去 7 日間では使用されていません"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{過去 # 日は使用されていません}other{過去 # 日間は使用されていません}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{過去 # 時間は使用されていません}other{過去 # 時間は使用されていません}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 個のアプリで使用}other{# 個のアプリで使用}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ダッシュボードにすべて表示"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"フィルタ: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"許可しない"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"すべてのファイルにアクセスできるアプリをもっと見る"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 日}other{# 日}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 時間}other{# 時間}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 分}other{# 分}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# 時間}other{# 時間}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# 分}other{# 分}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"権限のリマインダー"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"使用されていないアプリ: 1 個"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"使用されていないアプリ: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> 個"</string>
diff --git a/PermissionController/res/values-ka/strings.xml b/PermissionController/res/values-ka/strings.xml
index d8cce80cb..f4ed285a7 100644
--- a/PermissionController/res/values-ka/strings.xml
+++ b/PermissionController/res/values-ka/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 დღე}other{# დღე}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 საათი}other{# საათი}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 წთ}other{# წთ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 წმ}other{# წმ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# დღე}other{# დღე}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# საათი}other{# საათი}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# წთ}other{# წთ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# წმ}other{# წმ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ნებისმიერი ნებართვა"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ნებისმიერი დრო"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ბოლო 7 დღე"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ბოლო 24 საათი"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"ბოლო 1 საათი"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ბოლო 15 წუთი"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ბოლო 1 წუთი"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ბოლო # დღე}other{ბოლო # დღე}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{ბოლო # საათი}other{ბოლო # საათი}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ბოლო # წუთი}other{ბოლო # წუთი}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ამ ნებართვებს აპები არ იყენებს"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"უახლესი წვდომა ნებისმიერი დროისთვის"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"უახლესი წვდომა ბოლო 7 დღეში"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ნებართვების გამოყენება ბოლო 1 საათში"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ნებართვების გამოყენება ბოლო 15 წუთში"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ნებართვების გამოყენება ბოლო 1 წუთში"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"არ გამოყენებულა ბოლო 24 საათის განმავლობაში"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"არ გამოყენებულა ბოლო 7 დღის განმავლობაში"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{არ გამოყენებულა ბოლო # დღეში}other{არ გამოყენებულა ბოლო # დღეში}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{არ გამოყენებულა ბოლო # საათში}other{არ გამოყენებულა ბოლო # საათში}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{იყენებს 1 აპი}other{იყენებს # აპი}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ყველაფრის ნახვა საინფორმაციო დაფაზე"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"გაფილტვრის კრიტერიუმი: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"არ არის დაშვებული"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"სხვა აპების ნახვა, რომლებსაც ყველა ფაილზე წვდომა შეუძლია"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 დღე}other{# დღე}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 საათი}other{# საათი}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 წუთი}other{# წუთი}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 წამი}other{# წამი}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# საათი}other{# საათი}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# წუთი}other{# წუთი}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# წამი}other{# წამი}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"შეხსენებები ნებართვის შესახებ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 გამოუყენებელი აპი"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> გამოუყენებელი აპი"</string>
diff --git a/PermissionController/res/values-kk/strings.xml b/PermissionController/res/values-kk/strings.xml
index 38974f19a..1b98346fd 100644
--- a/PermissionController/res/values-kk/strings.xml
+++ b/PermissionController/res/values-kk/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 күн}other{# күн}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 сағат}other{# сағат}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мин}other{# мин}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 с}other{# с}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# күн}other{# күн}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# сағат}other{# сағат}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мин}other{# мин}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# с}other{# с}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Кез келген рұқсат"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Кез келген уақытта"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Соңғы 7 күн"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Соңғы 24 сағат"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Соңғы 1 сағат"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Соңғы 15 минут"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Соңғы 1 минут"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Соңғы # күн}other{Соңғы # күн}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Соңғы # сағат}other{Соңғы # сағат}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Соңғы # минут}other{Соңғы # минут}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Рұқсаттар пайдаланылмаған"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Бүкіл уақыт бойғы соңғы пайдаланылуы"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Соңғы 7 күндегі пайдаланылуы"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Рұқсаттың соңғы 1 сағатта пайдаланылуы"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Рұқсаттың соңғы 15 минутта пайдаланылуы"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Рұқсаттың соңғы 1 минутта пайдаланылуы"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Соңғы 24 сағатта пайдаланылмады."</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Соңғы 7 күнде пайдаланылмады."</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Соңғы # күнде пайдаланылмады.}other{Соңғы # күнде пайдаланылмады.}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Соңғы # сағатта пайдаланылмады.}other{Соңғы # сағатта пайдаланылмады.}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 қолданба пайдаланды}other{# қолданба пайдаланды}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Барлығын бақылау тақтасынан көру"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Сүзгі шарты: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Рұқсат берілмегендер"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Барлық файлды пайдалана алатын тағы басқа қолданбаларды көру"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 күн}other{# күн}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 сағат}other{# сағат}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минут}other{# минут}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунд}other{# секунд}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# сағат}other{# сағат}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минут}other{# минут}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунд}other{# секунд}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Рұқсат туралы еске салғыштар"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 пайдаланылмайтын қолданба"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> пайдаланылмайтын қолданба бар"</string>
diff --git a/PermissionController/res/values-km/strings.xml b/PermissionController/res/values-km/strings.xml
index 1396915f9..698b8913c 100644
--- a/PermissionController/res/values-km/strings.xml
+++ b/PermissionController/res/values-km/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ថ្ងៃ}other{# ថ្ងៃ}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ម៉ោង}other{# ម៉ោង}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ន}other{# ន}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 វិ}other{# វិ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ថ្ងៃ}other{# ថ្ងៃ}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ម៉ោង}other{# ម៉ោង}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# នាទីមុន}other{# ន}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# វិ}other{# វិ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ការអនុញ្ញាត​ណាមួយ"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ពេល​ណា​ក៏​បាន"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 ថ្ងៃ​ចុងក្រោយ"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 ម៉ោង​ចុងក្រោយ"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 ម៉ោង​ចុងក្រោយ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 នាទី​ចុងក្រោយ"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 នាទី​ចុងក្រោយ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# ថ្ងៃចុងក្រោយ}other{# ថ្ងៃចុងក្រោយ}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# ម៉ោង​ចុងក្រោយ}other{# ម៉ោង​ចុងក្រោយ}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# នាទី​ចុងក្រោយ}other{# នាទី​ចុងក្រោយ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"គ្មាន​ការប្រើប្រាស់​ការអនុញ្ញាត​ទេ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ការចូលប្រើ​ថ្មី​បំផុតគ្រប់ពេល"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ការចូលប្រើចុងក្រោយបំផុត​ក្នុងរយៈពេល 7 ថ្ងៃចុងក្រោយ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ការប្រើប្រាស់​ការអនុញ្ញាត​ក្នុងរយៈពេល 1 ម៉ោងចុងក្រោយ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ការប្រើប្រាស់​ការអនុញ្ញាត​ក្នុងរយៈពេល​ 15 នាទីចុងក្រោយ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ការប្រើប្រាស់​ការអនុញ្ញាត​ក្នុងរយៈពេល 1 នាទីចុងក្រោយ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"មិនបានប្រើក្នុងរយៈពេល 24 ម៉ោងចុងក្រោយ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"មិនបានប្រើក្នុងរយៈពេល 7 ថ្ងៃចុងក្រោយ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{មិន​បាន​ប្រើ​ក្នុងរយៈពេល # ថ្ងៃ​ចុងក្រោយ}other{មិនបានប្រើក្នុងរយៈពេល # ថ្ងៃចុងក្រោយ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{មិនបានប្រើក្នុងរយៈពេល # ម៉ោងចុងក្រោយ}other{មិនបានប្រើក្នុងរយៈពេល # ម៉ោងចុងក្រោយ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{បាន​ប្រើដោយ​កម្មវិធី 1}other{បាន​ប្រើដោយ​កម្មវិធី #}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"មើល​ទាំងអស់នៅក្នុងផ្ទាំង​គ្រប់គ្រង"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"ត្រង​តាម៖ <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"មិន​បានអនុញ្ញាត​"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"មើលកម្មវិធីច្រើនទៀតដែលអាចចូលប្រើឯកសារទាំងអស់បាន"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ថ្ងៃ}other{# ថ្ងៃ}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ម៉ោង}other{# ម៉ោង}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 នាទី}other{# នាទី}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 វិនាទី}other{# វិនាទី}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ម៉ោង}other{# ម៉ោង}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# នាទី}other{# នាទី}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# វិនាទី}other{# វិនាទី}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ការរំលឹក​អំពី​ការអនុញ្ញាត"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"កម្មវិធី​ដែលមិនប្រើ​ចំនួន 1"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"កម្មវិធី​ដែលមិនប្រើ​ចំនួន <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-kn/strings.xml b/PermissionController/res/values-kn/strings.xml
index 83cc355b3..ef2fd7912 100644
--- a/PermissionController/res/values-kn/strings.xml
+++ b/PermissionController/res/values-kn/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ದಿನ}one{# ದಿನಗಳು}other{# ದಿನಗಳು}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ಗಂಟೆ}one{# ಗಂಟೆಗಳು}other{# ಗಂಟೆಗಳು}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ನಿಮಿಷ}one{# ನಿಮಿಷಗಳು}other{# ನಿಮಿಷಗಳು}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡ್‌ಗಳು}other{# ಸೆಕೆಂಡ್‌ಗಳು}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ದಿನ}one{# ದಿನಗಳು}other{# ದಿನಗಳು}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ಗಂಟೆ}one{# ಗಂಟೆಗಳು}other{# ಗಂಟೆಗಳು}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# ನಿಮಿಷ}one{# ನಿಮಿಷಗಳು}other{# ನಿಮಿಷಗಳು}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡ್‌ಗಳು}other{# ಸೆಕೆಂಡ್‌ಗಳು}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ಯಾವುದೇ ಅನುಮತಿ"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ಯಾವುದಾದರೂ ಸಮಯದಲ್ಲಿ"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ಕಳೆದ 7 ದಿನಗಳು"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ಕೊನೆಯ 24 ಗಂಟೆಗಳು"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 ಗಂಟೆಯ ಹಿಂದೆ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ಹಿಂದಿನ 15 ನಿಮಿಷಗಳು"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ಕಳೆದ 1 ನಿಮಿಷ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ಕಳೆದ # ದಿನ}one{ಕಳೆದ # ದಿನಗಳು}other{ಕಳೆದ # ದಿನಗಳು}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# ಗಂಟೆಯ ಹಿಂದೆ}one{ಕೊನೆಯ # ಗಂಟೆಗಳು}other{ಕೊನೆಯ # ಗಂಟೆಗಳು}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ಕಳೆದ # ನಿಮಿಷ}one{ಹಿಂದಿನ # ನಿಮಿಷಗಳು}other{ಹಿಂದಿನ # ನಿಮಿಷಗಳು}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ಅನುಮತಿಯ ಬಳಕೆಗಳು ಇಲ್ಲ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿನ ತೀರಾ ಇತ್ತೀಚಿನ ಪ್ರವೇಶ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ಕಳೆದ 7 ದಿನಗಳಲ್ಲಿನ ತೀರಾ ಇತ್ತೀಚಿನ ಪ್ರವೇಶ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ಕಳೆದ 1 ಗಂಟೆಯಲ್ಲಿನ ಅನುಮತಿಯ ಬಳಕೆ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ಕಳೆದ 15 ನಿಮಿಷಗಳಲ್ಲಿನ ಅನುಮತಿಯ ಬಳಕೆ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ಕಳೆದ 1 ನಿಮಿಷದಲ್ಲಿನ ಅನುಮತಿಯ ಬಳಕೆ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ಕಳೆದ 24 ಗಂಟೆಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ಕಳೆದ 7 ದಿನಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ಕಳೆದ # ದಿನದಲ್ಲಿ ಬಳಸಿಲ್ಲ}one{ಕಳೆದ # ದಿನಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ}other{ಕಳೆದ # ದಿನಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ಕಳೆದ # ಗಂಟೆಯಲ್ಲಿ ಬಳಸಿಲ್ಲ}one{ಕಳೆದ # ಗಂಟೆಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ}other{ಕಳೆದ # ಗಂಟೆಗಳಲ್ಲಿ ಬಳಸಿಲ್ಲ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ಆ್ಯಪ್ ಬಳಸಿದೆ}one{# ಆ್ಯಪ್‌ಗಳು ಬಳಸಿವೆ}other{# ಆ್ಯಪ್‌ಗಳು ಬಳಸಿವೆ}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ಎಲ್ಲವನ್ನೂ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ನಲ್ಲಿ ವೀಕ್ಷಿಸಿ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"ಈ ಆಧಾರದ ಮೇಲೆ ಫಿಲ್ಟರ್ ಮಾಡಲಾಗಿದೆ: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ಅನುಮತಿಸಿಲ್ಲದಿರುವುದು"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ಎಲ್ಲಾ ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದಾದ ಇನ್ನಷ್ಟು ಆ್ಯಪ್‌ಗಳನ್ನು ನೋಡಿ"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ದಿನ}one{# ದಿನಗಳು}other{# ದಿನಗಳು}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ಗಂಟೆ}one{# ಗಂಟೆಗಳು}other{# ಗಂಟೆಗಳು}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 ನಿಮಿಷ}one{# ನಿಮಿಷಗಳು}other{# ನಿಮಿಷಗಳು}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡ್‌ಗಳು}other{# ಸೆಕೆಂಡ್‌ಗಳು}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ಗಂಟೆ}one{# ಗಂಟೆಗಳು}other{# ಗಂಟೆಗಳು}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# ನಿಮಿಷ}one{# ನಿಮಿಷಗಳು}other{# ನಿಮಿಷಗಳು}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡ್‌ಗಳು}other{# ಸೆಕೆಂಡ್‌ಗಳು}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ಅನುಮತಿ ಜ್ಞಾಪನೆಗಳು"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ಬಳಕೆಯಾಗದ ಆ್ಯಪ್"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ಬಳಕೆಯಾಗದ ಆ್ಯಪ್‌ಗಳು"</string>
diff --git a/PermissionController/res/values-ko/strings.xml b/PermissionController/res/values-ko/strings.xml
index c1252a3fc..d2eba81c3 100644
--- a/PermissionController/res/values-ko/strings.xml
+++ b/PermissionController/res/values-ko/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1일}other{#일}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1시간}other{#시간}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1분}other{#분}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1초}other{#초}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{#일}other{#일}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{#시간}other{#시간}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{#분}other{#분}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{#초}other{#초}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"모든 권한"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"전체 기간"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"최근 7일"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"최근 24시간"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"최근 1시간"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"최근 15분"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"최근 1분"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{지난 #일}other{지난 #일}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{최근 #시간}other{최근 #시간}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{최근 #분}other{최근 #분}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"사용 권한 없음"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"가장 최근에 액세스한 앱"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"지난 7일 동안 가장 최근에 액세스한 앱"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"지난 1시간 동안 사용된 권한"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"지난 15분 동안 사용된 권한"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"지난 1분 동안 사용된 권한"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"지난 24시간 이내에 사용하지 않음"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"지난 7일 이내에 사용하지 않음"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{지난 #일 동안 사용하지 않음}other{지난 #일 동안 사용하지 않음}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{지난 #시간 동안 사용하지 않음}other{지난 #시간 동안 사용하지 않음}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{앱 1개에서 사용}other{앱 #개에서 사용}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"대시보드에서 모두 보기"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"필터링 기준: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"허용되지 않음"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"모든 파일에 액세스할 수 있는 앱 더보기"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1일}other{#일}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1시간}other{#시간}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1분}other{#분}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1초}other{#초}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{#시간}other{#시간}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{#분}other{#분}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{#초}other{#초}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"권한 알림"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"사용하지 않는 앱 1개"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"사용하지 않는 앱 <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>개"</string>
diff --git a/PermissionController/res/values-ky/strings.xml b/PermissionController/res/values-ky/strings.xml
index d65b5b961..700854af8 100644
--- a/PermissionController/res/values-ky/strings.xml
+++ b/PermissionController/res/values-ky/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 күн}other{# күн}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 саат}other{# саат}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мүн.}other{# мүн.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 сек.}other{# сек.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# күн}other{# күн}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# саат}other{# саат}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мүн.}other{# мүн.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# сек.}other{# сек.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Бардык уруксаттар"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Каалаган убакта"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Акыркы 7 күндө"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Акыркы 24 саатта"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Акыркы 1 саатта"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Акыркы 15 мүнөттө"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Акыркы 1 мүнөт"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Акыркы # күндө}other{Акыркы # күндө}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Акыркы # саатта}other{Акыркы # саатта}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Акыркы # мүнөттө}other{Акыркы # мүнөттө}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Уруксаттар колдонулган жок"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Бардык убакыттагы эң акыркы колдонулушу"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Өткөн 7 күндүн ичиндеги эң акыркы колдонулушу"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Акыркы 1 саатта колдонулган уруксаттар"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Акыркы 15 мүнөттө уруксаттардын колдонулушу"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Акыркы 1 мүнөттө уруксаттардын колдонулушу"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Акыркы 24 сааттын ичинде колдонулган жок"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Акыркы 7 күндө колдонулган жок"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Акыркы # күндө колдонулган жок}other{Акыркы # күндө колдонулган жок}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Акыркы # саатта колдонулган жок}other{Акыркы # саатта колдонулган жок}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 колдонмо пайдаланды}other{# колдонмо пайдаланды}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Баарын Куралдар тактасында көрүү"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Чыпка: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Тыюу салынган"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Дагы кайсы колдонмолорго бардык файлдар жеткиликтүү?"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 күн}other{# күн}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 саат}other{# саат}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 мүнөт}other{# мүнөт}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунд}other{# секунд}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# саат}other{# саат}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# мүнөт}other{# мүнөт}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунд}other{# секунд}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Уруксат жөнүндө эстеткичтер"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 колдонулбаган колдонмо"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> колдонулбаган колдонмо"</string>
diff --git a/PermissionController/res/values-lo/strings.xml b/PermissionController/res/values-lo/strings.xml
index 22609be0a..d6b330346 100644
--- a/PermissionController/res/values-lo/strings.xml
+++ b/PermissionController/res/values-lo/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ມື້}other{# ມື້}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ນທ}other{# ນທ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 ວິ}other{# ວິ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ມື້}other{# ມື້}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# ນທ}other{# ນທ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ວິ}other{# ວິ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ສິດອະນຸຍາດໃດກໍໄດ້"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ເວລາໃດກໍໄດ້"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 ມື້ທີ່ຜ່ານມາ"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 ຊົ່ວໂມງທີ່ຜ່ານມາ"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 ຊົ່ວໂມງທີ່ຜ່ານມາ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 ນາທີຜ່ານມາ"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 ນາທີທີ່ຜ່ານມາ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# ມື້ທີ່ຜ່ານມາ}other{# ມື້ທີ່ຜ່ານມາ}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# ຊົ່ວໂມງທີ່ຜ່ານມາ}other{# ຊົ່ວໂມງທີ່ຜ່ານມາ}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# ນາທີທີ່ຜ່ານມາ}other{# ນາທີທີ່ຜ່ານມາ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ບໍ່ມີການນຳໃຊ້ສິດອະນຸຍາດ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ການເຂົ້າເຖິງຫຼ້າສຸດຕອນໃດກໍໄດ້"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ເຂົ້າເຖິງຫຼ້າສຸດໃນ 7 ມື້ທີ່ຜ່ານມາ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ການນຳໃຊ້ສິດອະນຸຍາດໃນ 1 ຊົ່ວໂມງທີ່ຜ່ານມາ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ການນຳໃຊ້ສິດອະນຸຍາດໃນ 15 ນາທີທີ່ຜ່ານມາ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ການນຳໃຊ້ສິດອະນຸຍາດໃນ 1 ນາທີທີ່ຜ່ານມາ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ບໍ່ໄດ້ໃຊ້ໃນ 24 ຊົ່ວໂມງທີ່ຜ່ານມາ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ບໍ່ໄດ້ໃຊ້ໃນ 7 ມື້ທີ່ຜ່ານມາ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ບໍ່ໄດ້ໃຊ້ໃນ # ມື້ທີ່ຜ່ານມາ}other{ບໍ່ໄດ້ໃຊ້ໃນ # ມື້ທີ່ຜ່ານມາ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ບໍ່ໄດ້ໃຊ້ໃນ # ຊົ່ວໂມງທີ່ຜ່ານມາ}other{ບໍ່ໄດ້ໃຊ້ໃນ # ຊົ່ວໂມງທີ່ຜ່ານມາ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{ໃຊ້ໂດຍ 1 ແອັບ}other{ໃຊ້ໂດຍ # ແອັບ}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ເບິ່ງທັງໝົດໃນແຜງໜ້າປັດ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"ກັ່ນຕອງແລ້ວໂດຍ: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ບໍ່ອະນຸຍາດ"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ເບິ່ງແອັບເພີ່ມເຕີມທີ່ສາມາດເຂົ້າເຖິງໄຟລ໌ທັງໝົດໄດ້"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ມື້}other{# ມື້}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 ນາທີ}other{# ນາທີ}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 ວິນາທີ}other{# ວິນາທີ}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ຊົ່ວໂມງ}other{# ຊົ່ວໂມງ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# ນາທີ}other{# ນາທີ}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ວິນາທີ}other{# ວິນາທີ}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ການແຈ້ງເຕືອນການອະນຸຍາດ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ແອັບທີ່ບໍ່ໄດ້ໃຊ້"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ແອັບທີ່ບໍ່ໄດ້ໃຊ້"</string>
diff --git a/PermissionController/res/values-lt/strings.xml b/PermissionController/res/values-lt/strings.xml
index 0e6f08683..e530bb680 100644
--- a/PermissionController/res/values-lt/strings.xml
+++ b/PermissionController/res/values-lt/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • „<xliff:g id="APP_NAME">%2$s</xliff:g>“ • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 diena}one{# diena}few{# dienos}many{# dienos}other{# dienų}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 valanda}one{# valanda}few{# valandos}many{# valandos}other{# valandų}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 minutė}one{# minutė}few{# minutės}many{# minutės}other{# minučių}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# diena}one{# diena}few{# dienos}many{# dienos}other{# dienų}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# valanda}one{# valanda}few{# valandos}many{# valandos}other{# valandų}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# minutė}one{# minutė}few{# minutės}many{# minutės}other{# minučių}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Bet koks leidimas"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Bet koks laikas"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Pastarosios 7 dienos"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Pastarosios 24 valandos"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Pastaroji 1 valanda"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Pastarosios 15 minučių"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Pastaroji minutė"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Pastaroji # diena}one{Pastaroji # diena}few{Pastarosios # dienos}many{Pastarosios # dienos}other{Pastarųjų # dienų}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Pastaroji # valanda}one{Pastaroji # valanda}few{Pastarosios # valandos}many{Pastarosios # valandos}other{Pastarųjų # valandų}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Pastaroji # minutė}one{Pastaroji # minutė}few{Pastarosios # minutės}many{Pastarosios # minutės}other{Pastarųjų # minučių}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Leidimai nenaudoti"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Paskutinį kartą pasiekta bet kuriuo metu"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Paskutinį kartą pasiekta per pastarąsias 7 dienas"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Leidimo naudojimas per pastarąją 1 valandą"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Leidimo naudojimas per pastarąsias 15 minučių"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Leidimo naudojimas per pastarąją 1 minutę"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nenaudota per pastarąsias 24 val."</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nenaudota per pastarąsias septynias dienas"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nenaudota per pastarąją # dieną}one{Nenaudota per pastarąją # dieną}few{Nenaudota per pastarąsias # dienas}many{Nenaudota per pastarosios # dienos}other{Nenaudota per pastarąsias # dienų}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nenaudota per pastarąją # valandą}one{Nenaudota per pastarąją # valandą}few{Nenaudota per pastarąsias # valandas}many{Nenaudota per pastarosios # valandos}other{Nenaudota per pastarąsias # valandų}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Naudojama 1 programoje}one{Naudojama # programoje}few{Naudojama # programose}many{Naudojama # programos}other{Naudojama # programų}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Žr. viską informacijos suvestinėje"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtruota pagal: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Neleidžiama"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Peržiūrėti daugiau programų, galinčių pasiekti visus failus"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 diena}one{# diena}few{# dienos}many{# dienos}other{# dienų}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 valanda}one{# valanda}few{# valandos}many{# valandos}other{# valandų}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minutė}one{# minutė}few{# minutės}many{# minutės}other{# minučių}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# valanda}one{# valanda}few{# valandos}many{# valandos}other{# valandų}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minutė}one{# minutė}few{# minutės}many{# minutės}other{# minučių}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Leidimų priminimai"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nenaudojama programa"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Nenaudojamų programų: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-lv/strings.xml b/PermissionController/res/values-lv/strings.xml
index 81f20addf..8d9597328 100644
--- a/PermissionController/res/values-lv/strings.xml
+++ b/PermissionController/res/values-lv/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 diena}zero{# dienu}one{# diena}other{# dienas}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 stunda}zero{# stundu}one{# stunda}other{# stundas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}zero{# min}one{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}zero{# s}one{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# diena}zero{# dienu}one{# diena}other{# dienas}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# stunda}zero{# stundu}one{# stunda}other{# stundas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}zero{# min}one{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}zero{# s}one{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Jebkura atļauja"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Jebkurā laikā"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Pēdējās 7 dienās"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Pēdējās 24 stundās"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Pēdējā stundā"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Pēdējās 15 minūtēs"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Pēdējā minūtē"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Pēdējā # dienā}zero{Pēdējās # dienās}one{Pēdējā # dienā}other{Pēdējās # dienās}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Pēdējā # stundā}zero{Pēdējās # stundās}one{Pēdējā # stundā}other{Pēdējās # stundās}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Pēdējā # minūtē}zero{Pēdējās # minūtēs}one{Pēdējā # minūtē}other{Pēdējās # minūtēs}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nav lietota neviena atļauja"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Nesenākā piekļuve jebkurā laikā"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Nesenākā piekļuve pēdējo 7 dienu laikā"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Atļauju lietojums pēdējās stundas laikā"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Atļauju lietojums pēdējās 15 minūtēs"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Atļauju lietojums pēdējā minūtē"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Pēdējo 24 stundu laikā nav izmantota"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Pēdējo 7 dienu laikā nav izmantota"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Pēdējās # dienas laikā nav izmantota}zero{Pēdējo # dienu laikā nav izmantota}one{Pēdējās # dienas laikā nav izmantota}other{Pēdējo # dienu laikā nav izmantota}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Pēdējās # stundas laikā nav izmantota}zero{Pēdējo # stundu laikā nav izmantota}one{Pēdējās # stundas laikā nav izmantota}other{Pēdējo # stundu laikā nav izmantota}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Izmanto 1 lietotne}zero{Izmanto # lietotnes}one{Izmanto # lietotne}other{Izmanto # lietotnes}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Skatīt visu rīkā Permission Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrēts pēc: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nav atļauts"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Skatīt citas lietotnes, kas drīkst piekļūt visiem failiem"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 diena}zero{# dienu}one{# diena}other{# dienas}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 stunda}zero{# stundu}one{# stunda}other{# stundas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minūte}zero{# minūšu}one{# minūte}other{# minūtes}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunde}zero{# sekunžu}one{# sekunde}other{# sekundes}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# stunda}zero{# stundu}one{# stunda}other{# stundas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minūte}zero{# minūšu}one{# minūte}other{# minūtes}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunde}zero{# sekunžu}one{# sekunde}other{# sekundes}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Atgādinājumi par atļauju"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 neizmantota lietotne"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> neizmantotas lietotnes"</string>
diff --git a/PermissionController/res/values-mk/strings.xml b/PermissionController/res/values-mk/strings.xml
index 514ae451b..0bf938656 100644
--- a/PermissionController/res/values-mk/strings.xml
+++ b/PermissionController/res/values-mk/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ден}one{# ден}other{# дена}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 час}one{# час}other{# часа}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мин.}one{# мин.}other{# мин.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 сек.}one{# сек.}other{# сек.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ден}one{# ден}other{# дена}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# час}one{# час}other{# часа}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мин.}one{# мин.}other{# мин.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# сек.}one{# сек.}other{# сек.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Која било дозвола"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Кога било"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Минатите 7 дена"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Минатите 24 часа"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Минатиот час"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Минатите 15 минути"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Последна 1 минута"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Минатиот # ден}one{Минатите # ден}other{Минатите # дена}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Минатиот # час}one{Минатите # час}other{Минатите # часа}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Минатата # минута}one{Минатите # минута}other{Минатите # минути}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Не се користени дозволи"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Најнов пристап во кое било време"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Најнов пристап во минатите 7 дена"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Користење дозволи во последниот 1 час"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Користење дозволи во минатите 15 минути"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Користење дозволи во последната 1 минута"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Не е користена во минатите 24 часа"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Не е користена во минатите 7 дена"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Не е користена во минатиот # ден}one{Не е користена во минатите # ден}other{Не е користена во минатите # дена}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Не е користена во минатиот # час}one{Не е користена во минатите # час}other{Не е користена во минатите # часа}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Искористена од 1 апликација}one{Искористена од # апликација}other{Искористена од # апликации}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Прикажи ги сите на контролната табла"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Филтрирано според: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Без дозвола"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Видете уште апликации што може да пристапат до сите датотеки"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ден}one{# ден}other{# дена}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 час}one{# час}other{# часа}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минута}one{# минута}other{# минути}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}one{# секунда}other{# секунди}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# час}one{# час}other{# часа}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минута}one{# минута}other{# минути}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}one{# секунда}other{# секунди}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Потсетници за дозволата"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 некористена апликација"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> некористени апликации"</string>
diff --git a/PermissionController/res/values-ml/strings.xml b/PermissionController/res/values-ml/strings.xml
index 8a328b4f6..ff698b69a 100644
--- a/PermissionController/res/values-ml/strings.xml
+++ b/PermissionController/res/values-ml/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{ഒരു ദിവസം}other{# ദിവസം}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{ഒരു മണിക്കൂർ}other{# മണിക്കൂർ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{ഒരു മിനിറ്റ്}other{# മിനിറ്റ്}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{ഒരു സെക്കൻഡ്}other{# സെക്കൻഡ്}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ദിവസം}other{# ദിവസം}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# മണിക്കൂർ}other{# മണിക്കൂർ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# മിനിറ്റ്}other{# മിനിറ്റ്}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# സെക്കൻഡ്}other{# സെക്കൻഡ്}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ഏതെങ്കിലും അനുമതി"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ഏത് സമയത്തും"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"കഴിഞ്ഞ 7 ദിവസം"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"അവസാന 24 മണിക്കൂർ"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"കഴിഞ്ഞ ഒരു മണിക്കൂര്‍‌"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"കഴിഞ്ഞ 15 മിനിറ്റ്"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"അവസാന ഒരു മിനിറ്റ്"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{അവസാന # ദിവസം}other{അവസാന # ദിവസം}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{അവസാന # മണിക്കൂർ}other{അവസാന # മണിക്കൂർ}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{അവസാന # മിനിറ്റ്}other{അവസാന # മിനിറ്റ്}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"അനുമതി ഉപയോഗങ്ങളൊന്നുമില്ല"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ഏതുസമയത്തുമുള്ള ഏറ്റവും സമീപകാല ആക്‌സസ്"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"കഴിഞ്ഞ 7 ദിവസത്തിലെ ഏറ്റവും സമീപകാല ആക്‌സസ്"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"കഴിഞ്ഞ 1 മണിക്കൂറിലെ അനുമതിയുടെ ഉപയോഗം"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"കഴിഞ്ഞ 15 മിനിറ്റിലെ അനുമതിയുടെ ഉപയോഗം"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"കഴിഞ്ഞ 1 മിനിറ്റിലെ അനുമതിയുടെ ഉപയോഗം"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"കഴിഞ്ഞ 24 മണിക്കൂറിനിടെ ഉപയോഗിച്ചിട്ടില്ല"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"കഴിഞ്ഞ 7 ദിവസത്തിനിടെ ഉപയോഗിച്ചിട്ടില്ല"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{കഴിഞ്ഞ # ദിവസത്തിനിടെ ഉപയോഗിച്ചിട്ടില്ല}other{കഴിഞ്ഞ # ദിവസത്തിനിടെ ഉപയോഗിച്ചിട്ടില്ല}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{കഴിഞ്ഞ # മണിക്കൂറിനിടെ ഉപയോഗിച്ചിട്ടില്ല}other{കഴിഞ്ഞ # മണിക്കൂറിനിടെ ഉപയോഗിച്ചിട്ടില്ല}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{ഒരു ആപ്പ് ഉപയോഗിച്ചു}other{# ആപ്പുകൾ ഉപയോഗിച്ചു}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"എല്ലാം ഡാഷ്ബോർഡിൽ കാണുക"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"ഇതുപ്രകാരം ഫിൽട്ടർ ചെയ്‌‌തു: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"അനുവദിച്ചിട്ടില്ല"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"എല്ലാ ഫയലുകളും ആക്‌സസ് ചെയ്യാൻ കഴിയുന്ന കൂടുതൽ ആപ്പുകൾ കാണുക"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{ഒരു ദിവസം}other{# ദിവസം}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{ഒരു മണിക്കൂർ}other{# മണിക്കൂർ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{ഒരു മിനിറ്റ്}other{# മിനിറ്റ്}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{ഒരു സെക്കൻഡ്}other{# സെക്കൻഡ്}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# മണിക്കൂർ}other{# മണിക്കൂർ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# മിനിറ്റ്}other{# മിനിറ്റ്}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# സെക്കൻഡ്}other{# സെക്കൻഡ്}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"അനുമതിയ്ക്കുള്ള റിമൈൻഡറുകൾ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"ഒരു ഉപയോഗിക്കാത്ത ആപ്പ്"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ഉപയോഗിക്കാത്ത ആപ്പുകൾ"</string>
diff --git a/PermissionController/res/values-mn/strings.xml b/PermissionController/res/values-mn/strings.xml
index f16b8bb83..d09b7cd95 100644
--- a/PermissionController/res/values-mn/strings.xml
+++ b/PermissionController/res/values-mn/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 өдөр}other{# өдөр}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 цаг}other{# цаг}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мин}other{# мин}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 сек}other{# сек}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# хоног}other{# хоног}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# цаг}other{# цаг}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мин}other{# мин}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# сек}other{# сек}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Дурын зөвшөөрөл"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Дурын хугацаа"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Сүүлийн 7 хоног"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Сүүлийн 24 цаг"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Сүүлийн 1 цаг"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Сүүлийн 15 минут"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Сүүлийн 1 минут"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Сүүлийн # хоног}other{Сүүлийн # хоног}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Сүүлийн # цаг}other{Сүүлийн # цаг}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Сүүлийн # минут}other{Сүүлийн # минут}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Зөвшөөрлийн хэрэглээ алга"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Бүх цаг үеийн хамгийн сүүлийн хандалт"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Сүүлийн 7 хоногт хамгийн сүүлд хийсэн хандалт"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Сүүлийн 1 цагийн зөвшөөрлийн ашиглалт"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Сүүлийн 15 минутын зөвшөөрлийн ашиглалт"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Сүүлийн 1 минутын зөвшөөрлийн ашиглалт"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Өнгөрсөн 24 цагт ашиглаагүй"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Өнгөрсөн 7 хоногт ашиглаагүй"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Сүүлийн # хоногт ашиглаагүй}other{Сүүлийн # хоногт ашиглаагүй}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Сүүлийн # цагт ашиглаагүй}other{Сүүлийн # цагт ашиглаагүй}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 апп ашигласан}other{# апп ашигласан}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Хяналтын самбараас бүгдийг нь харах"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Шүүсэн: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Зөвшөөрөөгүй"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Бүх файлд хандах боломжтой илүү их аппыг харах"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 өдөр}other{# өдөр}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 цаг}other{# цаг}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минут}other{# минут}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунд}other{# секунд}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# цаг}other{# цаг}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минут}other{# минут}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунд}other{# секунд}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Зөвшөөрлийн сануулагч"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Ашиглаагүй 1 апп"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Ашиглаагүй <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> апп"</string>
diff --git a/PermissionController/res/values-mr/strings.xml b/PermissionController/res/values-mr/strings.xml
index 242d32857..69c50c915 100644
--- a/PermissionController/res/values-mr/strings.xml
+++ b/PermissionController/res/values-mr/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{एक दिवस}other{# दिवस}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{एक तास}other{# तास}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{एक मिनिट}other{# मिनिटे}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{एक सेकंद}other{# सेकंद}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# दिवस}other{# दिवस}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# तास}other{# तास}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# मिनिट}other{# मिनिटे}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# सेकंद}other{# सेकंद}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"कोणतीही परवानगी"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"कधीही"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"शेवटचे सात दिवस"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"गेल्या २४ तासात"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"शेवटचा एक तास"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"शेवटची १५ मिनिटे"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"शेवटचा एक मिनिट"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{शेवटचा # दिवस}other{शेवटचे # दिवस}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{मागील # तासामधील}other{मागील # तासांमधील}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{मागील # मिनिटामधील}other{मागील # मिनिटांमधील}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"वापराची परवानगी नाही"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"कोणत्याही वेळी सर्वात अलीकडील अ‍ॅक्सेस"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"मागील सात दिवसांतील सर्वात अलीकडील अ‍ॅक्सेस"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"मागील एका तासातील परवानगी वापर"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"मागील १५ मिनिटांतील परवानगी वापर"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"मागील एका मिनिटातील परवानगी वापर"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"मागील २४ तासांमध्ये न वापरलेली"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"मागील सात दिवसांमध्ये न वापरलेली"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{मागील # दिवसामध्ये न वापरलेली}other{मागील # दिवसांमध्ये न वापरलेली}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{मागील # तासामध्ये न वापरलेली}other{मागील # तासांमध्ये न वापरलेली}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{एका अ‍ॅपने वापरल्या}other{# अ‍ॅप्सनी वापरल्या}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"डॅशबोर्डमध्ये सर्व पहा"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"यानुसार फिल्टर केले: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"अनुमती नाही"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"सर्व फाइलचा ॲक्सेस असलेली आणखी ॲप्स पहा"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{एक दिवस}other{# दिवस}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{एक तास}other{# तास}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{एक मिनिट}other{# मिनिटे}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{एक सेकंद}other{# सेकंद}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# तास}other{# तास}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# मिनिट}other{# मिनिटे}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# सेकंद}other{# सेकंद}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"परवानगी रिमाइंडर"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"एक न वापरलेले ॲप"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> न वापरलेली अ‍ॅप्स"</string>
diff --git a/PermissionController/res/values-ms/strings.xml b/PermissionController/res/values-ms/strings.xml
index 71df0dd2d..2b875e5cb 100644
--- a/PermissionController/res/values-ms/strings.xml
+++ b/PermissionController/res/values-ms/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 hari}other{# hari}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 jam}other{# jam}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 saat}other{# saat}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# hari}other{# hari}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# saat}other{# saat}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Sebarang kebenaran"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Pada bila-bila masa"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 hari yang lalu"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 jam yang lalu"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Sejam yang lalu"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 minit yang lalu"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 minit terakhir"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# hari yang lalu}other{# hari yang lalu}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# jam yang lalu}other{# jam yang lalu}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# minit yang lalu}other{# minit yang lalu}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Tiada penggunaan kebenaran"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Akses terbaharu pada bila-bila masa"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Akses terbaharu dalam 7 hari terakhir"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Penggunaan kebenaran dalam 1 jam terakhir"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Penggunaan kebenaran dalam 15 minit terakhir"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Penggunaan kebenaran dalam 1 minit terakhir"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Tidak digunakan dalam tempoh 24 jam yang lalu"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Tidak digunakan dalam tempoh 7 hari yang lalu"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Tidak digunakan dalam # hari yang lalu}other{Tidak digunakan dalam # hari yang lalu}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Tidak digunakan dalam # jam yang lalu}other{Tidak digunakan dalam # jam yang lalu}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Digunakan oleh 1 apl}other{Digunakan oleh # apl}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Lihat semua dalam Papan Pemuka"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Ditapis mengikut: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Tidak dibenarkan"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Lihat lagi apl yang boleh mengakses semua fail"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 hari}other{# hari}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 jam}other{# jam}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minit}other{# minit}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 saat}other{# saat}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# jam}other{# jam}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minit}other{# minit}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# saat}other{# saat}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Peringatan kebenaran"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 apl tidak digunakan"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apl yang tidak digunakan"</string>
diff --git a/PermissionController/res/values-my/strings.xml b/PermissionController/res/values-my/strings.xml
index 253af91d1..ae8660510 100644
--- a/PermissionController/res/values-my/strings.xml
+++ b/PermissionController/res/values-my/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ရက်}other{# ရက်}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 နာရီ}other{# နာရီ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{၁ မိနစ်}other{# မိနစ်}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{၁ စက္ကန့်}other{# စက္ကန့်}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ရက်}other{# ရက်}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# နာရီ}other{# နာရီ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# မိနစ်}other{# မိနစ်}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# စက္ကန့်}other{# စက္ကန့်}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"မည်သည့် ခွင့်ပြုချက်မဆို"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"အချိန်မရွေး"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ပြီးခဲ့သော ၇ ရက်"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ပြီးခဲ့သော ၂၄ နာရီ"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"ပြီးခဲ့သော ၁ နာရီ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ပြီးခဲ့သော ၁၅ မိနစ်"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ပြီးခဲ့သည့် ၁ မိနစ်"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ပြီးခဲ့သော # ရက်}other{ပြီးခဲ့သော # ရက်}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{ပြီးခဲ့သော # နာရီ}other{ပြီးခဲ့သော # နာရီ}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ပြီးခဲ့သော # မိနစ်}other{ပြီးခဲ့သော # မိနစ်}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"မည်သည့်ခွင့်ပြုချက်မှ မသုံးပါ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"အချိန်မရွေး လတ်တလောအဖြစ်ဆုံး ဝင်သုံးမှု"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ပြီးခဲ့သော ၇ ရက်အတွင်း လတ်တလော ဝင်သုံးမှု"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ပြီးခဲ့သော ၁ မိနစ်အတွင်း ခွင့်ပြုချက်သုံးစွဲမှု"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ပြီးခဲ့သော ၁၅ မိနစ်အတွင်း ခွင့်ပြုချက်သုံးစွဲမှု"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ပြီးခဲ့သော ၁ မိနစ်အတွင်း ခွင့်ပြုချက်သုံးစွဲမှု"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ပြီးခဲ့သည့် ၂၄ နာရီအတွင်း အသုံးမပြုပါ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ပြီးခဲ့သည့် ၇ ရက်အတွင်း အသုံးမပြုပါ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ပြီးခဲ့သော # ရက်အတွင်း သုံးမထားပါ}other{ပြီးခဲ့သော # ရက်အတွင်း သုံးမထားပါ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ပြီးခဲ့သော # နာရီအတွင်း သုံးမထားပါ}other{ပြီးခဲ့သော # နာရီအတွင်း သုံးမထားပါ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{အက်ပ် ၁ ခုက အသုံးပြုထားသည်}other{အက်ပ် # ခုက အသုံးပြုထားသည်}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"အားလုံးကို \'ဒက်ရှ်ဘုတ်\' တွင်ကြည့်ရန်"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"စစ်ထုတ်စနစ်- <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ခွင့်ပြုမထားပါ"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ဖိုင်အားလုံးသုံးနိုင်သည့် နောက်ထပ်အက်ပ်များ ကြည့်ရန်"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ရက်}other{# ရက်}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 နာရီ}other{# နာရီ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{၁ မိနစ်}other{# မိနစ်}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{၁ စက္ကန့်}other{# စက္ကန့်}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# နာရီ}other{# နာရီ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# မိနစ်}other{# မိနစ်}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# စက္ကန့်}other{# စက္ကန့်}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ခွင့်ပြုချက် သတိပေးမှုများ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"အသုံးမပြုသောအက်ပ် 1 ခု"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"အသုံးမပြုသောအက်ပ် <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ခု"</string>
diff --git a/PermissionController/res/values-nb/strings.xml b/PermissionController/res/values-nb/strings.xml
index c48bb2299..d472c25d7 100644
--- a/PermissionController/res/values-nb/strings.xml
+++ b/PermissionController/res/values-nb/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dag}other{# dager}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 time}other{# timer}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek}other{# sek}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dag}other{# dager}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# time}other{# timer}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek}other{# sek}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Hvilken som helst tillatelse"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Når som helst"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"De siste 7 dagene"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"De siste 24 timene"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Den siste timen"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"De siste 15 minuttene"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Det siste minuttet"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Den siste dagen}other{De siste # dagene}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Den siste timen}other{De siste # timene}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Det siste minuttet}other{De siste # minuttene}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ingen bruk av tillatelsen"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Siste tilgang når som helst"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Siste tilgang i løpet av de siste syv dagene"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Bruk av tillatelser den siste timen"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Bruk av tillatelser de siste 15 minuttene"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Bruk av tillatelser det siste minuttet"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ikke brukt de siste 24 timene"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Ikke brukt i løpet av de siste 7 dagene"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Ikke brukt i løpet av den siste dagen}other{Ikke brukt i løpet av de siste # dagene}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Ikke brukt den siste timen}other{Ikke brukt de siste # timene}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Brukt av 1 app}other{Brukt av # apper}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Se alt i oversikten"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrert etter: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ikke tillatt"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Se flere apper som kan bruke alle filer"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dag}other{# dager}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 time}other{# timer}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minutt}other{# minutter}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekund}other{# sekunder}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# time}other{# timer}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minutt}other{# minutter}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekund}other{# sekunder}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Påminnelser om tillatelser"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Én ubrukt app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ubrukte apper"</string>
diff --git a/PermissionController/res/values-ne/strings.xml b/PermissionController/res/values-ne/strings.xml
index a3070787a..ff1abc221 100644
--- a/PermissionController/res/values-ne/strings.xml
+++ b/PermissionController/res/values-ne/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{१ दिन}other{# दिन}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{१ घण्टा}other{# घण्टा}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{१ मिनेट}other{# मिनेट}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{१ सेकेन्ड}other{# सेकेन्ड}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# दिन}other{# दिन}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# घण्टा}other{# घण्टा}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# मिनेट}other{# मिनेट}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# सेकेन्ड}other{# सेकेन्ड}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"कुनै पनि अनुमति"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"कुनै पनि समय"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"पछिल्ला ७ दिन"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"पछिल्लो २४ घन्टा"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"पछिल्लो १ घन्टा"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"पछिल्लो १५ मिनेट"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"पछिल्लो १ मिनेट"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{पछिल्लो # दिन}other{पछिल्ला # दिन}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{पछिल्लो # घण्टा}other{पछिल्ला # घण्टा}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{पछिल्लो # मिनेट}other{पछिल्ला # मिनेट}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"उपयोगको अनुमति छैन"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"पछिल्लो पटक जुनसुकै बेला गरिएको पहुँच"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"गत ७ दिनमा पछिल्लो पटक गरिएको पहुँच"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"पछिल्लो १ घन्टामा गरिएको अनुमतिको प्रयोग"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"पछिल्लो १५ मिनेटमा गरिएको अनुमतिको प्रयोग"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"पछिल्लो १ मिनेटमा गरिएको अनुमतिको प्रयोग"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"पछिल्ला २४ घण्टामा प्रयोग गरिएको छैन"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"पछिल्ला ७ दिनमा प्रयोग गरिएको छैन"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{पछिल्लो # दिनमा प्रयोग गरिएको छैन}other{पछिल्ला # दिनमा प्रयोग गरिएको छैन}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{पछिल्लो # घण्टामा प्रयोग गरिएको छैन}other{पछिल्ला # घण्टामा प्रयोग गरिएको छैन}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{एउटा एप‌ले प्रयोग गरेको}other{# वटा एप‌ले प्रयोग गरेको}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ड्यासबोर्डमा सबै कुरा हेर्नुहोस्"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"यसअनुसार फिल्टर गरिएको: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"अनुमति नदिइएका"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"सबै फाइल हेर्ने र प्रयोग गर्ने अनुमति भएका थप एपहरू हेर्नुहोस्"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{१ दिन}other{# दिन}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{१ घण्टा}other{# घण्टा}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{१ मिनेट}other{# मिनेट}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{१ सेकेन्ड}other{# सेकेन्ड}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# घण्टा}other{# घण्टा}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# मिनेट}other{# मिनेट}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# सेकेन्ड}other{# सेकेन्ड}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"अनुमतिसम्बन्धी रिमाइन्डरहरू"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"प्रयोग नगरिएको १ एप"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"प्रयोग नगरिएका <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> एपहरू"</string>
diff --git a/PermissionController/res/values-nl/strings.xml b/PermissionController/res/values-nl/strings.xml
index 2ec869034..b79725433 100644
--- a/PermissionController/res/values-nl/strings.xml
+++ b/PermissionController/res/values-nl/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dag}other{# dagen}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 uur}other{# uur}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sec}other{# sec}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dag}other{# dagen}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Minstens 1 recht"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Altijd"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Afgelopen 7 dagen"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Afgelopen 24 uur"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Afgelopen uur"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Afgelopen 15 minuten"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Afgelopen minuut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Afgelopen dag}other{Afgelopen # dagen}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Afgelopen uur}other{Afgelopen # uur}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Afgelopen minuut}other{Afgelopen # minuten}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Geen rechtengebruik"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Laatste toegang"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Laatste toegang in de afgelopen zeven dagen"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Rechtengebruik in het afgelopen uur"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Rechtengebruik in de afgelopen 15 minuten"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Rechtengebruik in de afgelopen minuut"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Niet gebruikt in de afgelopen 24 uur"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Niet gebruikt in de afgelopen 7 dagen"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Niet gebruikt in de afgelopen dag}other{Niet gebruikt in de afgelopen # dagen}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Niet gebruikt in het afgelopen uur}other{Niet gebruikt in de afgelopen # uur}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Gebruikt door 1 app}other{Gebruikt door # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Alles op dashboard tonen"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Gefilterd op: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Niet toegestaan"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Bekijk meer apps die toegang tot alle bestanden hebben."</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dag}other{# dagen}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 uur}other{# uur}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuut}other{# minuten}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 seconde}other{# seconden}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# uur}other{# uur}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuut}other{# minuten}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# seconde}other{# seconden}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Herinneringen voor rechten"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 niet-gebruikte app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> niet-gebruikte apps"</string>
diff --git a/PermissionController/res/values-or/strings.xml b/PermissionController/res/values-or/strings.xml
index 0eda28e08..9e53e3e16 100644
--- a/PermissionController/res/values-or/strings.xml
+++ b/PermissionController/res/values-or/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ଦିନ}other{# ଦିନ}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ମିନିଟ}other{# ମିନିଟ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 ସେକେଣ୍ଡ}other{# ସେକେଣ୍ଡ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ଦିନ}other{# ଦିନ}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# ମିନିଟ}other{# ମିନିଟ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ସେକେଣ୍ଡ}other{# ସେକେଣ୍ଡ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ଯେକୌଣସି ଅନୁମତି"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ଯେକୌଣସି ସମୟରେ"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ଗତ 7 ଦିନ"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ଗତ 24 ଘଣ୍ଟା"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"ଗତ 1 ଘଣ୍ଟା"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ଗତ 15 ମିନିଟ୍"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ଗତ 1 ମିନିଟ୍‌ରେ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ଗତ # ଦିନ}other{ଗତ # ଦିନ}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{ଗତ # ଘଣ୍ଟା}other{ଗତ # ଘଣ୍ଟା}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ଗତ # ମିନିଟ}other{ଗତ # ମିନିଟ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ବ୍ୟବହାର ପାଇଁ କୌଣସି ଅନୁମତି ନାହିଁ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ଯେକୌଣସି ସମୟରେ କରାଯାଇଥିବା ସମ୍ପ୍ରତ୍ତି ଆକ୍ସେସ୍‍"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ଗତ 7 ଦିନରେ ଅତି ସମ୍ପ୍ରତ୍ତି ହୋଇଥିବା ଆକ୍ସେସ୍‍"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ଗତ 1 ଘଣ୍ଟାରେ ବ୍ୟବହୃତ ଅନୁମତି"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ଗତ 15 ମିନିଟ୍‌ରେ ବ୍ୟବହୃତ ହୋଇଥିବା ଅନୁମତି"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ଗତ 1 ମିନିଟ୍‌ରେ ବ୍ୟବହୃତ ହୋଇଥିବା ଅନୁମତି"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ଗତ 24 ଘଣ୍ଟାରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ଗତ 7 ଦିନରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ଗତ # ଦିନରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ}other{ଗତ # ଦିନରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ଗତ # ଘଣ୍ଟାରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ}other{ଗତ # ଘଣ୍ଟାରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1ଟି ଆପ ଦ୍ୱାରା ବ୍ୟବହାର କରାଯାଇଛି}other{#ଟି ଆପ ଦ୍ୱାରା ବ୍ୟବହାର କରାଯାଇଛି}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ଡ୍ୟାସ୍‍‍ବୋର୍ଡରେ ସବୁ ଦେଖନ୍ତୁ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"<xliff:g id="PERM">%1$s</xliff:g> ଦ୍ବାରା ଫିଲ୍ଟର୍ କରାଯାଇଛି"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ଅନୁମତି ନାହିଁ"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ସମସ୍ତ ଫାଇଲକୁ ଆକ୍ସେସ କରିପାରୁଥିବା ଅଧିକ ଆପ୍ସ ଦେଖନ୍ତୁ"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ଦିନ}other{# ଦିନ}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 ମିନିଟ}other{# ମିନିଟ}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 ସେକେଣ୍ଡ}other{# ସେକେଣ୍ଡ}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# ମିନିଟ}other{# ମିନିଟ}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ସେକେଣ୍ଡ}other{# ସେକେଣ୍ଡ}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ଅନୁମତି ରିମାଇଣ୍ଡର୍"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1ଟି ଅବ୍ୟବହୃତ ଆପ୍"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g>ଟି ଅବ୍ୟବହୃତ ଆପ୍"</string>
diff --git a/PermissionController/res/values-pa/strings.xml b/PermissionController/res/values-pa/strings.xml
index 60318c9a2..4904cb3ca 100644
--- a/PermissionController/res/values-pa/strings.xml
+++ b/PermissionController/res/values-pa/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ਦਿਨ}one{# ਦਿਨ}other{# ਦਿਨ}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 ਸਕਿੰਟ}one{# ਸਕਿੰਟ}other{# ਸਕਿੰਟ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ਦਿਨ}one{# ਦਿਨ}other{# ਦਿਨ}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# ਸਕਿੰਟ}one{# ਸਕਿੰਟ}other{# ਸਕਿੰਟ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ਕੋਈ ਵੀ ਇਜਾਜ਼ਤ"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ਕਿਸੇ ਵੀ ਵੇਲੇ"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"ਪਿਛਲੇ 7 ਦਿਨ"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"ਪਿਛਲੇ 24 ਘੰਟੇ"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"ਪਿਛਲਾ 1 ਘੰਟਾ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"ਪਿਛਲੇ 15 ਮਿੰਟ"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"ਪਿਛਲੇ 1 ਮਿੰਟ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{ਪਿਛਲਾ # ਦਿਨ}one{ਪਿਛਲਾ # ਦਿਨ}other{ਪਿਛਲੇ # ਦਿਨ}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{ਪਿਛਲਾ # ਘੰਟਾ}one{ਪਿਛਲਾ # ਘੰਟਾ}other{ਪਿਛਲੇ # ਘੰਟੇ}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{ਪਿਛਲਾ # ਮਿੰਟ}one{ਪਿਛਲਾ # ਮਿੰਟ}other{ਪਿਛਲੇ # ਮਿੰਟ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ਕੋਈ ਇਜਾਜ਼ਤ ਨਹੀਂ ਵਰਤੀ ਗਈ"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ਕਿਸੇ ਵੀ ਵੇਲੇ ਦੀ ਸਭ ਤੋਂ ਹਾਲੀਆ ਪਹੁੰਚ"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"ਪਿਛਲੇ 7 ਦਿਨਾਂ ਵਿੱਚ ਸਭ ਤੋਂ ਹਾਲੀਆ ਪਹੁੰਚ"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"ਪਿਛਲੇ 1 ਘੰਟੇ ਵਿੱਚ ਇਜਾਜ਼ਤ ਵਰਤੋਂ"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"ਪਿਛਲੇ 15 ਮਿੰਟ ਵਿੱਚ ਇਜਾਜ਼ਤ ਵਰਤੋਂ"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"ਪਿਛਲੇ 1 ਮਿੰਟ ਵਿੱਚ ਇਜਾਜ਼ਤ ਵਰਤੋਂ"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ਪਿਛਲੇ 24 ਘੰਟਿਆਂ ਵਿੱਚ ਵਰਤੀਆਂ ਨਹੀਂ ਗਈਆਂ"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ਪਿਛਲੇ 7 ਦਿਨਾਂ ਵਿੱਚ ਵਰਤੀਆਂ ਨਹੀਂ ਗਈਆਂ"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ਪਿਛਲੇ # ਦਿਨ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}one{ਪਿਛਲੇ # ਦਿਨ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}other{ਪਿਛਲੇ # ਦਿਨਾਂ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ਪਿਛਲੇ # ਘੰਟੇ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}one{ਪਿਛਲੇ # ਘੰਟੇ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}other{ਪਿਛਲੇ # ਘੰਟਿਆਂ ਵਿੱਚ ਨਹੀਂ ਵਰਤੀ ਗਈ}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ਐਪ ਵੱਲੋਂ ਇਜਾਜ਼ਤਾਂ ਵਰਤੀਆਂ ਗਈਆਂ}one{# ਐਪ ਵੱਲੋਂ ਇਜਾਜ਼ਤਾਂ ਵਰਤੀਆਂ ਗਈਆਂ}other{# ਐਪਾਂ ਵੱਲੋਂ ਇਜਾਜ਼ਤਾਂ ਵਰਤੀਆਂ ਗਈਆਂ}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ਸਭ ਡੈਸ਼ਬੋਰਡ ਵਿੱਚ ਦੇਖੋ"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"ਇਸ ਮੁਤਾਬਕ ਫਿਲਟਰ ਕੀਤਾ ਗਿਆ: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ਗੈਰ-ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਣ ਵਾਲੀਆਂ ਹੋਰ ਐਪਾਂ ਦੇਖੋ"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ਦਿਨ}one{# ਦਿਨ}other{# ਦਿਨ}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 ਸਕਿੰਟ}one{# ਸਕਿੰਟ}other{# ਸਕਿੰਟ}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ਘੰਟਾ}one{# ਘੰਟਾ}other{# ਘੰਟੇ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# ਸਕਿੰਟ}one{# ਸਕਿੰਟ}other{# ਸਕਿੰਟ}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"ਇਜਾਜ਼ਤਾਂ ਦੀਆਂ ਯਾਦ-ਸੂਚਨਾਵਾਂ"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ਅਣਵਰਤੀ ਐਪ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ਅਣਵਰਤੀਆਂ ਐਪਾਂ"</string>
diff --git a/PermissionController/res/values-pl/strings.xml b/PermissionController/res/values-pl/strings.xml
index 7e1165994..87507a9cd 100644
--- a/PermissionController/res/values-pl/strings.xml
+++ b/PermissionController/res/values-pl/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dzień}few{# dni}many{# dni}other{# dnia}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 godzina}few{# godziny}many{# godzin}other{# godziny}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}few{# min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}few{# s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dzień}few{# dni}many{# dni}other{# dnia}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# godzina}few{# godziny}many{# godzin}other{# godziny}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}few{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}few{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Dowolne uprawnienie"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Dowolny czas"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Ostatnie 7 dni"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Ostatnie 24 godziny"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Ostatnia godzina"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Ostatnie 15 minut"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Ostatnia minuta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Ostatni dzień}few{Ostatnie # dni}many{Ostatnie # dni}other{Ostatnie # dnia}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Ostatnia godzina}few{Ostatnie # godz.}many{Ostatnie # godz.}other{Ostatnie # godz.}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Ostatnia minuta}few{Ostatnie # minuty}many{Ostatnie # minut}other{Ostatnie # minuty}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Brak użycia uprawnień"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Ostatni dostęp w dowolnym okresie"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Najnowsze użycie w ciągu ostatnich 7 dni"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Użycie uprawnień w ciągu ostatniej godziny"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Użycie uprawnień w ciągu ostatnich 15 minut"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Użycie uprawnień w ciągu ostatniej minuty"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nie używano w ciągu ostatnich 24 godzin"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nie używano w ciągu ostatnich 7 dni"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nie używano w ciągu ostatniego dnia}few{Nie używano w ciągu ostatnich # dni}many{Nie używano w ciągu ostatnich # dni}other{Nie używano w ciągu ostatniej # dnia}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nie używano w ciągu ostatniej godziny}few{Nie używano w ciągu ostatnich # godzin}many{Nie używano w ciągu ostatnich # godzin}other{Nie używano w ciągu ostatnich # godzin}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Uprawnienie używane przez 1 aplikację}few{Uprawnienie używane przez # aplikacje}many{Uprawnienie używane przez # aplikacji}other{Uprawnienie używane przez # aplikacji}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Pokaż wszystko w panelu"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrowane według: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nie mają dostępu"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Zobacz więcej aplikacji z dostępem do wszystkich plików"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dzień}few{# dni}many{# dni}other{# dnia}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 godzina}few{# godziny}many{# godzin}other{# godziny}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuta}few{# minuty}many{# minut}other{# minuty}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunda}few{# sekundy}many{# sekund}other{# sekundy}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# godzina}few{# godziny}many{# godzin}other{# godziny}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuta}few{# minuty}many{# minut}other{# minuty}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunda}few{# sekundy}many{# sekund}other{# sekundy}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Przypomnienia o uprawnieniach"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nieużywana aplikacja"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Nieużywane aplikacje (<xliff:g id="NUMBER_OF_APPS">%s</xliff:g>)"</string>
diff --git a/PermissionController/res/values-pt-rBR/strings.xml b/PermissionController/res/values-pt-rBR/strings.xml
index 70b6bb89b..6b1cdbc82 100644
--- a/PermissionController/res/values-pt-rBR/strings.xml
+++ b/PermissionController/res/values-pt-rBR/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dia}one{# dia}many{# dias}other{# dias}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}one{# hora}many{# horas}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1min}one{#min}many{#min}other{#min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1s}one{#s}many{#s}other{#s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dia}one{# dia}many{# de dias}other{# dias}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}one{# hora}many{# de horas}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}many{# de min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{#s}one{#s}many{# de segundos}other{#s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Qualquer permissão"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Qualquer horário"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 dias"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{No último dia}one{No último # dia}many{Nos últimos # de dias}other{Nos últimos # dias}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Na última # hora}one{Na última # hora}many{Nas últimas # de horas}other{Nas últimas # horas}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{No último # minuto}one{No último # minuto}many{Nos últimos # de minutos}other{Nos últimos # minutos}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nenhum uso de permissões"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acesso mais recente em qualquer momento"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acesso mais recente nos últimos sete dias"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso da permissão na última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso da permissão nos últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso da permissão no último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Permissão não usada nas últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Permissão não usada nos últimos sete dias"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Não usado no último # dia}one{Não usado no último # dia}many{Não usado nos últimos # de dias}other{Não usado nos últimos # dias}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Não usado na última # hora}one{Não usado na última # hora}many{Não usado nas últimas # de horas}other{Não usado nas últimas # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Permissões usadas por 1 app}one{Permissões usadas por # app}many{Used by # apps}other{Permissões usadas por # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver tudo no painel"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrado por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Não permitido"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Veja mais apps que têm acesso a todos os arquivos"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dia}one{# dia}many{# dias}other{# dias}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}one{# hora}many{# horas}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}one{# minuto}many{# minutos}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}one{# segundo}many{# segundos}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}one{# hora}many{# de horas}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}one{# minuto}many{# de minutos}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}one{# segundo}many{# de segundos}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Lembretes de permissões"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app não usado"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apps não usados"</string>
diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml
index a70346229..de9581054 100644
--- a/PermissionController/res/values-pt-rPT/strings.xml
+++ b/PermissionController/res/values-pt-rPT/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dia}many{# dias}other{# dias}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dia}many{# dias}other{# dias}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Qualquer autorização"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Em qualquer altura"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 dias"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# hora anterior}many{# horas anteriores}other{# horas anteriores}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# minuto anterior}many{# minutos anteriores}other{# minutos anteriores}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Autorizações não utilizadas"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acesso mais recente em qualquer altura"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acesso mais recente nos últimos 7 dias"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Utilização das autorizações na última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Utilização das autorizações nos últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Utilização das autorizações no último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Sem utilização nas últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Não utilizada nos últimos 7 dias"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Não usada há # dia}many{Não usada há # dias}other{Não usada há # dias}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Não usada há # hora}many{Não usada há # horas}other{Não usada há # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Utilização: 1 app}many{Utilização: # apps}other{Utilização: # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver tudo no painel de controlo"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrado por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Não permitidas"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Veja mais apps que podem aceder a todos os ficheiros"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dia}many{# dias}other{# dias}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}many{# horas}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}many{# minutos}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}many{# segundos}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}many{# horas}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}many{# segundos}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Lembretes de autorização"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app não utilizada"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apps não utilizadas"</string>
diff --git a/PermissionController/res/values-pt/strings.xml b/PermissionController/res/values-pt/strings.xml
index 70b6bb89b..6b1cdbc82 100644
--- a/PermissionController/res/values-pt/strings.xml
+++ b/PermissionController/res/values-pt/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dia}one{# dia}many{# dias}other{# dias}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hora}one{# hora}many{# horas}other{# horas}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1min}one{#min}many{#min}other{#min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1s}one{#s}many{#s}other{#s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dia}one{# dia}many{# de dias}other{# dias}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hora}one{# hora}many{# de horas}other{# horas}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}many{# de min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{#s}one{#s}many{# de segundos}other{#s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Qualquer permissão"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Qualquer horário"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Últimos 7 dias"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Últimas 24 horas"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Última hora"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Últimos 15 minutos"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Último minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{No último dia}one{No último # dia}many{Nos últimos # de dias}other{Nos últimos # dias}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Na última # hora}one{Na última # hora}many{Nas últimas # de horas}other{Nas últimas # horas}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{No último # minuto}one{No último # minuto}many{Nos últimos # de minutos}other{Nos últimos # minutos}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nenhum uso de permissões"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Acesso mais recente em qualquer momento"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Acesso mais recente nos últimos sete dias"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uso da permissão na última hora"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uso da permissão nos últimos 15 minutos"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uso da permissão no último minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Permissão não usada nas últimas 24 horas"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Permissão não usada nos últimos sete dias"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Não usado no último # dia}one{Não usado no último # dia}many{Não usado nos últimos # de dias}other{Não usado nos últimos # dias}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Não usado na última # hora}one{Não usado na última # hora}many{Não usado nas últimas # de horas}other{Não usado nas últimas # horas}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Permissões usadas por 1 app}one{Permissões usadas por # app}many{Used by # apps}other{Permissões usadas por # apps}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Ver tudo no painel"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrado por: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Não permitido"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Veja mais apps que têm acesso a todos os arquivos"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dia}one{# dia}many{# dias}other{# dias}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hora}one{# hora}many{# horas}other{# horas}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}one{# minuto}many{# minutos}other{# minutos}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}one{# segundo}many{# segundos}other{# segundos}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hora}one{# hora}many{# de horas}other{# horas}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}one{# minuto}many{# de minutos}other{# minutos}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}one{# segundo}many{# de segundos}other{# segundos}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Lembretes de permissões"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app não usado"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> apps não usados"</string>
diff --git a/PermissionController/res/values-ro/strings.xml b/PermissionController/res/values-ro/strings.xml
index 54d1b820e..aab56e527 100644
--- a/PermissionController/res/values-ro/strings.xml
+++ b/PermissionController/res/values-ro/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{O zi}few{# zile}other{# de zile}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{O oră}few{# ore}other{# de ore}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min.}few{# min.}other{# min.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{O sec.}few{# sec.}other{# sec.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# zi}few{# zile}other{# de zile}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# oră}few{# ore}other{# de ore}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min.}few{# min.}other{# min.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}few{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Orice permisiune"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Oricând"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Ultimele 7 zile"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Ultimele 24 de ore"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Ultima oră"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Ultimele 15 minute"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Ultimul minut"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Ultima zi}few{Ultimele # zile}other{Ultimele # de zile}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Ultima oră}few{Ultimele # ore}other{Ultimele # de ore}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Ultimul minut}few{Ultimele # minute}other{Ultimele # de minute}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nicio permisiune folosită"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Cel mai recent acces oricând"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Cea mai recentă accesare din ultimele șapte zile"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Folosirea permisiunii în ultima oră"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Folosirea permisiunii în ultimele 15 minute"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Folosirea permisiunii în ultimul minut"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nu s-a(u) folosit în ultimele 24 de ore"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nu a fost folosită în ultimele șapte zile"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Permisiunea nu a fost folosită în ultima zi}few{Permisiunea nu a fost folosită în ultimele # zile}other{Permisiunea nu a fost folosită în ultimele # de zile}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Permisiunea nu a fost folosită în ultima oră}few{Permisiunea nu a fost folosită în ultimele # ore}other{Permisiunea nu a fost folosită în ultimele # de ore}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Folosită de o aplicație}few{Folosită de # aplicații}other{Folosită de # de aplicații}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Vezi totul în Tabloul de bord"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrat după: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nepermise"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Vezi mai multe aplicații care pot accesa toate fișierele"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{O zi}few{# zile}other{# de zile}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{O oră}few{# ore}other{# de ore}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{Un minut}few{# minute}other{# de minute}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{O secundă}few{# secunde}other{# de secunde}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# oră}few{# ore}other{# de ore}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}few{# minute}other{# de minute}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# secundă}few{# secunde}other{# de secunde}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Mementouri de permisiune"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"O aplicație nefolosită"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplicații nefolosite"</string>
diff --git a/PermissionController/res/values-ru/strings.xml b/PermissionController/res/values-ru/strings.xml
index cf107f854..b84c9e710 100644
--- a/PermissionController/res/values-ru/strings.xml
+++ b/PermissionController/res/values-ru/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 день}one{# день}few{# дня}many{# дней}other{# дня}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 час}one{# час}few{# часа}many{# часов}other{# часа}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 минута}one{# минута}few{# минуты}many{# минут}other{# минуты}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# день}one{# день}few{# дня}many{# дней}other{# дня}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# час}one{# час}few{# часа}many{# часов}other{# часа}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# минута}one{# минута}few{# минуты}many{# минут}other{# минуты}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Все разрешения"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Все время"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Последние 7 дней"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Последние 24 часа"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Последний час"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Последние 15 минут"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Последняя минута"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{За последний # день}one{За последний # день}few{За последние # дня}many{За последние # дней}other{За последние # дня}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{За последний # час}one{За последний # час}few{За последние # часа}many{За последние # часов}other{За последние # часа}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{За последнюю # минуту}one{За последнюю # минуту}few{За последние # минуты}many{За последние # минут}other{За последние # минуты}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Разрешения не использовались"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Доступ к разрешениям за все время"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Доступ за последние 7 дней"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Разрешения, использованные за последний час"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Разрешения, использованные за последние 15 минут"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Разрешения, использованные за последнюю минуту"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Не использовалось последние 24 часа"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Не использовалось последние 7 дней"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{С момента последнего использования прошел # день}one{С момента последнего использования прошел # день}few{С момента последнего использования прошло # дня}many{С момента последнего использования прошло # дней}other{С момента последнего использования прошло # дня}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{С момента последнего использования прошел # час}one{С момента последнего использования прошел # час}few{С момента последнего использования прошло # часа}many{С момента последнего использования прошло # часов}other{С момента последнего использования прошло # часа}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Использует 1 приложение}one{Использует # приложение}few{Используют # приложения}many{Используют # приложений}other{Используют # приложения}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Показать все в панели управления"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Фильтр: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Доступ запрещен"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Ещё приложения с доступом ко всем файлам"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 день}one{# день}few{# дня}many{# дней}other{# дня}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 час}one{# час}few{# часа}many{# часов}other{# часа}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минута}one{# минута}few{# минуты}many{# минут}other{# минуты}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# час}one{# час}few{# часа}many{# часов}other{# часа}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минута}one{# минута}few{# минуты}many{# минут}other{# минуты}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Напоминания о разрешениях"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 неиспользуемое приложение"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Неиспользуемые приложения (<xliff:g id="NUMBER_OF_APPS">%s</xliff:g>)"</string>
diff --git a/PermissionController/res/values-si/strings.xml b/PermissionController/res/values-si/strings.xml
index 5859b9652..8c9361aaa 100644
--- a/PermissionController/res/values-si/strings.xml
+++ b/PermissionController/res/values-si/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{දින 1ක්}one{දින #ක්}other{දින #ක්}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{පැය 1ක්}one{පැය #ක්}other{පැය #ක්}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{මිනි 1ක්}one{මිනි #ක්}other{මිනි #ක්}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{තත් 1ක්}one{තත් #ක්}other{තත් #ක්}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# දිනක්}one{දින #ක්}other{දින #ක්}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{පැය #ක්}one{පැය #ක්}other{පැය #ක්}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{විනා #ක්}one{විනාඩි #ක්}other{විනාඩි #ක්}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{තත් #}one{තත් #ක්}other{තත් #ක්}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ඕනෑම අවසරයක්"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ඕනෑම වේලාවක"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"පසුගිය දින 7"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"පසුගිය පැය 24"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"පසුගිය පැය 1"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"පසුගිය මිනිත්තු 15"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"පසුගිය විනාඩි 1"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{අවසාන දින #}one{අවසාන දින #}other{අවසාන දින #}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{පසුගිය පැය #}one{පසුගිය පැය #}other{පසුගිය පැය #}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{පසුගිය මිනිත්තු #}one{පසුගිය මිනිත්තු #}other{පසුගිය මිනිත්තු #}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"අවසර භාවිත නැත"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ඕනෑම වේලාවක ඉතාම මෑත ප්‍රවේශය"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"අවසාන දින 7 ක් තුළ ඉතා මෑත ප්‍රවේශය"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"අවසාන 1 පැයක් තුළ අවසර භාවිතය"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"අවසාන විනාඩි 15 තුළ අවසර භාවිතය"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"අවසාන 1 විනාඩිය තුළ අවසර භාවිතය"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"පසුගිය පැය 24 තුළ භාවිත කර නැත"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"පසුගිය දින 7 තුළ භාවිත කර නැත"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{පසුගිය දින # තුළ භාවිතා කර නැත}one{පසුගිය දින # තුළ භාවිතා කර නැත}other{පසුගිය දින # තුළ භාවිතා කර නැත}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{පසුගිය පැය # තුළ භාවිතා කර නැත}one{පසුගිය පැය # තුළ භාවිතා කර නැත}other{පසුගිය පැය # තුළ භාවිතා කර නැත}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{යෙදුම් 1කින් භාවිත කෙරේ}one{යෙදුම් #කින් භාවිත කෙරේ}other{යෙදුම් #කින් භාවිත කෙරේ}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"උපකරණ පුවරුවේ ඇති සියල්ල බලන්න"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"මේ අනුව පෙරහන්න: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ඉඩ නොදේ"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"සියලු ගොනු වෙත ප්‍රවේශ විය හැකි තව යෙදුම් බලන්න"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{දින 1ක්}one{දින #ක්}other{දින #ක්}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{පැය 1ක්}one{පැය #ක්}other{පැය #ක්}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{මිනිත්තු 1ක්}one{මිනිත්තු #ක්}other{මිනිත්තු #ක්}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{තත්පර 1ක්}one{තත්පර #ක්}other{තත්පර #ක්}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{පැය #ක්}one{පැය #ක්}other{පැය #ක්}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{මිනිත්තු #ක්}one{මිනිත්තු #ක්}other{මිනිත්තු #ක්}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{තත්පර #}one{තත්පර #}other{තත්පර #}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"අවසර සිහි කැඳවීම්"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"භාවිත නොකළ යෙදුම් 1"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"භාවිත නොකළ යෙදුම් <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sk/strings.xml b/PermissionController/res/values-sk/strings.xml
index bf5caf0a6..d5cd4322f 100644
--- a/PermissionController/res/values-sk/strings.xml
+++ b/PermissionController/res/values-sk/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 deň}few{# dni}many{# dňa}other{# dní}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 hodina}few{# hodiny}many{# hodiny}other{# hodín}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}few{# min}many{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}few{# s}many{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# deň}few{# dni}many{# dňa}other{# dní}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# hodina}few{# hodiny}many{# hodiny}other{# hodín}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}few{# min}many{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}few{# s}many{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Všetky povolenia"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Kedykoľvek"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Posledných 7 dní"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Posledných 24 hodín"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Posledná 1 hodina"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Posledných 15 minút"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Posledná 1 minúta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Posledný # deň}few{Posledné # dni}many{Posledných # dňa}other{Posledných # dní}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Posledná # hodina}few{Posledné # hodiny}many{Posledných # hodiny}other{Posledných # hodín}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Posledná # minúta}few{Posledné # minúty}many{Posledných # minúty}other{Posledných # minút}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Žiadne využitie povolení"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Posledný prístup kedykoľvek"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Posledný prístup za posledných sedem dní"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Používanie povolení za poslednú hodinu"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Používanie povolení za posledných 15 minút"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Používanie povolení za poslednú minútu"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Nepoužité za posledných 24 hodín"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nepoužité za posledných 7 dní"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nepoužité za posledný # deň}few{Nepoužité za posledné # dni}many{Nepoužité za posledných # dňa}other{Nepoužité za posledných # dní}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nepoužité za poslednú # hodinu}few{Nepoužité za posledné # hodiny}many{Nepoužité za posledných # hodiny}other{Nepoužité za posledných # hodín}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Používa 1 aplikácia}few{Používajú # aplikácie}many{Used by # apps}other{Používa # aplikácií}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Zobraziť všetko v hlavnom paneli"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrované podľa: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nepovolené"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Zobraziť ďalšie aplikácie s prístupom k všetkým súborom"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 deň}few{# dni}many{# dňa}other{# dní}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 hodina}few{# hodiny}many{# hodiny}other{# hodín}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minúta}few{# minúty}many{# minúty}other{# minút}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekúnd}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# hodina}few{# hodiny}many{# hodiny}other{# hodín}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minúta}few{# minúty}many{# minúty}other{# minút}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunda}few{# sekundy}many{# sekundy}other{# sekúnd}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Pripomenutia povolení"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 nepoužívaná aplikácia"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Nepoužívané aplikácie: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sl/strings.xml b/PermissionController/res/values-sl/strings.xml
index fb8fc505d..d3e526dbd 100644
--- a/PermissionController/res/values-sl/strings.xml
+++ b/PermissionController/res/values-sl/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dan}one{# dan}two{# dneva}few{# dni}other{# dni}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ura}one{# ura}two{# uri}few{# ure}other{# ur}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}two{# min}few{# min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 s}one{# s}two{# s}few{# s}other{# s}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dan}one{# dan}two{# dneva}few{# dni}other{# dni}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ura}one{# ura}two{# uri}few{# ure}other{# ur}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}one{# min}two{# min}few{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# s}one{# s}two{# s}few{# s}other{# s}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Katero koli dovoljenje"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Kadar koli"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Zadnjih 7 dni"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Zadnjih 24 ur"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Zadnja ura"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Zadnjih 15 minut"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Zadnja minuta"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Zadnji # dan}one{Zadnji # dan}two{Zadnja # dneva}few{Zadnje # dni}other{Zadnjih # dni}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Zadnja # ura}one{Zadnja # ura}two{Zadnji # uri}few{Zadnje # ure}other{Zadnjih # ur}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Zadnja # minuta}one{Zadnja # minuta}two{Zadnji # minuti}few{Zadnje # minute}other{Zadnjih # minut}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ni uporabe dovoljenj"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Zadnja uporaba kadar koli"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Zadnja uporaba v zadnjih 7 dneh"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Uporaba dovoljenj v zadnji uri"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Uporaba dovoljenj v zadnjih 15 minutah"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Uporaba dovoljenj v zadnji minuti"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Brez uporabe v zadnjih 24 urah"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Brez uporabe v zadnjih 7 dneh"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Brez uporabe v zadnjem # dnevu}one{Brez uporabe v zadnjem # dnevu}two{Brez uporabe v zadnjih # dneh}few{Brez uporabe v zadnjih # dneh}other{Brez uporabe v zadnjih # dneh}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Brez uporabe v zadnji # uri}one{Brez uporabe v zadnji # uri}two{Brez uporabe v zadnjih # urah}few{Brez uporabe v zadnjih # urah}other{Brez uporabe v zadnjih # urah}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Uporablja 1 aplikacija}one{Uporablja # aplikacija}two{Uporabljata # aplikaciji}few{Uporabljajo # aplikacije}other{Uporablja # aplikacij}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Prikaži vse na nadzorni plošči"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrirano po: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ni dovoljeno"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Prikaži več aplikacij z dostopom do vseh datotek"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dan}one{# dan}two{# dneva}few{# dni}other{# dni}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ura}one{# ura}two{# uri}few{# ure}other{# ur}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuta}one{# minuta}two{# minuti}few{# minute}other{# minut}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekunda}one{# sekunda}two{# sekundi}few{# sekunde}other{# sekund}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ura}one{# ura}two{# uri}few{# ure}other{# ur}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuta}one{# minuta}two{# minuti}few{# minute}other{# minut}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekunda}one{# sekunda}two{# sekundi}few{# sekunde}other{# sekund}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Opomniki za dovoljenja"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 neuporabljena aplikacija"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Št. neuporabljenih aplikacij: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sq/strings.xml b/PermissionController/res/values-sq/strings.xml
index 3b6e72247..300a2db31 100644
--- a/PermissionController/res/values-sq/strings.xml
+++ b/PermissionController/res/values-sq/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ditë}other{# ditë}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 orë}other{# orë}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min.}other{# min.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek.}other{# sek.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ditë}other{# ditë}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# orë}other{# orë}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min.}other{# min.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek.}other{# sek.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Çdo autorizim"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Në çdo kohë"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 ditët e fundit"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 orët e fundit"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 orën e fundit"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 minutat e fundit"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Minuta e fundit"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Dita e fundit}other{# ditët e fundit}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Ora e fundit}other{# orët e fundit}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Minuta e fundit}other{# minutat e fundit}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Nuk ka përdorime të lejeve"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Qasja më e fundit në çdo kohë"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Qasja më e fundit në 7 ditët e fundit"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Përdorimi i autorizimeve në 1 orën e fundit"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Përdorimi i autorizimeve në 15 minutat e fundit"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Përdorimi i autorizimeve në 1 minutën e fundit"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Asnjë përdorim gjatë 24 orëve të fundit"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Nuk është përdorur gjatë 7 ditëve të fundit"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Nuk është përdorur gjatë ditës së fundit}other{Nuk është përdorur gjatë # ditëve të fundit}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Nuk është përdorur gjatë orës së fundit}other{Nuk është përdorur gjatë # orëve të fundit}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Përdorur nga 1 aplikacion}other{Përdorur nga # aplikacione}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Shikoji të gjitha te \"Paneli\""</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtruar sipas: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Nuk lejohet"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Shiko më shumë aplikacione me qasje tek të gjithë skedarët"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ditë}other{# ditë}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 orë}other{# orë}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minutë}other{# minuta}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekondë}other{# sekonda}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# orë}other{# orë}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minutë}other{# minuta}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekondë}other{# sekonda}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Alarmet rikujtuese për lejet"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 aplikacion i papërdorur"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> aplikacione të papërdorura"</string>
diff --git a/PermissionController/res/values-sr/strings.xml b/PermissionController/res/values-sr/strings.xml
index 21859c0e6..360ebd5e9 100644
--- a/PermissionController/res/values-sr/strings.xml
+++ b/PermissionController/res/values-sr/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 дан}one{# дан}few{# дана}other{# дана}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 сат}one{# сат}few{# сата}other{# сати}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 мин}one{# мин}few{# мин}other{# мин}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 сек}one{# сек}few{# сек}other{# сек}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# дан}one{# дан}few{# дана}other{# дана}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# сат}one{# сат}few{# сата}other{# сати}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# мин}one{# мин}few{# мин}other{# мин}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# сек}one{# сек}few{# сек}other{# сек}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Било која дозвола"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Било када"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Последњих 7 дана"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Последња 24 сата"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Последњи сат"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Последњих 15 минута"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Последњи минут"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Последњи # дан}one{Последњи # дан}few{Последња # дана}other{Последњих # дана}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Последњи # сат}one{Последњи # сат}few{Последња # сата}other{Последњих # сати}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Последњи # минут}one{Последњи # минут}few{Последња # минута}other{Последњих # минута}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Дозволе нису коришћене"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Најскорији приступ у било ком тренутку"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Најскорији приступ у последњих 7 дана"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Коришћење дозвола у последњих сат времена"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Коришћење дозволе у последњих 15 минута"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Коришћење дозвола у последњем минуту"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Није коришћено у последња 24 сата"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Није коришћено у последњих 7 дана"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Није коришћено током последњег # дана}one{Није коришћено током последњег # дана}few{Није коришћено током последња # дана}other{Није коришћено током последњих # дана}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Није коришћено током последњег # сата}one{Није коришћено током последњег # сата}few{Није коришћено током последња # сата}other{Није коришћено током последњих # сати}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Користи 1 апликација}one{Користи # апликација}few{Користе # апликације}other{Користи # апликација}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Прикажи све на контролној табли"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Филтрирано према: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Није дозвољено"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Прикажи још апликација са приступом свим фајловима"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 дан}one{# дан}few{# дана}other{# дана}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 сат}one{# сат}few{# сата}other{# сати}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 минут}one{# минут}few{# минута}other{# минута}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}one{# секунда}few{# секунде}other{# секунди}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# сат}one{# сат}few{# сата}other{# сати}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# минут}one{# минут}few{# минута}other{# минута}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}one{# секунда}few{# секунде}other{# секунди}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Подсетници за дозволе"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 апликација која се не користи"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Апликација које се не користе: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sv/strings.xml b/PermissionController/res/values-sv/strings.xml
index e5827cccb..37d6ad548 100644
--- a/PermissionController/res/values-sv/strings.xml
+++ b/PermissionController/res/values-sv/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 dag}other{# dagar}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 timme}other{# timmar}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}other{# min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sek}other{# sek}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# dag}other{# dagar}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# timme}other{# timmar}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# min}other{# min}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sek}other{# sek}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Alla behörigheter"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"När som helst"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Senaste 7 dagarna"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"De senaste 24 timmarna"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Senaste timmen"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"De senaste 15 minuterna"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Senaste minuten"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Senaste # dagen}other{Senaste # dagarna}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Senaste # timmen}other{Senaste # timmarna}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Senaste # minuten}other{Senaste # minuterna}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ingen behörighetsanvändning"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Den senaste åtkomsten när som helst"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Den senaste åtkomsten under de senaste sju dagarna"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Behörighetsanvändning under den senaste timmen"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Behörighetsanvändning under den senaste kvarten"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Behörighetsanvändning under den senaste minuten"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Har inte använts under de senaste 24 timmarna"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Har inte använts under de senaste sju dagarna"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Har inte använts under den senaste # dagen}other{Har inte använts under de senaste # dagarna}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Har inte använts under den senaste # timmen}other{Har inte använts under de senaste # timmarna}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Används av 1 app}other{Används av # appar}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Visa alla i översikten"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtreras efter: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Tillåts inte"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Se fler appar som kan komma åt alla filer"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 dag}other{# dagar}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 timme}other{# timmar}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minut}other{# minuter}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 sekund}other{# sekunder}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# timme}other{# timmar}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minut}other{# minuter}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# sekund}other{# sekunder}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Behörighetspåminnelser"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 app som inte används"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> appar som inte används"</string>
diff --git a/PermissionController/res/values-sw/strings.xml b/PermissionController/res/values-sw/strings.xml
index 13080affe..0c0a83626 100644
--- a/PermissionController/res/values-sw/strings.xml
+++ b/PermissionController/res/values-sw/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{Siku moja}other{Siku #}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{Saa moja}other{Saa #}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{Dak 1}other{Dak #}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{Sek 1}other{Sek #}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{Siku #}other{Siku #}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{Saa #}other{Saa #}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{Dak #}other{Dak #}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{Sek #}other{Sek #}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Ruhusa yoyote"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Wakati wowote"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Siku 7 zilizopita"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Saa 24 zilizopita"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Saa 1 iliyopita"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Dakika 15 zilizopita"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Dakika 1 iliyopita"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Siku # iliyopita}other{Siku # zilizopita}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Saa # iliyopita}other{Saa # zilizopita}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Dakika # iliyopita}other{Dakika # zilizopita}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Hakuna matumizi ya ruhusa"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Zinazotumia zaidi wakati wowote"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Zilizotumiwa zaidi katika siku 7 zilizopita"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Ruhusa zilizotumiwa zaidi katika saa 1 iliyopita"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Matumizi ya ruhusa katika dakika 15 zilizopita."</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Matumizi ya ruhusa katika dakika 1 iliyopita"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Haijatumiwa katika saa 24 zilizopita"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Haijatumiwa katika siku saba zilizopita"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Haijatumiwa katika siku # iliyopita}other{Haijatumiwa katika siku # zilizopita}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Haijatumiwa katika saa # iliyopita}other{Haijatumiwa katika saa # zilizopita}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Imetumiwa na programu moja}other{Imetumiwa na programu #}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Yaone yote kwenye Dashibodi"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Zilizochujwa kulingana na: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Zisizoruhusiwa"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Angalia programu zaidi zinazoweza kufikia faili zote"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{Siku moja}other{Siku #}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{Saa moja}other{Saa #}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{Dakika moja}other{Dakika #}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{Sekunde 1}other{Sekunde #}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{Saa #}other{Saa #}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{Dakika #}other{Dakika #}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{Sekunde #}other{Sekunde #}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Vikumbusho vya ruhusa"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Programu moja isiyotumika"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Programu <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> zisizotumika"</string>
diff --git a/PermissionController/res/values-ta/strings.xml b/PermissionController/res/values-ta/strings.xml
index d5c87a0c3..bdbea9a7f 100644
--- a/PermissionController/res/values-ta/strings.xml
+++ b/PermissionController/res/values-ta/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 நாள்}other{# நாட்கள்}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 மணிநேரம்}other{# மணிநேரம்}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 நிமிடம்}other{# நிமிடங்கள்}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 வினாடி}other{# வினாடிகள்}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# நாள்}other{# நாட்கள்}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# மணிநேரம்}other{# மணிநேரம்}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# நிமிடம்}other{# நிமிடங்கள்}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# வினாடி}other{# வினாடிகள்}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"அனுமதி எதுவாயினும்"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"எந்த நேரமும்"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"கடந்த 7 நாட்கள்"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"கடந்த 24 மணிநேரம்"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"கடந்த ஒரு மணிநேரம்"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"கடந்த 15 நிமிடங்கள்"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"கடந்த 1 நிமிடத்தில்"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{கடந்த # நாள்}other{கடந்த # நாட்கள்}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{கடந்த # மணிநேரம்}other{கடந்த # மணிநேரம்}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{கடந்த # நிமிடம்}other{கடந்த # நிமிடங்கள்}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"உபயோகிக்கப்படாத அனுமதிகள்"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"மிகச் சமீபத்திய அணுகல்"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"கடந்த 7 நாட்களில் மிகச் சமீபத்திய அணுகல்"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"கடந்த 1 மணிநேரத்தில் அணுகல் உபயோகம்"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"கடந்த 15 நிமிடங்களில் அணுகல் உபயோகம்"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"கடந்த 1 நிமிடத்தில் அணுகல் உபயோகம்"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"கடந்த 24 மணிநேரத்தில் பயன்படுத்தப்படவில்லை"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"கடந்த 7 நாட்களில் பயன்படுத்தப்படவில்லை"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{கடந்த # நாளில் பயன்படுத்தப்படவில்லை}other{கடந்த # நாட்களில் பயன்படுத்தப்படவில்லை}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{கடந்த # மணிநேரத்தில் பயன்படுத்தப்படவில்லை}other{கடந்த # மணிநேரத்தில் பயன்படுத்தப்படவில்லை}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ஆப்ஸால் பயன்படுத்தப்பட்டது}other{# ஆப்ஸால் பயன்படுத்தப்பட்டது}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"டாஷ்போர்டில் அனைத்தையும் காட்டு"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"இதன்படி வடிகட்டப்பட்டது: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"அனுமதிக்கப்படாதவை"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"அனைத்து ஃபைல்களையும் அணுகக்கூடிய கூடுதல் ஆப்ஸைப் பாருங்கள்"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 நாள்}other{# நாட்கள்}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 மணிநேரம்}other{# மணிநேரம்}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 நிமிடம்}other{# நிமிடங்கள்}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 வினாடி}other{# வினாடிகள்}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# மணிநேரம்}other{# மணிநேரம்}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# நிமிடம்}other{# நிமிடங்கள்}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# வினாடி}other{# வினாடிகள்}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"அனுமதிக்கான நினைவூட்டல்கள்"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 பயன்படுத்தாத ஆப்ஸ்"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> பயன்படுத்தாத ஆப்ஸ்"</string>
diff --git a/PermissionController/res/values-te/strings.xml b/PermissionController/res/values-te/strings.xml
index f4ed699ee..25d8e3795 100644
--- a/PermissionController/res/values-te/strings.xml
+++ b/PermissionController/res/values-te/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 రోజు}other{# రోజులు}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 గంట}other{# గంటలు}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 నిమి}other{# నిమిషాలు}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 సెకను}other{# సెకన్లు}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# రోజు}other{# రోజులు}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# గంట}other{# గంటలు}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# నిమి}other{# నిమిషాలు}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# సెక}other{# సెకన్లు}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ఏ అనుమతి అయినా"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ఎప్పుడైనా"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"గత 7 రోజులు"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"గత 24 గంటలు"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"గత 1 గంట"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"గత 15 నిమిషాలు"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"చివరి 1 నిమిషం"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{గడిచిన # రోజులో}other{గడిచిన # రోజులలో}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{గడిచిన # గంటలో}other{గడిచిన # గంటలలో}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{గడిచిన # నిమిషంలో}other{గడిచిన # నిమిషాలలో}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"అనుమతి వినియోగాలేవీ లేవు"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"ఏ సమయంలోనైనా అత్యంత ఇటీవలి యాక్సెస్"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"గత 7 రోజులలో అత్యంత ఇటీవలి యాక్సెస్‌లు"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"గడిచిన ఒక గంటలో అనుమతి వినియోగించబడింది"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"గత 15 నిమిషాలలో అనుమతి వినియోగించబడింది"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"గత నిమిషంలో అనుమతి వినియోగించబడింది"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"గత 24 గంటలలో ఉపయోగించలేదు"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"గత 7 రోజుల్లో ఉపయోగించలేదు"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{గత # రోజులో ఉపయోగించలేదు}other{గత # రోజుల్లో ఉపయోగించలేదు}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{గత # గంటలో ఉపయోగించలేదు}other{గత # గంటలలో ఉపయోగించలేదు}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 యాప్ ద్వారా ఉపయోగించబడింది}other{# యాప్‌ల ద్వారా ఉపయోగించబడింది}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"అన్నింటినీ డాష్‌బోర్డ్‌లో చూడండి"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"దీని ద్వారా ఫిల్టర్ చేయబడింది: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"అనుమతించబడలేదు"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"అన్ని ఫైళ్లను యాక్సెస్ చేయగల మరిన్ని యాప్‌లను చూడండి"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 రోజు}other{# రోజులు}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 గంట}other{# గంటలు}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 నిమిషం}other{# నిమిషాలు}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 సెకను}other{# సెకన్లు}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# గంట}other{# గంటలు}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# నిమిషం}other{# నిమిషాలు}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# సెకను}other{# సెకన్లు}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"అనుమతి రిమైండర్‌లు"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ఉపయోగించని యాప్‌"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ఉపయోగించని యాప్‌లు"</string>
diff --git a/PermissionController/res/values-th/strings.xml b/PermissionController/res/values-th/strings.xml
index 3d1339249..c3aaeba62 100644
--- a/PermissionController/res/values-th/strings.xml
+++ b/PermissionController/res/values-th/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 วัน}other{# วัน}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 ชั่วโมง}other{# ชั่วโมง}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 นาที}other{# นาที}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 วินาที}other{# วินาที}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# วัน}other{# วัน}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# ชั่วโมง}other{# ชั่วโมง}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# นาที}other{# นาที}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# วินาที}other{# วินาที}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"ทุกสิทธิ์"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"ทุกเวลา"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 วันที่ผ่านมา"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 ชั่วโมงที่ผ่านมา"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 ชั่วโมงที่ผ่านมา"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 นาทีที่ผ่านมา"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 นาทีที่ผ่านมา"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# นาทีที่ผ่านมา}other{# นาทีที่ผ่านมา}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"ไม่มีการใช้สิทธิ์"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"การเข้าถึงล่าสุดทั้งหมด"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"การเข้าถึงล่าสุดในช่วง 7 วันที่ผ่านมา"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"การใช้สิทธิ์ในช่วง 1 ชั่วโมงที่ผ่านมา"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"การใช้สิทธิ์ในช่วง 15 นาทีที่ผ่านมา"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"การใช้สิทธิ์ในช่วง 1 นาทีที่ผ่านมา"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"ไม่ได้ใช้ใน 24 ชั่วโมงที่ผ่านมา"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"ไม่ได้ใช้ใน 7 วันที่ผ่านมา"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{ไม่ได้ใช้ใน # วันที่ผ่านมา}other{ไม่ได้ใช้ใน # วันที่ผ่านมา}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{ไม่ได้ใช้ใน # ชั่วโมงที่ผ่านมา}other{ไม่ได้ใช้ใน # ชั่วโมงที่ผ่านมา}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{ใช้โดยแอป 1 แอป}other{ใช้โดยแอป # แอป}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"ดูทั้งหมดในหน้าแดชบอร์ด"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"กรองตาม: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"ไม่อนุญาต"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"ดูแอปอื่นๆ ที่สามารถเข้าถึงไฟล์ทั้งหมดได้"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 วัน}other{# วัน}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 ชั่วโมง}other{# ชั่วโมง}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 นาที}other{# นาที}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 วินาที}other{# วินาที}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# ชั่วโมง}other{# ชั่วโมง}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# นาที}other{# นาที}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# วินาที}other{# วินาที}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"การช่วยเตือนเกี่ยวกับสิทธิ์"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"แอปที่ไม่ได้ใช้ 1 รายการ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"แอปที่ไม่ได้ใช้ <xliff:g id="NUMBER_OF_APPS">%s</xliff:g> รายการ"</string>
diff --git a/PermissionController/res/values-tl/strings.xml b/PermissionController/res/values-tl/strings.xml
index a22d0b276..987f7701f 100644
--- a/PermissionController/res/values-tl/strings.xml
+++ b/PermissionController/res/values-tl/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 araw}one{# araw}other{# na araw}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 oras}one{# oras}other{# na oras}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 min}one{# min}other{# na min}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 segundo}one{# segundo}other{# na segundo}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# araw}one{# araw}other{# na araw}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# oras}one{# oras}other{# na oras}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# minuto}one{# minuto}other{# na minuto}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# segundo}one{# segundo}other{# na segundo}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Anumang pahintulot"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Anumang oras"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Nakalipas na 7 araw"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Nakalipas na 24 na oras"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Nakalipas na 1 oras"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Nakalipas na 15 minuto"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Nakalipas na 1 minuto"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Nakalipas na # araw}one{Nakalipas na # araw}other{Nakalipas na # na araw}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Nakalipas na # oras}one{Nakalipas na # oras}other{Nakalipas na # na oras}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Nakalipas na # minuto}one{Nakalipas na # minuto}other{Nakalipas na # na minuto}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Walang paggamit ng pahintulot"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Pinakakamakailang pag-access anumang oras"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Pinakakamakailang pag-access sa nakaraang 7 araw"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Paggamit ng pahintulot sa loob ng nakaraang 1 oras"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Paggamit ng pahintulot sa nakaraang 15 minuto"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Paggamit ng pahintulot sa nakaraang 1 minuto"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Hindi ginamit sa nakalipas na 24 na oras"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Hindi ginamit sa nakalipas na 7 araw"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Hindi ginamit sa nakalipas na # araw}one{Hindi ginamit sa nakalipas na # araw}other{Hindi ginamit sa nakalipas na # na araw}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Hindi ginamit sa nakalipas na # oras}one{Hindi ginamit sa nakalipas na # oras}other{Hindi ginamit sa nakalipas na # na oras}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Ginagamit ng 1 app}one{Ginagamit ng # app}other{Ginagamit ng # na app}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Tingnan lahat sa Dashboard"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Na-filter ng: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Hindi pinapayagan"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Tumingin pa ng mga app na puwedeng mag-access ng lahat ng file"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 araw}one{# araw}other{# na araw}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 oras}one{# oras}other{# na oras}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 minuto}one{# minuto}other{# na minuto}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 segundo}one{# segundo}other{# na segundo}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# oras}one{# oras}other{# na oras}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# minuto}one{# minuto}other{# na minuto}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# segundo}one{# segundo}other{# na segundo}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Mga paalala sa pahintulot"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 hindi ginagamit na app"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> (na) hindi ginagamit na app"</string>
diff --git a/PermissionController/res/values-tr/strings.xml b/PermissionController/res/values-tr/strings.xml
index b3223ea4b..b2ba3665f 100644
--- a/PermissionController/res/values-tr/strings.xml
+++ b/PermissionController/res/values-tr/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 gün}other{# gün}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 saat}other{# saat}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 dk.}other{# dk.}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 sn.}other{# sn.}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# gün}other{# gün}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# dk.}other{# dk.}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# sn.}other{# sn.}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Tüm izinler"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Tüm zamanlar"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Son 7 gün"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Son 24 saat"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Son 1 saat"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Son 15 dakika"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Son 1 dakika"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Son # gün}other{Son # gün}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Son # saat}other{Son # saat}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Son # dakika}other{Son # dakika}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"İzin kullanılmadı"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Herhangi bir zamanda gerçekleşen en son erişim"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Son 7 gün içindeki en son erişimler"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Son 1 saat içinde gerçekleşen izin kullanımı"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Son 15 dakika içinde gerçekleştirilen izin kullanımı"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Son 1 dakika içinde gerçekleşen izin kullanımı"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Son 24 saat içinde kullanılmadı"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Son 7 gün içinde kullanılmadı"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Son # gün içinde kullanılmadı}other{Son # gün içinde kullanılmadı}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Son # saat içinde kullanılmadı}other{Son # saat içinde kullanılmadı}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 uygulama tarafından kullanıldı}other{# uygulama tarafından kullanıldı}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Tümünü Kontrol Paneli\'nde göster"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtre ölçütü: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"İzin verilmeyenler"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Tüm dosyalara erişebilen diğer uygulamaları görün"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 gün}other{# gün}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 saat}other{# saat}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 dakika}other{# dakika}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 saniye}other{# saniye}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# saat}other{# saat}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# dakika}other{# dakika}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# saniye}other{# saniye}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"İzin hatırlatıcılar"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 kullanılmayan uygulama"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> kullanılmayan uygulama"</string>
diff --git a/PermissionController/res/values-uk/strings.xml b/PermissionController/res/values-uk/strings.xml
index dfefbe975..58c3bbe44 100644
--- a/PermissionController/res/values-uk/strings.xml
+++ b/PermissionController/res/values-uk/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 день}one{# день}few{# дні}many{# днів}other{# дня}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 година}one{# година}few{# години}many{# годин}other{# години}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 хвилина}one{# хвилина}few{# хвилини}many{# хвилин}other{# хвилини}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# день}one{# день}few{# дні}many{# днів}other{# дня}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# година}one{# година}few{# години}many{# годин}other{# години}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# хв}one{# хв}few{# хв}many{# хв}other{# хв}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# с}one{# с}few{# с}many{# с}other{# с}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Будь-який дозвіл"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"У будь-який час"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Останні 7 днів"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Останні 24 години"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Остання година"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Останні 15 хвилин"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Остання хвилина"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{За останній # день}one{За останній # день}few{За останні # дні}many{За останні # днів}other{За останні # дня}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{За останню # годину}one{За останню # годину}few{За останні # години}many{За останні # годин}other{За останні # години}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{За останню # хвилину}one{За останню # хвилину}few{За останні # хвилини}many{За останні # хвилин}other{За останні # хвилини}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Дозволи не використовувалися"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Доступ за останній час"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Доступ за останні 7 днів"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Використання дозволів за останню годину"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Використання дозволів за останні 15 хвилин"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Використання дозволів за останню хвилину"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Дозвіл не використовувався протягом останніх 24 годин"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Дозвіл не використовувався протягом останніх 7 днів"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Не використовувався протягом останнього # дня}one{Не використовувався протягом останнього # дня}few{Не використовувався протягом останніх # днів}many{Не використовувався протягом останніх # днів}other{Не використовувався протягом останніх # дня}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Не використовувався протягом останньої # години}one{Не використовувався протягом останньої # години}few{Не використовувався протягом останніх # годин}many{Не використовувався протягом останніх # годин}other{Не використовувався протягом останніх # години}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Використано в 1 додатку}one{Використано в # додатку}few{Використано в # додатках}many{Використано в # додатках}other{Використано в # додатка}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Переглянути деталі на інформаційній панелі"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Відфільтровано за параметром \"<xliff:g id="PERM">%1$s</xliff:g>\""</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Заборонено"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Переглянути інші додатки, які мають доступ до всіх файлів"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 день}one{# день}few{# дні}many{# днів}other{# дня}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 година}one{# година}few{# години}many{# годин}other{# години}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 хвилина}one{# хвилина}few{# хвилини}many{# хвилин}other{# хвилини}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# година}one{# година}few{# години}many{# годин}other{# години}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# хвилина}one{# хвилина}few{# хвилини}many{# хвилин}other{# хвилини}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Нагадування про дозволи"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 невикористовуваний додаток"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Невикористовуваних додатків: <xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values-ur/strings.xml b/PermissionController/res/values-ur/strings.xml
index a53ae34c8..cd0633d2c 100644
--- a/PermissionController/res/values-ur/strings.xml
+++ b/PermissionController/res/values-ur/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 دن}other{# دن}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 گھنٹہ}other{# گھنٹے}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 منٹ}other{# منٹ}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 سیکنڈ}other{# سیکنڈ}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# دن}other{# دن}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# گھنٹہ}other{# گھنٹے}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# منٹ}other{# منٹ}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# سیکنڈ}other{# سیکنڈ}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"کوئی بھی اجازت"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"کسی بھی وقت"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"آخری 7 دن"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"آخری 24 گھنٹے"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"آخری 1 گھنٹہ"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"آخری 15 منٹ"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"آخری 1 منٹ"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{گزشتہ # دن}other{گزشتہ # دن}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{گزشتہ # گھنٹہ}other{گزشتہ # گھنٹے}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{گزشتہ # منٹ}other{گزشتہ # منٹ}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"اجازت کا استعمال نہیں ہوا ہے"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"کسی بھی وقت پر حالیہ ترین رسائی"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"آخری 7 دنوں میں حالیہ ترین رسائی"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"آخری 1 گھنٹے میں اجازت کا استعمال"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"آخری 15 منٹ میں اجازت کا استعمال"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"آخری 1 منٹ میں اجازت کا استعمال"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"گزشتہ 24 گھنٹے میں استعمال نہیں کی گئی"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"گزشتہ 7 دن میں استعمال نہیں کی گئی"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{گزشتہ # دن میں استعمال نہیں کی گئی}other{گزشتہ # دن میں استعمال نہیں کی گئی}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{گزشتہ # گھنٹے میں استعمال نہیں کی گئی}other{گزشتہ # گھنٹے میں استعمال نہیں کی گئی}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ایپ کے ذریعے استعمال کردہ}other{# ایپس کے ذریعے استعمال کردہ}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"سبھی کو ڈیش بورڈ میں دیکھیں"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"فلٹر کردہ بلحاظ: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"اجازت نہیں ہے"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"مزید ایپس دیکھیں جو تمام فائلز تک رسائی حاصل کر سکتی ہیں"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 دن}other{# دن}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 گھنٹہ}other{# گھنٹے}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 منٹ}other{# منٹ}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 سیکنڈ}other{# سیکنڈ}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# گھنٹہ}other{# گھنٹے}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# منٹ}other{# منٹ}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# سیکنڈ}other{# سیکنڈ}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"اجازت کی یاددہانیاں"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 غیر مستعمل ایپ"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> غیر مستعمل ایپس"</string>
diff --git a/PermissionController/res/values-uz/strings.xml b/PermissionController/res/values-uz/strings.xml
index f084beaaf..4d674d427 100644
--- a/PermissionController/res/values-uz/strings.xml
+++ b/PermissionController/res/values-uz/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 kun}other{# kun}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 soat}other{# soat}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 daq}other{# daq}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 son}other{# son}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# kun}other{# kun}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# soat}other{# soat}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# daq}other{# daq}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# son}other{# son}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Har qanday ruxsat"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Har qanday vaqt"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Oxirgi 7 kun"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Oxirgi 24 soat"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Oxirgi 1 soat"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Oxirgi 15 daqiqa"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Oxirgi 1 daqiqa"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Oxirgi # kun}other{Oxirgi # kun}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Oxirgi # soat}other{Oxirgi # soat}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Oxirgi # daqiqa}other{Oxirgi # daqiqa}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Ruxsatlardan foydalanilmagan"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Butun vaqtda ruxsatlardan foydalanish"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Oxirgi 7 kunda ruxsatlardan foydalanish"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Oxirgi 1 soatda ishlatilgan ruxsatlar"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Oxirgi 15 daqiqada ishlatilgan ruxsatlar"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Oxirgi 1 daqiqada ishlatilgan ruxsatlar"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Oxirgi 24 soatda foydalanilmagan"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Oxirgi 7 kunda foydalanilmagan"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Oxirgi # kunda foydalanilmagan}other{Oxirgi # kunda foydalanilmagan}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Oxirgi # soatda foydalanilmagan}other{Oxirgi # soatda foydalanilmagan}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ta ilova ishlatyapti}other{# ta ilova ishlatyapti}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Boshqaruv panelida ochish"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Filtrlar: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Ruxsat berilmagan"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Barcha fayllarga kirish uchun koʻproq ilovalarni koʻring"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 kun}other{# kun}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 soat}other{# soat}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 daqiqa}other{# daqiqa}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 soniya}other{# soniya}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# soat}other{# soat}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# daqiqa}other{# daqiqa}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# soniya}other{# soniya}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Ruxsat eslatmalari"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ta ishlatilmagan ilova"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ta ishlatilmagan ilova"</string>
diff --git a/PermissionController/res/values-v33/styles.xml b/PermissionController/res/values-v33/styles.xml
index af1f23b98..be1b46356 100644
--- a/PermissionController/res/values-v33/styles.xml
+++ b/PermissionController/res/values-v33/styles.xml
@@ -15,8 +15,7 @@
-->
<resources
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
+ xmlns:android="http://schemas.android.com/apk/res/android">
<!-- START SAFETY CENTER QUICK SETTINGS PAGE -->
<style name="SafetyCenterQsContainer"
@@ -174,9 +173,9 @@
<style name="SafetyCenterIndicatorCardView">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:cardCornerRadius">@dimen/sc_card_corner_radius_large</item>
- <item name="app:cardElevation">0dp</item>
- <item name="app:cardBackgroundColor">?attr/colorSurface</item>
+ <item name="cardCornerRadius">@dimen/sc_card_corner_radius_large</item>
+ <item name="cardElevation">0dp</item>
+ <item name="cardBackgroundColor">?attr/colorSurface</item>
<item name="android:layout_marginTop">@dimen/sc_spacing_large</item>
<item name="android:clickable">true</item>
<item name="android:foreground">?android:attr/selectableItemBackground</item>
@@ -342,9 +341,9 @@
<style name="SafetyCenterStatusImage" parent="android:Widget.DeviceDefault">
<item name="android:layout_width">56dp</item>
<item name="android:layout_height">56dp</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">@id/status_title_and_summary</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">@id/status_title_and_summary</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
<item name="android:scaleType">centerInside</item>
<item name="android:gravity">center</item>
</style>
@@ -356,9 +355,9 @@
<item name="android:layout_marginTop">@dimen/sc_spacing_xxsmall</item>
<item name="android:layout_marginStart">@dimen/sc_spacing_large</item>
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxxlarge</item>
- <item name="app:layout_constraintStart_toEndOf">@id/status_image</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintStart_toEndOf">@id/status_image</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
</style>
<style name="SafetyCenterStatusTitle" parent="android:Widget.DeviceDefault">
@@ -370,7 +369,7 @@
<style name="SafetyCenterStatusSummary" parent="android:Widget.DeviceDefault">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/status_title</item>
+ <item name="layout_constraintTop_toBottomOf">@id/status_title</item>
<item name="android:textAppearance">@style/TextAppearance.SafetyCenter.Body</item>
</style>
@@ -379,39 +378,39 @@
<style name="SafetyCenterStatusButton.ReviewSettings">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/status_title_and_summary</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/status_title_and_summary</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
<item name="android:layout_marginTop">@dimen/sc_spacing_xxxlarge</item>
- <item name="app:backgroundTint">@color/safety_center_button_info</item>
+ <item name="backgroundTint">@color/safety_center_button_info</item>
</style>
<style name="SafetyCenterStatusButton.Rescan">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/review_settings_button</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/review_settings_button</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
<item name="android:layout_marginTop">@dimen/sc_spacing_xxxlarge</item>
- <item name="app:backgroundTint">@color/safety_center_button_info</item>
+ <item name="backgroundTint">@color/safety_center_button_info</item>
</style>
<style name="SafetyCenterStatusButton.PendingActionsRescan">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/review_settings_button</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/review_settings_button</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
<item name="android:layout_marginTop">@dimen/sc_action_button_list_margin</item>
- <item name="app:backgroundTint">@color/sc_surface_dark</item>
- <item name="app:strokeWidth">@dimen/mtrl_btn_stroke_size</item>
- <item name="app:strokeColor">@color/safety_center_button_info</item>
+ <item name="backgroundTint">@color/sc_surface_dark</item>
+ <item name="strokeWidth">@dimen/mtrl_btn_stroke_size</item>
+ <item name="strokeColor">@color/safety_center_button_info</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="SafetyCenterStatusSafetyProtectionView">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/rescan_button</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/rescan_button</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
<item name="android:layout_gravity">center</item>
<item name="android:paddingTop">@dimen/sc_spacing_xxlarge</item>
<item name="android:paddingBottom">@dimen/sc_spacing_xxlarge</item>
@@ -429,8 +428,8 @@
<item name="android:background">@android:color/transparent</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
</style>
<style name="SafetyCenterIssueTitle">
@@ -438,11 +437,11 @@
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxxlarge</item>
- <item name="app:layout_constraintHorizontal_bias">0</item>
- <item name="app:layout_goneMarginEnd">0dp</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toStartOf">@id/issue_card_dismiss_btn</item>
+ <item name="layout_constraintHorizontal_bias">0</item>
+ <item name="layout_goneMarginEnd">0dp</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toStartOf">@id/issue_card_dismiss_btn</item>
</style>
<style name="SafetyCenterIssueSubtitle">
@@ -450,8 +449,8 @@
<item name="android:layout_marginTop">@dimen/sc_spacing_xxsmall</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
- <item name="app:layout_constraintStart_toStartOf">@id/issue_card_title</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/issue_card_title</item>
+ <item name="layout_constraintStart_toStartOf">@id/issue_card_title</item>
+ <item name="layout_constraintTop_toBottomOf">@id/issue_card_title</item>
</style>
<style name="SafetyCenterIssueSummary">
@@ -459,8 +458,8 @@
<item name="android:layout_marginTop">@dimen/sc_spacing_large</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
- <item name="app:layout_constraintStart_toStartOf">@id/issue_card_title</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/issue_card_subtitle</item>
+ <item name="layout_constraintStart_toStartOf">@id/issue_card_title</item>
+ <item name="layout_constraintTop_toBottomOf">@id/issue_card_subtitle</item>
</style>
<style name="SafetyCenterIssueActionButtonList"
@@ -469,18 +468,18 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">0dp</item>
<item name="android:orientation">vertical</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/issue_card_summary</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/issue_card_summary</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
</style>
<style name="SafetyCenterIssueSafetyProtectionSection">
<item name="android:gravity">center</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">0dp</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/issue_card_action_button_list</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/issue_card_action_button_list</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
<item name="android:paddingTop">@dimen/sc_spacing_xxlarge</item>
<item name="android:paddingBottom">@dimen/sc_spacing_xxlarge</item>
</style>
@@ -489,17 +488,17 @@
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">0dp</item>
<item name="android:gravity">center</item>
- <item name="app:layout_constraintWidth_default">wrap</item>
- <item name="app:layout_constraintHeight_default">wrap</item>
- <item name="app:layout_constraintWidth_max">112dp</item>
- <item name="app:layout_constraintHeight_max">112dp</item>
- <item name="app:layout_constraintWidth_min">84dp</item>
- <item name="app:layout_constraintHeight_min">84dp</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toTopOf">@id/resolved_issue_text</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
- <item name="app:layout_constraintVertical_chainStyle">packed</item>
+ <item name="layout_constraintWidth_default">wrap</item>
+ <item name="layout_constraintHeight_default">wrap</item>
+ <item name="layout_constraintWidth_max">112dp</item>
+ <item name="layout_constraintHeight_max">112dp</item>
+ <item name="layout_constraintWidth_min">84dp</item>
+ <item name="layout_constraintHeight_min">84dp</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toTopOf">@id/resolved_issue_text</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintVertical_chainStyle">packed</item>
</style>
<style name="SafetyCenterIssueCardResolvedTitle">
@@ -511,10 +510,10 @@
<item name="android:gravity">center</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:layout_constraintTop_toBottomOf">@id/resolved_issue_image</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toBottomOf">@id/resolved_issue_image</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
</style>
<style name="SafetyCenterMoreIssues"
@@ -533,11 +532,11 @@
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxlarge</item>
<item name="android:maxLines">2</item>
<item name="android:ellipsize">end</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
- <item name="app:layout_constraintStart_toEndOf">@id/status_icon</item>
- <item name="app:layout_constraintEnd_toStartOf">@android:id/widget_frame</item>
- <item name="app:layout_constraintHorizontal_bias">0</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintStart_toEndOf">@id/status_icon</item>
+ <item name="layout_constraintEnd_toStartOf">@android:id/widget_frame</item>
+ <item name="layout_constraintHorizontal_bias">0</item>
</style>
<style name="SafetyCenterMoreIssuesIcon"
@@ -545,9 +544,9 @@
<item name="android:layout_height">20dp</item>
<item name="android:layout_width">20dp</item>
<item name="android:gravity">center</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
- <item name="app:layout_constraintStart_toStartOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintStart_toStartOf">parent</item>
</style>
<style name="SafetyCenterMoreIssuesWidgetFrame"
@@ -556,9 +555,9 @@
<item name="android:layout_width">wrap_content</item>
<item name="android:gravity">center_vertical</item>
<item name="android:orientation">vertical</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
</style>
<style name="SafetyCenterMoreIssuesWidget"
@@ -578,10 +577,10 @@
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxxsmall</item>
<item name="android:maxLines">1</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
- <item name="app:layout_constraintEnd_toStartOf">@id/widget_icon</item>
- <item name="app:layout_constraintHorizontal_bias">0</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintEnd_toStartOf">@id/widget_icon</item>
+ <item name="layout_constraintHorizontal_bias">0</item>
</style>
<style name="SafetyCenterMoreIssuesWidgetIcon"
@@ -589,9 +588,9 @@
<item name="android:layout_height">16dp</item>
<item name="android:layout_width">16dp</item>
<item name="android:gravity">center</item>
- <item name="app:layout_constraintTop_toTopOf">parent</item>
- <item name="app:layout_constraintBottom_toBottomOf">parent</item>
- <item name="app:layout_constraintEnd_toEndOf">parent</item>
+ <item name="layout_constraintTop_toTopOf">parent</item>
+ <item name="layout_constraintBottom_toBottomOf">parent</item>
+ <item name="layout_constraintEnd_toEndOf">parent</item>
<item name="android:scaleType">fitCenter</item>
<item name="android:tint">?android:attr/textColorPrimary</item>
</style>
diff --git a/PermissionController/res/values-vi/strings.xml b/PermissionController/res/values-vi/strings.xml
index ab0340562..320a4a886 100644
--- a/PermissionController/res/values-vi/strings.xml
+++ b/PermissionController/res/values-vi/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 ngày}other{# ngày}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 giờ}other{# giờ}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 phút}other{# phút}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 giây}other{# giây}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# ngày}other{# ngày}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# giờ}other{# giờ}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# phút}other{# phút}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# giây}other{# giây}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Mọi quyền"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Mọi lúc"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"7 ngày qua"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"24 giờ qua"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"1 giờ qua"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"15 phút qua"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"1 phút qua"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{# ngày qua}other{# ngày qua}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{# giờ qua}other{# giờ qua}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{# phút qua}other{# phút qua}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Không sử dụng quyền"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Lần truy cập gần đây nhất vào bất kỳ thời gian nào"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Lần truy cập gần đây nhất trong 7 ngày qua"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Tần suất sử dụng quyền trong 1 giờ trước"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Tần suất sử dụng quyền trong 15 phút trước"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Tần suất sử dụng quyền trong 1 phút trước"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Không sử dụng trong 24 giờ qua"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Không sử dụng trong 7 ngày qua"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Không sử dụng trong # ngày qua}other{Không sử dụng trong # ngày qua}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Không sử dụng trong # giờ qua}other{Không sử dụng trong # giờ qua}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 ứng dụng đã dùng}other{# ứng dụng đã dùng}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Xem tất cả trong Trang tổng quan"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Lọc theo: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Không được phép"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Xem thêm ứng dụng có thể truy cập tất cả các tệp"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 ngày}other{# ngày}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 giờ}other{# giờ}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 phút}other{# phút}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 giây}other{# giây}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# giờ}other{# giờ}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# phút}other{# phút}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# giây}other{# giây}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Lời nhắc về quyền"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 ứng dụng không dùng đến"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> ứng dụng không dùng đến"</string>
diff --git a/PermissionController/res/values-zh-rCN/strings.xml b/PermissionController/res/values-zh-rCN/strings.xml
index 08467a438..08e834ac4 100644
--- a/PermissionController/res/values-zh-rCN/strings.xml
+++ b/PermissionController/res/values-zh-rCN/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 小时}other{# 小时}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 分钟}other{# 分钟}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# 小时}other{# 小时}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# 分钟}other{# 分钟}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"不限权限"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"不限时间"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"过去 7 天"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"过去 24 小时"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"过去 1 小时"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"过去 15 分钟"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"过去 1 分钟"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{过去 # 天}other{过去 # 天}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{过去 # 小时}other{过去 # 小时}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{过去 # 分钟}other{过去 # 分钟}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"没有使用此权限的应用"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"最近使用的访问权限(不限时间)"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"最近使用的访问权限(过去 7 天内)"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"过去 1 小时内的权限使用频率"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"过去 15 分钟内的权限使用频率"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"过去 1 分钟内的权限使用频率"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"过去 24 小时内未使用"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"过去 7 天内未使用过"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{过去 # 天内未使用过}other{过去 # 天内未使用过}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{过去 # 小时内未使用过}other{过去 # 小时内未使用过}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{有 1 个应用使用过}other{有 # 个应用使用过}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"在信息中心查看全部详细信息"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"过滤条件:<xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"不允许"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"查看更多可以访问所有文件的应用"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 小时}other{# 小时}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 分钟}other{# 分钟}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# 小时}other{# 小时}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# 分钟}other{# 分钟}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"权限提醒"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 个未使用的应用"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> 个未使用的应用"</string>
diff --git a/PermissionController/res/values-zh-rHK/strings.xml b/PermissionController/res/values-zh-rHK/strings.xml
index c353200a7..6f7d48f43 100644
--- a/PermissionController/res/values-zh-rHK/strings.xml
+++ b/PermissionController/res/values-zh-rHK/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 小時}other{# 小時}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"任何權限"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"不限時間"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"過去 7 天"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"過去 24 小時"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"過去 1 小時"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"過去 15 分鐘"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"過去 1 分鐘"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{過去 # 日}other{過去 # 日}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{過去 # 小時}other{過去 # 小時}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{過去 # 分鐘}other{過去 # 分鐘}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"沒有應用程式使用要求的權限"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"任意時段內的最近一次存取"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"過去 7 天內的近期存取"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"過去 1 小時內的權限使用情況"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"過去 15 分鐘內的權限使用情況"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"過去 1 分鐘內的權限使用情況"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"過去 24 小時內未使用"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"過去 7 天內未使用"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{過去 # 天內並未使用}other{過去 # 天內並未使用}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{過去 # 小時內並未使用}other{過去 # 小時內並未使用}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{有 1 個應用程式使用過}other{有 # 個應用程式使用過}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"在「資訊主頁」查看全部"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"篩選條件:<xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"不允許"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"顯示更多可存取所有檔案的應用程式"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 小時}other{# 小時}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 秒}other{# 秒}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# 秒}other{# 秒}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"權限提醒"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 個不使用的應用程式"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> 個不使用的應用程式"</string>
diff --git a/PermissionController/res/values-zh-rTW/strings.xml b/PermissionController/res/values-zh-rTW/strings.xml
index 69328e0ca..d831c2c65 100644
--- a/PermissionController/res/values-zh-rTW/strings.xml
+++ b/PermissionController/res/values-zh-rTW/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{1 小時}other{# 小時}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{1 秒鐘}other{# 秒鐘}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{# 天}other{# 天}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{# 秒鐘}other{# 秒鐘}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"不限權限"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"不限時間"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"過去 7 天"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"過去 24 小時"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"過去 1 小時"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"過去 15 分鐘"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"過去 1 分鐘內"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{過去 # 天內}other{過去 # 天內}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{過去 # 小時內}other{過去 # 小時內}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{過去 # 分鐘內}other{過去 # 分鐘內}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"沒有使用此權限的應用程式"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"近期使用的存取權 (依時間順序)"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"過去 7 天內使用的存取權 (依時間順序)"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"過去 1 小時內各權限的使用頻率"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"過去 15 分鐘內各權限的使用頻率"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"過去 1 分鐘內各權限的使用頻率"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"過去 24 小時內未使用"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"過去 7 天內未使用"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{過去 # 天內未使用}other{過去 # 天內未使用}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{過去 # 小時內未使用}other{過去 # 小時內未使用}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{1 個應用程式使用過}other{# 個應用程式使用過}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"在資訊主頁查看所有詳細資料"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"篩選依據:<xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"不允許"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"查看可存取所有檔案的其他應用程式"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{1 天}other{# 天}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{1 小時}other{# 小時}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{1 分鐘}other{# 分鐘}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{1 秒鐘}other{# 秒鐘}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{# 小時}other{# 小時}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{# 分鐘}other{# 分鐘}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{# 秒鐘}other{# 秒鐘}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"權限提醒"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"1 個未使用的應用程式"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"<xliff:g id="NUMBER_OF_APPS">%s</xliff:g> 個未使用的應用程式"</string>
diff --git a/PermissionController/res/values-zu/strings.xml b/PermissionController/res/values-zu/strings.xml
index 092f5a05d..34857b35e 100644
--- a/PermissionController/res/values-zu/strings.xml
+++ b/PermissionController/res/values-zu/strings.xml
@@ -137,17 +137,15 @@
<string name="auto_permission_usage_timeline_summary" msgid="2713135806453218703">"<xliff:g id="ACCESS_TIME">%1$s</xliff:g> • <xliff:g id="SUMMARY_TEXT">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_2" msgid="1521763591164293683">"<xliff:g id="APP_NAME">%1$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%2$s</xliff:g>"</string>
<string name="history_preference_subtext_3" msgid="758761785983094351">"<xliff:g id="ATTRIBUTION_NAME">%1$s</xliff:g> • <xliff:g id="APP_NAME">%2$s</xliff:g> • <xliff:g id="TRUNCATED_TIME">%3$s</xliff:g>"</string>
- <string name="duration_used_days" msgid="8293010131040301793">"{count,plural, =1{usuku 1}one{izinsuku #}other{izinsuku #}}"</string>
- <string name="duration_used_hours" msgid="1128716208752263576">"{count,plural, =1{ihora 1}one{amahora #}other{amahora #}}"</string>
- <string name="duration_used_minutes" msgid="5335824115042576567">"{count,plural, =1{umzuzu 1}one{imizuzu #}other{imizuzu #}}"</string>
- <string name="duration_used_seconds" msgid="6543746449171675028">"{count,plural, =1{umzuzwana 1}one{imizuzwana #}other{imizuzwana #}}"</string>
+ <string name="duration_used_days" msgid="8238355545812998877">"{count,plural, =1{Usuku olungu-#}one{Izinsuku ezingu-#}other{Izinsuku ezingu-#}}"</string>
+ <string name="duration_used_hours" msgid="4983814806123370332">"{count,plural, =1{Ihora elingu-#}one{Amahora angu-#}other{Amahora angu-#}}"</string>
+ <string name="duration_used_minutes" msgid="1701379522897227819">"{count,plural, =1{Umzuzu ongu-#}one{Imizuzu engu-#}other{Imizuzu engu-#}}"</string>
+ <string name="duration_used_seconds" msgid="4067390990568727715">"{count,plural, =1{Isekhondi elingu-#}one{Amasekhondi angu-#}other{Amasekhondi angu-#}}"</string>
<string name="permission_usage_any_permission" msgid="6358023078298106997">"Noma iyiphi imvume"</string>
<string name="permission_usage_any_time" msgid="3802087027301631827">"Noma yisiphi isikhathi"</string>
- <string name="permission_usage_last_7_days" msgid="7386221251886130065">"Izinsuku zokugcina ezingu-7"</string>
- <string name="permission_usage_last_day" msgid="1512880889737305115">"Amahora angu-24 okugcina"</string>
- <string name="permission_usage_last_hour" msgid="3866005205535400264">"Ihora lokugcina elingu-1"</string>
- <string name="permission_usage_last_15_minutes" msgid="9077554653436200702">"Amaminithi angu-15 okugcina"</string>
- <string name="permission_usage_last_minute" msgid="7297055967335176238">"Iminithi lokugcina elingu-1"</string>
+ <string name="permission_usage_last_n_days" msgid="7882626467375714145">"{count,plural, =1{Usuku lokugcina olungu-#}one{Izinsuku zokugcina ezingu-#}other{Izinsuku zokugcina ezingu-#}}"</string>
+ <string name="permission_usage_last_n_hours" msgid="8490466053680267858">"{count,plural, =1{Ihora lokugcina elingu-#}one{Amahora okugcina angu-#}other{Amahora okugcina angu-#}}"</string>
+ <string name="permission_usage_last_n_minutes" msgid="7817864229878281983">"{count,plural, =1{Umzuzu wokugcina ongu-#}one{Imizuzu yokugcina engu-#}other{Imizuzu yokugcina engu-#}}"</string>
<string name="no_permission_usages" msgid="9119517454177289331">"Akukho ukusetshenziswa kwemvume"</string>
<string name="permission_usage_list_title_any_time" msgid="8718257027381592407">"Ukufinyelela kwakamuva kakhulu noma kunini"</string>
<string name="permission_usage_list_title_last_7_days" msgid="9048542342670890615">"Ukufinyelela kwakamuva kakhulu ezinsukwini zokugcina ezingu-7"</string>
@@ -161,8 +159,8 @@
<string name="permission_usage_bar_chart_title_last_hour" msgid="6571647509660009185">"Ukusetshenziswa kwembume kuhora lokugcina elingu-1"</string>
<string name="permission_usage_bar_chart_title_last_15_minutes" msgid="2743143675412824819">"Ukusetshenziswa kwemvume kumaminithi okugcina okungu-15"</string>
<string name="permission_usage_bar_chart_title_last_minute" msgid="820450867183487607">"Ukusetshenziswa kwemvume ngeminithi elingu-1 lokugcina"</string>
- <string name="permission_usage_preference_summary_not_used_24h" msgid="3087783232178611025">"Ayisetshenziswanga emahoreni angama-24 adlule"</string>
- <string name="permission_usage_preference_summary_not_used_7d" msgid="4592301300810120096">"Akusetshenziswanga ezinsukwini ezi-7 ezedlule"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days" msgid="4771868094611359651">"{count,plural, =1{Akusetshenziswanga osukwini olungu-# olwedlule}one{Akusetshenziswanga ezinsukwini ezingu-# ezedlule}other{Akusetshenziswanga ezinsukwini ezingu-# ezedlule}}"</string>
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours" msgid="3828973177433435742">"{count,plural, =1{Akusetshenziswanga ehoreni elingu-# eledlule}one{Akusetshenziswanga emahoreni angu-# adlule}other{Akusetshenziswanga emahoreni angu-# adlule}}"</string>
<string name="permission_usage_preference_label" msgid="8343167938128676378">"{count,plural, =1{Kusetshenziswe i-app e-1}one{Kusetshenziswe ama-app angu-#}other{Kusetshenziswe ama-app angu-#}}"</string>
<string name="permission_usage_view_details" msgid="6675335735468752787">"Bona konke kudeshibhodi"</string>
<string name="app_permission_usage_filter_label" msgid="7182861154638631550">"Kuhlungwe ngalokhu: <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -253,9 +251,9 @@
<string name="denied_header" msgid="903209608358177654">"Akuvumelekile"</string>
<string name="storage_footer_hyperlink_text" msgid="8873343987957834810">"Bona ama-app engeziwe akwazi ukufinyelela wonke amafayela"</string>
<string name="days" msgid="609563020985571393">"{count,plural, =1{usuku 1}one{izinsuku #}other{izinsuku #}}"</string>
- <string name="hours" msgid="3447767892295843282">"{count,plural, =1{ihora 1}one{amahora #}other{amahora #}}"</string>
- <string name="minutes" msgid="4408293038068503157">"{count,plural, =1{umzuzu 1}one{imizuzu #}other{imizuzu #}}"</string>
- <string name="seconds" msgid="5397771912131132690">"{count,plural, =1{umzuzwana 1}one{imizuzwana #}other{imizuzwana #}}"</string>
+ <string name="hours" msgid="7302866489666950038">"{count,plural, =1{Ihora elingu-#}one{Amahora angu-#}other{Amahora angu-#}}"</string>
+ <string name="minutes" msgid="4868414855445375753">"{count,plural, =1{Umzuzu ongu-#}one{Imizuzu engu-#}other{Imizuzu engu-#}}"</string>
+ <string name="seconds" msgid="5893958182059842734">"{count,plural, =1{Isekhondi engu-#}one{Amasekhondi angu-#}other{Amasekhondi angu-#}}"</string>
<string name="permission_reminders" msgid="6528257957664832636">"Izikhumbuzi zemvume"</string>
<string name="auto_revoke_permission_reminder_notification_title_one" msgid="6690347469376854137">"Uhlelo lokusebenza olungasetshenzisiwe olu-1"</string>
<string name="auto_revoke_permission_reminder_notification_title_many" msgid="6062217713645069960">"Izinhlelo zokusebenza ezingasetshenzisiwe ezingu-<xliff:g id="NUMBER_OF_APPS">%s</xliff:g>"</string>
diff --git a/PermissionController/res/values/strings.xml b/PermissionController/res/values/strings.xml
index 287f81865..79ba3d389 100644
--- a/PermissionController/res/values/strings.xml
+++ b/PermissionController/res/values/strings.xml
@@ -412,25 +412,25 @@
<!-- Duration used for a permission in days -->
<string name="duration_used_days">{count, plural,
- =1 {1 day}
+ =1 {# day}
other {# days}
}</string>
<!-- Duration used for a permission in hours -->
<string name="duration_used_hours">{count, plural,
- =1 {1 hour}
+ =1 {# hour}
other {# hours}
}</string>
<!-- Duration used for a permission in minutes -->
<string name="duration_used_minutes">{count, plural,
- =1 {1 min}
+ =1 {# min}
other {# mins}
}</string>
<!-- Duration used for a permission in seconds -->
<string name="duration_used_seconds">{count, plural,
- =1 {1 sec}
+ =1 {# sec}
other {# secs}
}</string>
@@ -440,20 +440,23 @@
<!-- Description for showing permission accesses accessed any time [CHAR LIMIT=30] -->
<string name="permission_usage_any_time">Any time</string>
- <!-- Description for showing permissions accessed in the last 7 days [CHAR LIMIT=30] -->
- <string name="permission_usage_last_7_days">Last 7 days</string>
-
- <!-- Description for showing permissions accessed in the last day [CHAR LIMIT=30] -->
- <string name="permission_usage_last_day">Last 24 hours</string>
-
- <!-- Description for showing permissions accessed in the last hour [CHAR LIMIT=30] -->
- <string name="permission_usage_last_hour">Last 1 hour</string>
+ <!-- Description for showing permissions accessed in the last n days [CHAR LIMIT=30] -->
+ <string name="permission_usage_last_n_days">{count, plural,
+ =1 {Last # day}
+ other {Last # days}
+ }</string>
- <!-- Description for showing permissions accessed in the last 15 minutes [CHAR LIMIT=30] -->
- <string name="permission_usage_last_15_minutes">Last 15 minutes</string>
+ <!-- Description for showing permissions accessed in the last n hours [CHAR LIMIT=30] -->
+ <string name="permission_usage_last_n_hours">{count, plural,
+ =1 {Last # hour}
+ other {Last # hours}
+ }</string>
- <!-- Description for showing permissions accessed in the last minute [CHAR LIMIT=30] -->
- <string name="permission_usage_last_minute">Last 1 minute</string>
+ <!-- Description for showing permissions accessed in the last n minutes [CHAR LIMIT=30] -->
+ <string name="permission_usage_last_n_minutes">{count, plural,
+ =1 {Last # minute}
+ other {Last # minutes}
+ }</string>
<!-- Label when no apps have used the requested permissions [CHAR LIMIT=30] -->
<string name="no_permission_usages">No permission usages</string>
@@ -494,11 +497,17 @@
<!-- Label for the title of the permission bar chart showing how often the most common permissions are used [CHAR LIMIT=50] -->
<string name="permission_usage_bar_chart_title_last_minute">Permission usage in last 1 minute</string>
- <!-- Summary text if a permission usage is not used in past 24 hours [CHAR LIMIT=60] -->
- <string name="permission_usage_preference_summary_not_used_24h">Not used in past 24 hours</string>
+ <!-- Summary text if a permission usage is not used in past n days [CHAR LIMIT=60] -->
+ <string name="permission_usage_preference_summary_not_used_in_past_n_days">{count, plural,
+ =1 {Not used in past # day}
+ other {Not used in past # days}
+ }</string>
- <!-- Summary text if a permission usage is not used in past 7 days [CHAR LIMIT=60] -->
- <string name="permission_usage_preference_summary_not_used_7d">Not used in past 7 days</string>
+ <!-- Summary text if a permission usage is not used in past n hours [CHAR LIMIT=60] -->
+ <string name="permission_usage_preference_summary_not_used_in_past_n_hours">{count, plural,
+ =1 {Not used in past # hour}
+ other {Not used in past # hours}
+ }</string>
<!-- Label for the permission usage preference that shows how many apps have used various permissions [CHAR LIMIT=50] -->
<string name="permission_usage_preference_label">{count, plural,
@@ -784,19 +793,19 @@
<!-- Time in hours -->
<string name="hours">{count, plural,
- =1 {1 hour}
+ =1 {# hour}
other {# hours}
}</string>
<!-- Time in minutes -->
<string name="minutes">{count, plural,
- =1 {1 minute}
+ =1 {# minute}
other {# minutes}
}</string>
<!-- Time in seconds -->
<string name="seconds">{count, plural,
- =1 {1 second}
+ =1 {# second}
other {# seconds}
}</string>
diff --git a/PermissionController/res/values/styles.xml b/PermissionController/res/values/styles.xml
index 3826a853d..bb1c7fdc8 100644
--- a/PermissionController/res/values/styles.xml
+++ b/PermissionController/res/values/styles.xml
@@ -110,7 +110,6 @@
<item name="android:gravity">center_horizontal</item>
<item name="android:layout_marginEnd">16dp</item>
<item name="android:drawablePadding">8dp</item>
- <item name="android:gravity">center_horizontal</item>
</style>
<style name="PermissionLocationAccuracyRadioCoarse">
@@ -119,7 +118,6 @@
<item name="android:gravity">center_horizontal</item>
<item name="android:layout_marginStart">16dp</item>
<item name="android:drawablePadding">8dp</item>
- <item name="android:gravity">center_horizontal</item>
</style>
<style name="PermissionLocationAccuracyFineImageView">
@@ -1106,18 +1104,16 @@
<item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
</style>
- <style name="WarningBannerCardView"
- xmlns:card_view="http://schemas.android.com/apk/res-auto"
- xmlns:app="http://schemas.android.com/apk/res-auto" >
+ <style name="WarningBannerCardView">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="app:cardCornerRadius">20dp</item>
- <item name="app:cardBackgroundColor">@color/warning_surface</item>
- <item name="app:cardElevation">0dp</item>
- <item name="card_view:contentPaddingBottom">8dp</item>
- <item name="card_view:contentPaddingTop">20dp</item>
- <item name="card_view:contentPaddingLeft">20dp</item>
- <item name="card_view:contentPaddingRight">20dp</item>
+ <item name="cardCornerRadius">20dp</item>
+ <item name="cardBackgroundColor">@color/warning_surface</item>
+ <item name="cardElevation">0dp</item>
+ <item name="contentPaddingBottom">8dp</item>
+ <item name="contentPaddingTop">20dp</item>
+ <item name="contentPaddingLeft">20dp</item>
+ <item name="contentPaddingRight">20dp</item>
</style>
<style name="WarningBannerIcon">
diff --git a/PermissionController/res/values/themes.xml b/PermissionController/res/values/themes.xml
index 16ff3c15a..38b8347b4 100644
--- a/PermissionController/res/values/themes.xml
+++ b/PermissionController/res/values/themes.xml
@@ -57,8 +57,12 @@
<item name="android:windowIsTranslucent">true</item>
</style>
- <style name="GrantPermissions.Car">
- <item name="carUiActivity">true</item>
+ <style name="GrantPermissions.Car" parent="Theme.CarUi.NoToolbar">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <!-- The following attributes change the behavior of the dialog, hence they should not be
+ themed -->
+ <item name="android:windowIsTranslucent">true</item>
</style>
<!-- Unused since R but exposed as overlayable. -->
diff --git a/PermissionController/res/xml-v34/safety_center_subpage.xml b/PermissionController/res/xml-v34/safety_center_subpage.xml
new file mode 100644
index 000000000..75089e40d
--- /dev/null
+++ b/PermissionController/res/xml-v34/safety_center_subpage.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+</PreferenceScreen>
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml
index 1a37f3538..88f4ae137 100644
--- a/PermissionController/res/xml/roles.xml
+++ b/PermissionController/res/xml/roles.xml
@@ -600,6 +600,7 @@
<permission name="android.permission.ADD_ALWAYS_UNLOCKED_DISPLAY" minSdkVersion="33" />
<permission name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE"
minSdkVersion="33" />
+ <permission name="android.permission.MANAGE_DEVICE_LOCK_STATE" minSdkVersion="34" />
</permissions>
</role>
@@ -1187,6 +1188,7 @@
<permission name="android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES" />
<permission name="android.permission.QUERY_ADMIN_POLICY" />
<permission name="android.permission.TRIGGER_LOST_MODE" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_APP_EXEMPTIONS" />
</permissions>
</role>
@@ -1340,4 +1342,17 @@
<permission name="android.permission.NET_TUNNELING" />
</permissions>
</role>
+
+ <!--
+ ~ A role assigned to the financing kiosk app
+ -->
+ <role
+ name="android.app.role.FINANCED_DEVICE_KIOSK"
+ exclusive="true"
+ minSdkVersion="34"
+ visible="false">
+ <permissions>
+ <permission name="android.permission.MANAGE_DEVICE_LOCK_STATE" />
+ </permissions>
+ </role>
</roles>
diff --git a/PermissionController/src/android/support/wearable/view/CircledImageView.java b/PermissionController/src/android/support/wearable/view/CircledImageView.java
deleted file mode 100644
index 915ba691e..000000000
--- a/PermissionController/src/android/support/wearable/view/CircledImageView.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.wear.ble.view;
-
-import android.animation.ArgbEvaluator;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.RadialGradient;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.permissioncontroller.R;
-
-import java.util.Objects;
-
-/**
- * An image view surrounded by a circle.
- */
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
-public class CircledImageView extends View {
-
- private static final ArgbEvaluator ARGB_EVALUATOR = new ArgbEvaluator();
-
- private Drawable mDrawable;
-
- private final RectF mOval;
- private final Paint mPaint;
-
- private ColorStateList mCircleColor;
-
- private float mCircleRadius;
- private float mCircleRadiusPercent;
-
- private float mCircleRadiusPressed;
- private float mCircleRadiusPressedPercent;
-
- private float mRadiusInset;
-
- private int mCircleBorderColor;
-
- private float mCircleBorderWidth;
- private float mProgress = 1f;
- private final float mShadowWidth;
-
- private float mShadowVisibility;
- private boolean mCircleHidden = false;
-
- private float mInitialCircleRadius;
-
- private boolean mPressed = false;
-
- private boolean mProgressIndeterminate;
- private ProgressDrawable mIndeterminateDrawable;
- private Rect mIndeterminateBounds = new Rect();
- private long mColorChangeAnimationDurationMs = 0;
-
- private float mImageCirclePercentage = 1f;
- private float mImageHorizontalOffcenterPercentage = 0f;
- private Integer mImageTint;
-
- private final Drawable.Callback mDrawableCallback = new Drawable.Callback() {
- @Override
- public void invalidateDrawable(Drawable drawable) {
- invalidate();
- }
-
- @Override
- public void scheduleDrawable(Drawable drawable, Runnable runnable, long l) {
- // Not needed.
- }
-
- @Override
- public void unscheduleDrawable(Drawable drawable, Runnable runnable) {
- // Not needed.
- }
- };
-
- private int mCurrentColor;
-
- private final AnimatorUpdateListener mAnimationListener = new AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- int color = (int) animation.getAnimatedValue();
- if (color != CircledImageView.this.mCurrentColor) {
- CircledImageView.this.mCurrentColor = color;
- CircledImageView.this.invalidate();
- }
- }
- };
-
- private ValueAnimator mColorAnimator;
-
- public CircledImageView(Context context) {
- this(context, null);
- }
-
- public CircledImageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public CircledImageView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CircledImageView);
- mDrawable = a.getDrawable(R.styleable.CircledImageView_android_src);
-
- mCircleColor = a.getColorStateList(R.styleable.CircledImageView_circle_color);
- if (mCircleColor == null) {
- mCircleColor = ColorStateList.valueOf(android.R.color.darker_gray);
- }
-
- mCircleRadius = a.getDimension(
- R.styleable.CircledImageView_circle_radius, 0);
- mInitialCircleRadius = mCircleRadius;
- mCircleRadiusPressed = a.getDimension(
- R.styleable.CircledImageView_circle_radius_pressed, mCircleRadius);
- mCircleBorderColor = a.getColor(
- R.styleable.CircledImageView_circle_border_color, Color.BLACK);
- mCircleBorderWidth = a.getDimension(R.styleable.CircledImageView_circle_border_width, 0);
-
- if (mCircleBorderWidth > 0) {
- mRadiusInset += mCircleBorderWidth;
- }
-
- float circlePadding = a.getDimension(R.styleable.CircledImageView_circle_padding, 0);
- if (circlePadding > 0) {
- mRadiusInset += circlePadding;
- }
- mShadowWidth = a.getDimension(R.styleable.CircledImageView_shadow_width, 0);
-
- mImageCirclePercentage = a.getFloat(
- R.styleable.CircledImageView_image_circle_percentage, 0f);
-
- mImageHorizontalOffcenterPercentage = a.getFloat(
- R.styleable.CircledImageView_image_horizontal_offcenter_percentage, 0f);
-
- if (a.hasValue(R.styleable.CircledImageView_image_tint)) {
- mImageTint = a.getColor(R.styleable.CircledImageView_image_tint, 0);
- }
-
- mCircleRadiusPercent = a.getFraction(R.styleable.CircledImageView_circle_radius_percent,
- 1, 1, 0f);
-
- mCircleRadiusPressedPercent = a.getFraction(
- R.styleable.CircledImageView_circle_radius_pressed_percent, 1, 1,
- mCircleRadiusPercent);
-
- a.recycle();
-
- mOval = new RectF();
- mPaint = new Paint();
- mPaint.setAntiAlias(true);
-
- mIndeterminateDrawable = new ProgressDrawable();
- // {@link #mDrawableCallback} must be retained as a member, as Drawable callback
- // is held by weak reference, we must retain it for it to continue to be called.
- mIndeterminateDrawable.setCallback(mDrawableCallback);
-
- setWillNotDraw(false);
-
- setColorForCurrentState();
- }
-
- public void setCircleHidden(boolean circleHidden) {
- if (circleHidden != mCircleHidden) {
- mCircleHidden = circleHidden;
- invalidate();
- }
- }
-
-
- @Override
- protected boolean onSetAlpha(int alpha) {
- return true;
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- int paddingLeft = getPaddingLeft();
- int paddingTop = getPaddingTop();
-
-
- float circleRadius = mPressed ? getCircleRadiusPressed() : getCircleRadius();
- if (mShadowWidth > 0 && mShadowVisibility > 0) {
- // First let's find the center of the view.
- mOval.set(paddingLeft, paddingTop, getWidth() - getPaddingRight(),
- getHeight() - getPaddingBottom());
- // Having the center, lets make the shadow start beyond the circled and possibly the
- // border.
- final float radius = circleRadius + mCircleBorderWidth +
- mShadowWidth * mShadowVisibility;
- mPaint.setColor(Color.BLACK);
- mPaint.setAlpha(Math.round(mPaint.getAlpha() * getAlpha()));
- mPaint.setStyle(Style.FILL);
- // TODO: precalc and pre-allocate this
- mPaint.setShader(new RadialGradient(mOval.centerX(), mOval.centerY(), radius,
- new int[]{Color.BLACK, Color.TRANSPARENT}, new float[]{0.6f, 1f},
- Shader.TileMode.MIRROR));
- canvas.drawCircle(mOval.centerX(), mOval.centerY(), radius, mPaint);
- mPaint.setShader(null);
- }
- if (mCircleBorderWidth > 0) {
- // First let's find the center of the view.
- mOval.set(paddingLeft, paddingTop, getWidth() - getPaddingRight(),
- getHeight() - getPaddingBottom());
- // Having the center, lets make the border meet the circle.
- mOval.set(mOval.centerX() - circleRadius, mOval.centerY() - circleRadius,
- mOval.centerX() + circleRadius, mOval.centerY() + circleRadius);
- mPaint.setColor(mCircleBorderColor);
- // {@link #Paint.setAlpha} is a helper method that just sets the alpha portion of the
- // color. {@link #Paint.setPaint} will clear any previously set alpha value.
- mPaint.setAlpha(Math.round(mPaint.getAlpha() * getAlpha()));
- mPaint.setStyle(Style.STROKE);
- mPaint.setStrokeWidth(mCircleBorderWidth);
-
- if (mProgressIndeterminate) {
- mOval.roundOut(mIndeterminateBounds);
- mIndeterminateDrawable.setBounds(mIndeterminateBounds);
- mIndeterminateDrawable.setRingColor(mCircleBorderColor);
- mIndeterminateDrawable.setRingWidth(mCircleBorderWidth);
- mIndeterminateDrawable.draw(canvas);
- } else {
- canvas.drawArc(mOval, -90, 360 * mProgress, false, mPaint);
- }
- }
- if (!mCircleHidden) {
- mOval.set(paddingLeft, paddingTop, getWidth() - getPaddingRight(),
- getHeight() - getPaddingBottom());
- // {@link #Paint.setAlpha} is a helper method that just sets the alpha portion of the
- // color. {@link #Paint.setPaint} will clear any previously set alpha value.
- mPaint.setColor(mCurrentColor);
- mPaint.setAlpha(Math.round(mPaint.getAlpha() * getAlpha()));
-
- mPaint.setStyle(Style.FILL);
- float centerX = mOval.centerX();
- float centerY = mOval.centerY();
-
- canvas.drawCircle(centerX, centerY, circleRadius, mPaint);
- }
-
- if (mDrawable != null) {
- mDrawable.setAlpha(Math.round(getAlpha() * 255));
-
- if (mImageTint != null) {
- mDrawable.setTint(mImageTint);
- }
- mDrawable.draw(canvas);
- }
-
- super.onDraw(canvas);
- }
-
- private void setColorForCurrentState() {
- int newColor = mCircleColor.getColorForState(getDrawableState(),
- mCircleColor.getDefaultColor());
- if (mColorChangeAnimationDurationMs > 0) {
- if (mColorAnimator != null) {
- mColorAnimator.cancel();
- } else {
- mColorAnimator = new ValueAnimator();
- }
- mColorAnimator.setIntValues(new int[] {
- mCurrentColor, newColor });
- mColorAnimator.setEvaluator(ARGB_EVALUATOR);
- mColorAnimator.setDuration(mColorChangeAnimationDurationMs);
- mColorAnimator.addUpdateListener(this.mAnimationListener);
- mColorAnimator.start();
- } else {
- if (newColor != mCurrentColor) {
- mCurrentColor = newColor;
- invalidate();
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
- final float radius = getCircleRadius() + mCircleBorderWidth +
- mShadowWidth * mShadowVisibility;
- float desiredWidth = radius * 2;
- float desiredHeight = radius * 2;
-
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
- int width;
- int height;
-
- if (widthMode == MeasureSpec.EXACTLY) {
- width = widthSize;
- } else if (widthMode == MeasureSpec.AT_MOST) {
- width = (int) Math.min(desiredWidth, widthSize);
- } else {
- width = (int) desiredWidth;
- }
-
- if (heightMode == MeasureSpec.EXACTLY) {
- height = heightSize;
- } else if (heightMode == MeasureSpec.AT_MOST) {
- height = (int) Math.min(desiredHeight, heightSize);
- } else {
- height = (int) desiredHeight;
- }
-
- super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- if (mDrawable != null) {
- // Retrieve the sizes of the drawable and the view.
- final int nativeDrawableWidth = mDrawable.getIntrinsicWidth();
- final int nativeDrawableHeight = mDrawable.getIntrinsicHeight();
- final int viewWidth = getMeasuredWidth();
- final int viewHeight = getMeasuredHeight();
- final float imageCirclePercentage = mImageCirclePercentage > 0
- ? mImageCirclePercentage : 1;
-
- final float scaleFactor = Math.min(1f,
- Math.min(
- (float) nativeDrawableWidth != 0
- ? imageCirclePercentage * viewWidth / nativeDrawableWidth : 1,
- (float) nativeDrawableHeight != 0
- ? imageCirclePercentage
- * viewHeight / nativeDrawableHeight : 1));
-
- // Scale the drawable down to fit the view, if needed.
- final int drawableWidth = Math.round(scaleFactor * nativeDrawableWidth);
- final int drawableHeight = Math.round(scaleFactor * nativeDrawableHeight);
-
- // Center the drawable within the view.
- final int drawableLeft = (viewWidth - drawableWidth) / 2
- + Math.round(mImageHorizontalOffcenterPercentage * drawableWidth);
- final int drawableTop = (viewHeight - drawableHeight) / 2;
-
- mDrawable.setBounds(drawableLeft, drawableTop, drawableLeft + drawableWidth,
- drawableTop + drawableHeight);
- }
-
- super.onLayout(changed, left, top, right, bottom);
- }
-
- public void setImageDrawable(Drawable drawable) {
- if (drawable != mDrawable) {
- final Drawable existingDrawable = mDrawable;
- mDrawable = drawable;
-
- final boolean skipLayout = drawable != null
- && existingDrawable != null
- && existingDrawable.getIntrinsicHeight() == drawable.getIntrinsicHeight()
- && existingDrawable.getIntrinsicWidth() == drawable.getIntrinsicWidth();
-
- if (skipLayout) {
- mDrawable.setBounds(existingDrawable.getBounds());
- } else {
- requestLayout();
- }
-
- invalidate();
- }
- }
-
- public void setImageResource(int resId) {
- setImageDrawable(resId == 0 ? null : getContext().getDrawable(resId));
- }
-
- public void setImageCirclePercentage(float percentage) {
- float clamped = Math.max(0, Math.min(1, percentage));
- if (clamped != mImageCirclePercentage) {
- mImageCirclePercentage = clamped;
- invalidate();
- }
- }
-
- public void setImageHorizontalOffcenterPercentage(float percentage) {
- if (percentage != mImageHorizontalOffcenterPercentage) {
- mImageHorizontalOffcenterPercentage = percentage;
- invalidate();
- }
- }
-
- public void setImageTint(int tint) {
- if (tint != mImageTint) {
- mImageTint = tint;
- invalidate();
- }
- }
-
- public float getCircleRadius() {
- float radius = mCircleRadius;
- if (mCircleRadius <= 0 && mCircleRadiusPercent > 0) {
- radius = Math.max(getMeasuredHeight(), getMeasuredWidth()) * mCircleRadiusPercent;
- }
-
- return radius - mRadiusInset;
- }
-
- public float getCircleRadiusPercent() {
- return mCircleRadiusPercent;
- }
-
- public float getCircleRadiusPressed() {
- float radius = mCircleRadiusPressed;
-
- if (mCircleRadiusPressed <= 0 && mCircleRadiusPressedPercent > 0) {
- radius = Math.max(getMeasuredHeight(), getMeasuredWidth())
- * mCircleRadiusPressedPercent;
- }
-
- return radius - mRadiusInset;
- }
-
- public float getCircleRadiusPressedPercent() {
- return mCircleRadiusPressedPercent;
- }
-
- public void setCircleRadius(float circleRadius) {
- if (circleRadius != mCircleRadius) {
- mCircleRadius = circleRadius;
- invalidate();
- }
- }
-
- /**
- * Sets the radius of the circle to be a percentage of the largest dimension of the view.
- * @param circleRadiusPercent A {@code float} from 0 to 1 representing the radius percentage.
- */
- public void setCircleRadiusPercent(float circleRadiusPercent) {
- if (circleRadiusPercent != mCircleRadiusPercent) {
- mCircleRadiusPercent = circleRadiusPercent;
- invalidate();
- }
- }
-
- public void setCircleRadiusPressed(float circleRadiusPressed) {
- if (circleRadiusPressed != mCircleRadiusPressed) {
- mCircleRadiusPressed = circleRadiusPressed;
- invalidate();
- }
- }
-
- /**
- * Sets the radius of the circle to be a percentage of the largest dimension of the view when
- * pressed.
- * @param circleRadiusPressedPercent A {@code float} from 0 to 1 representing the radius
- * percentage.
- */
- public void setCircleRadiusPressedPercent(float circleRadiusPressedPercent) {
- if (circleRadiusPressedPercent != mCircleRadiusPressedPercent) {
- mCircleRadiusPressedPercent = circleRadiusPressedPercent;
- invalidate();
- }
- }
-
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
- setColorForCurrentState();
- }
-
- public void setCircleColor(int circleColor) {
- setCircleColorStateList(ColorStateList.valueOf(circleColor));
- }
-
- public void setCircleColorStateList(ColorStateList circleColor) {
- if (!Objects.equals(circleColor, mCircleColor)) {
- mCircleColor = circleColor;
- setColorForCurrentState();
- invalidate();
- }
- }
-
- public ColorStateList getCircleColorStateList() {
- return mCircleColor;
- }
-
- public int getDefaultCircleColor() {
- return mCircleColor.getDefaultColor();
- }
-
- /**
- * Show the circle border as an indeterminate progress spinner.
- * The views circle border width and color must be set for this to have an effect.
- *
- * @param show true if the progress spinner is shown, false to hide it.
- */
- public void showIndeterminateProgress(boolean show) {
- mProgressIndeterminate = show;
- if (show) {
- mIndeterminateDrawable.startAnimation();
- } else {
- mIndeterminateDrawable.stopAnimation();
- }
- }
-
- @Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- if (visibility != View.VISIBLE) {
- showIndeterminateProgress(false);
- } else if (mProgressIndeterminate) {
- showIndeterminateProgress(true);
- }
- }
-
- public void setProgress(float progress) {
- if (progress != mProgress) {
- mProgress = progress;
- invalidate();
- }
- }
-
- /**
- * Set how much of the shadow should be shown.
- * @param shadowVisibility Value between 0 and 1.
- */
- public void setShadowVisibility(float shadowVisibility) {
- if (shadowVisibility != mShadowVisibility) {
- mShadowVisibility = shadowVisibility;
- invalidate();
- }
- }
-
- public float getInitialCircleRadius() {
- return mInitialCircleRadius;
- }
-
- public void setCircleBorderColor(int circleBorderColor) {
- mCircleBorderColor = circleBorderColor;
- }
-
- /**
- * Set the border around the circle.
- * @param circleBorderWidth Width of the border around the circle.
- */
- public void setCircleBorderWidth(float circleBorderWidth) {
- if (circleBorderWidth != mCircleBorderWidth) {
- mCircleBorderWidth = circleBorderWidth;
- invalidate();
- }
- }
-
- @Override
- public void setPressed(boolean pressed) {
- super.setPressed(pressed);
- if (pressed != mPressed) {
- mPressed = pressed;
- invalidate();
- }
- }
-
- public Drawable getImageDrawable() {
- return mDrawable;
- }
-
- /**
- * @return the milliseconds duration of the transition animation when the color changes.
- */
- public long getColorChangeAnimationDuration() {
- return mColorChangeAnimationDurationMs;
- }
-
- /**
- * @param mColorChangeAnimationDurationMs the milliseconds duration of the color change
- * animation. The color change animation will run if the color changes with {@link #setCircleColor}
- * or as a result of the active state changing.
- */
- public void setColorChangeAnimationDuration(long mColorChangeAnimationDurationMs) {
- this.mColorChangeAnimationDurationMs = mColorChangeAnimationDurationMs;
- }
-}
diff --git a/PermissionController/src/android/support/wearable/view/Gusterpolator.java b/PermissionController/src/android/support/wearable/view/Gusterpolator.java
deleted file mode 100644
index 6b17100fe..000000000
--- a/PermissionController/src/android/support/wearable/view/Gusterpolator.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package androidx.wear.ble.view;
-
-import android.animation.TimeInterpolator;
-import android.annotation.TargetApi;
-import android.os.Build;
-
-/**
- * Interpolator that uses a Bezier derived S shaped curve.
- * @hide
- */
-@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
-class Gusterpolator implements TimeInterpolator {
-
- /** An instance of {@link androidx.wear.ble.view.Gusterpolator}. */
- public static final Gusterpolator INSTANCE = new Gusterpolator();
-
- /**
- * To avoid users of this class creating multiple copies needlessly, the constructor is
- * private.
- */
- private Gusterpolator() {}
-
- /**
- * Lookup table values.
- * Generated using a Bezier curve from (0,0) to (1,1) with control points:
- * P0 (0,0)
- * P1 (0.4, 0)
- * P2 (0.2, 1.0)
- * P3 (1.0, 1.0)
- *
- * Values sampled with x at regular intervals between 0 and 1.
- */
- private static final float[] VALUES = new float[] {
- 0.0f, 0.0002f, 0.0009f, 0.0019f, 0.0036f, 0.0059f, 0.0086f, 0.0119f, 0.0157f, 0.0209f,
- 0.0257f, 0.0321f, 0.0392f, 0.0469f, 0.0566f, 0.0656f, 0.0768f, 0.0887f, 0.1033f, 0.1186f,
- 0.1349f, 0.1519f, 0.1696f, 0.1928f, 0.2121f, 0.237f, 0.2627f, 0.2892f, 0.3109f, 0.3386f,
- 0.3667f, 0.3952f, 0.4241f, 0.4474f, 0.4766f, 0.5f, 0.5234f, 0.5468f, 0.5701f, 0.5933f,
- 0.6134f, 0.6333f, 0.6531f, 0.6698f, 0.6891f, 0.7054f, 0.7214f, 0.7346f, 0.7502f, 0.763f,
- 0.7756f, 0.7879f, 0.8f, 0.8107f, 0.8212f, 0.8326f, 0.8415f, 0.8503f, 0.8588f, 0.8672f,
- 0.8754f, 0.8833f, 0.8911f, 0.8977f, 0.9041f, 0.9113f, 0.9165f, 0.9232f, 0.9281f, 0.9328f,
- 0.9382f, 0.9434f, 0.9476f, 0.9518f, 0.9557f, 0.9596f, 0.9632f, 0.9662f, 0.9695f, 0.9722f,
- 0.9753f, 0.9777f, 0.9805f, 0.9826f, 0.9847f, 0.9866f, 0.9884f, 0.9901f, 0.9917f, 0.9931f,
- 0.9944f, 0.9955f, 0.9964f, 0.9973f, 0.9981f, 0.9986f, 0.9992f, 0.9995f, 0.9998f, 1.0f, 1.0f
- };
-
- private static final float STEP_SIZE = 1.0f / (VALUES.length - 1);
-
- @Override
- public float getInterpolation(float input) {
- if (input >= 1.0f) {
- return 1.0f;
- }
-
- if (input <= 0f) {
- return 0f;
- }
-
- int position = Math.min(
- (int)(input * (VALUES.length - 1)),
- VALUES.length - 2);
-
- float quantized = position * STEP_SIZE;
- float difference = input - quantized;
- float weight = difference / STEP_SIZE;
-
- return VALUES[position] + weight * (VALUES[position + 1] - VALUES[position]);
- }
-}
diff --git a/PermissionController/src/android/support/wearable/view/ProgressDrawable.java b/PermissionController/src/android/support/wearable/view/ProgressDrawable.java
deleted file mode 100644
index 51ec8f07f..000000000
--- a/PermissionController/src/android/support/wearable/view/ProgressDrawable.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package androidx.wear.ble.view;
-
-import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
-import android.animation.ValueAnimator;
-import android.annotation.TargetApi;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.util.Property;
-import android.view.animation.LinearInterpolator;
-
-/**
- * Drawable for showing an indeterminate progress indicator.
- *
- * TODO: When Material progress drawable is available in the support library stop using this.
- *
- * @hide
- */
-@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
-class ProgressDrawable extends Drawable {
-
- private static Property<ProgressDrawable, Integer> LEVEL =
- new Property<ProgressDrawable, Integer>(Integer.class, "level") {
- @Override
- public Integer get(ProgressDrawable drawable) {
- return drawable.getLevel();
- }
-
- @Override
- public void set(ProgressDrawable drawable, Integer value) {
- drawable.setLevel(value);
- drawable.invalidateSelf();
- }
- };
- /** Max level for a level drawable, as specified in developer docs for {@link Drawable}. */
- private static final int MAX_LEVEL = 10000;
-
- /** How many different sections are there, five gives us the material style star. **/
- private static final int NUMBER_OF_SEGMENTS = 5;
-
- private static final int LEVELS_PER_SEGMENT = MAX_LEVEL / NUMBER_OF_SEGMENTS;
- private static final float STARTING_ANGLE = -90f;
- private static final long ANIMATION_DURATION = 6000;
- private static final int FULL_CIRCLE = 360;
- private static final int MAX_SWEEP = 306;
- private static final int CORRECTION_ANGLE = FULL_CIRCLE - MAX_SWEEP;
- /** How far through each cycle does the bar stop growing and start shrinking, half way. **/
- private static final float GROW_SHRINK_RATIO = 0.5f;
- // TODO: replace this with BakedBezierInterpolator when its available in support library.
- private static final TimeInterpolator mInterpolator = Gusterpolator.INSTANCE;
-
- private final RectF mInnerCircleBounds = new RectF();
- private final Paint mPaint = new Paint();
- private final ObjectAnimator mAnimator;
- private float mCircleBorderWidth;
- private int mCircleBorderColor;
-
- public ProgressDrawable() {
- mPaint.setAntiAlias(true);
- mPaint.setStyle(Paint.Style.STROKE);
- mAnimator = ObjectAnimator.ofInt(this, LEVEL, 0, MAX_LEVEL);
- mAnimator.setRepeatCount(ValueAnimator.INFINITE);
- mAnimator.setRepeatMode(ValueAnimator.RESTART);
- mAnimator.setDuration(ANIMATION_DURATION);
- mAnimator.setInterpolator(new LinearInterpolator());
- }
-
- public void setRingColor(int color) {
- mCircleBorderColor = color;
- }
-
- public void setRingWidth(float width) {
- mCircleBorderWidth = width;
- }
-
- public void startAnimation() {
- mAnimator.start();
- }
-
- public void stopAnimation() {
- mAnimator.cancel();
- }
-
- @Override
- public void draw(Canvas canvas) {
- canvas.save();
- mInnerCircleBounds.set(getBounds());
- mInnerCircleBounds.inset(mCircleBorderWidth / 2.0f, mCircleBorderWidth / 2.0f);
- mPaint.setStrokeWidth(mCircleBorderWidth);
- mPaint.setColor(mCircleBorderColor);
-
- float sweepAngle = FULL_CIRCLE;
- boolean growing = false;
- float correctionAngle = 0;
- int level = getLevel();
-
- int currentSegment = level / LEVELS_PER_SEGMENT;
- int offset = currentSegment * LEVELS_PER_SEGMENT;
- float progress = (level - offset) / (float) LEVELS_PER_SEGMENT;
-
- growing = progress < GROW_SHRINK_RATIO;
- correctionAngle = CORRECTION_ANGLE * progress;
-
- if (growing) {
- sweepAngle = MAX_SWEEP * mInterpolator.getInterpolation(
- lerpInv(0f, GROW_SHRINK_RATIO, progress));
- } else {
- sweepAngle = MAX_SWEEP * (1.0f - mInterpolator.getInterpolation(
- lerpInv(GROW_SHRINK_RATIO, 1.0f, progress)));
- }
-
- sweepAngle = Math.max(1, sweepAngle);
-
- canvas.rotate(
- level * (1.0f / MAX_LEVEL) * 2 * FULL_CIRCLE + STARTING_ANGLE + correctionAngle,
- mInnerCircleBounds.centerX(),
- mInnerCircleBounds.centerY());
- canvas.drawArc(mInnerCircleBounds,
- growing ? 0 : MAX_SWEEP - sweepAngle,
- sweepAngle,
- false,
- mPaint);
- canvas.restore();
- }
-
- @Override
- public void setAlpha(int i) {
- // Not supported.
- }
-
- @Override
- public void setColorFilter(ColorFilter colorFilter) {
- // Not supported.
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.OPAQUE;
- }
-
- @Override
- protected boolean onLevelChange(int level) {
- return true; // Changing the level of this drawable does change its appearance.
- }
-
- /**
- * Returns the interpolation scalar (s) that satisfies the equation:
- * {@code value = }lerp(a, b, s)
- *
- * <p>If {@code a == b}, then this function will return 0.
- */
- private static float lerpInv(float a, float b, float value) {
- return a != b ? ((value - a) / (b - a)) : 0.0f;
- }
-}
diff --git a/PermissionController/src/android/support/wearable/view/SimpleAnimatorListener.java b/PermissionController/src/android/support/wearable/view/SimpleAnimatorListener.java
deleted file mode 100644
index c8fe58c43..000000000
--- a/PermissionController/src/android/support/wearable/view/SimpleAnimatorListener.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package androidx.wear.ble.view;
-
-import android.animation.Animator;
-import android.annotation.TargetApi;
-import android.os.Build;
-
-/**
- * Convenience class for listening for Animator events that implements the AnimatorListener
- * interface and allows extending only methods that are necessary.
- */
-@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
-public class SimpleAnimatorListener implements Animator.AnimatorListener {
-
- private boolean mWasCanceled;
-
- @Override
- public void onAnimationCancel(Animator animator) {
- mWasCanceled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
- if (!mWasCanceled) {
- onAnimationComplete(animator);
- }
- }
-
- @Override
- public void onAnimationRepeat(Animator animator) {
- }
-
- @Override
- public void onAnimationStart(Animator animator) {
- mWasCanceled = false;
- }
-
- /**
- * Called when the animation finishes. Not called if the animation was canceled.
- */
- public void onAnimationComplete(Animator animator) {
- }
-
- /**
- * Provides information if the animation was cancelled.
- * @return True if animation was cancelled.
- */
- public boolean wasCanceled() {
- return mWasCanceled;
- }
-
-}
diff --git a/PermissionController/src/android/support/wearable/view/WearableListView.java b/PermissionController/src/android/support/wearable/view/WearableListView.java
deleted file mode 100644
index 487ebfb13..000000000
--- a/PermissionController/src/android/support/wearable/view/WearableListView.java
+++ /dev/null
@@ -1,1388 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package androidx.wear.ble.view;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.graphics.PointF;
-import android.os.Build;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.Property;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.widget.Scroller;
-
-import androidx.recyclerview.widget.LinearSmoothScroller;
-import androidx.recyclerview.widget.RecyclerView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An alternative version of ListView that is optimized for ease of use on small screen wearable
- * devices. It displays a vertically scrollable list of items, and automatically snaps to the
- * nearest item when the user stops scrolling.
- *
- * <p>
- * For a quick start, you will need to implement a subclass of {@link .Adapter},
- * which will create and bind your views to the {@link .ViewHolder} objects. If you want to add
- * more visual treatment to your views when they become the central items of the
- * WearableListView, have them implement the {@link .OnCenterProximityListener} interface.
- * </p>
- */
-@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
-public class WearableListView extends RecyclerView {
- @SuppressWarnings("unused")
- private static final String TAG = "WearableListView";
-
- private static final long FLIP_ANIMATION_DURATION_MS = 150;
- private static final long CENTERING_ANIMATION_DURATION_MS = 150;
-
- private static final float TOP_TAP_REGION_PERCENTAGE = .33f;
- private static final float BOTTOM_TAP_REGION_PERCENTAGE = .33f;
-
- // Each item will occupy one third of the height.
- private static final int THIRD = 3;
-
- private final int mMinFlingVelocity;
- private final int mMaxFlingVelocity;
-
- private boolean mMaximizeSingleItem;
- private boolean mCanClick = true;
- // WristGesture navigation signals are delivered as KeyEvents. Allow developer to disable them
- // for this specific View. It might be cleaner to simply have users re-implement onKeyDown().
- // TOOD: Finalize the disabling mechanism here.
- private boolean mGestureNavigationEnabled = true;
- private int mTapPositionX;
- private int mTapPositionY;
- private ClickListener mClickListener;
-
- private Animator mScrollAnimator;
- // This is a little hacky due to the fact that animator provides incremental values instead of
- // deltas and scrolling code requires deltas. We animate WearableListView directly and use this
- // field to calculate deltas. Obviously this means that only one scrolling algorithm can run at
- // a time, but I don't think it would be wise to have more than one running.
- private int mLastScrollChange;
-
- private SetScrollVerticallyProperty mSetScrollVerticallyProperty =
- new SetScrollVerticallyProperty();
-
- private final List<OnScrollListener> mOnScrollListeners = new ArrayList<OnScrollListener>();
-
- private final List<OnCentralPositionChangedListener> mOnCentralPositionChangedListeners =
- new ArrayList<OnCentralPositionChangedListener>();
-
- private OnOverScrollListener mOverScrollListener;
-
- private boolean mGreedyTouchMode;
-
- private float mStartX;
-
- private float mStartY;
-
- private float mStartFirstTop;
-
- private final int mTouchSlop;
-
- private boolean mPossibleVerticalSwipe;
-
- private int mInitialOffset = 0;
-
- private Scroller mScroller;
-
- // Top and bottom boundaries for tap checking. Need to recompute by calling computeTapRegions
- // before referencing.
- private final float[] mTapRegions = new float[2];
-
- private boolean mGestureDirectionLocked;
- private int mPreviousCentral = 0;
-
- // Temp variable for storing locations on screen.
- private final int[] mLocation = new int[2];
-
- // TODO: Consider clearing this when underlying data set changes. If the data set changes, you
- // can't safely assume that this pressed view is in the same place as it was before and it will
- // receive setPressed(false) unnecessarily. In theory it should be fine, but in practice we
- // have places like this: mIconView.setCircleColor(pressed ? mPressedColor : mSelectedColor);
- // This might set selected color on non selected item. Our logic should be: if you change
- // underlying data set, all best are off and you need to preserve the state; we will clear
- // this field. However, I am not willing to introduce this so late in C development.
- private View mPressedView = null;
-
- private final Runnable mPressedRunnable = new Runnable() {
- @Override
- public void run() {
- if (getChildCount() > 0) {
- mPressedView = getChildAt(findCenterViewIndex());
- mPressedView.setPressed(true);
- } else {
- Log.w(TAG, "mPressedRunnable: the children were removed, skipping.");
- }
- }
- };
-
- private final Runnable mReleasedRunnable = new Runnable() {
- @Override
- public void run() {
- releasePressedItem();
- }
- };
-
- private Runnable mNotifyChildrenPostLayoutRunnable = new Runnable() {
- @Override
- public void run() {
- notifyChildrenAboutProximity(false);
- }
- };
-
- private final AdapterDataObserver mObserver = new AdapterDataObserver() {
- @Override
- public void onChanged() {
- WearableListView.this.addOnLayoutChangeListener(new OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- WearableListView.this.removeOnLayoutChangeListener(this);
- if (WearableListView.this.getChildCount() > 0) {
- WearableListView.this.animateToCenter();
- }
- }
- });
- }
- };
-
- public WearableListView(Context context) {
- this(context, null);
- }
-
- public WearableListView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public WearableListView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- setHasFixedSize(true);
- setOverScrollMode(View.OVER_SCROLL_NEVER);
- setLayoutManager(new LayoutManager());
-
- final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- if (newState == RecyclerView.SCROLL_STATE_IDLE && getChildCount() > 0) {
- handleTouchUp(null, newState);
- }
- for (OnScrollListener listener : mOnScrollListeners) {
- listener.onScrollStateChanged(newState);
- }
- }
-
- @Override
- public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
- onScroll(dy);
- }
- };
- setOnScrollListener(onScrollListener);
-
- final ViewConfiguration vc = ViewConfiguration.get(context);
- mTouchSlop = vc.getScaledTouchSlop();
-
- mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
- mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
- }
-
- @Override
- public void setAdapter(RecyclerView.Adapter adapter) {
- RecyclerView.Adapter currentAdapter = getAdapter();
- if (currentAdapter != null) {
- currentAdapter.unregisterAdapterDataObserver(mObserver);
- }
-
- super.setAdapter(adapter);
-
- if (adapter != null) {
- adapter.registerAdapterDataObserver(mObserver);
- }
- }
-
- /**
- * @return the position of the center child's baseline; -1 if no center child exists or if
- * the center child does not return a valid baseline.
- */
- @Override
- public int getBaseline() {
- // No children implies there is no center child for which a baseline can be computed.
- if (getChildCount() == 0) {
- return super.getBaseline();
- }
-
- // Compute the baseline of the center child.
- final int centerChildIndex = findCenterViewIndex();
- final int centerChildBaseline = getChildAt(centerChildIndex).getBaseline();
-
- // If the center child has no baseline, neither does this list view.
- if (centerChildBaseline == -1) {
- return super.getBaseline();
- }
-
- return getCentralViewTop() + centerChildBaseline;
- }
-
- /**
- * @return true if the list is scrolled all the way to the top.
- */
- public boolean isAtTop() {
- if (getChildCount() == 0) {
- return true;
- }
-
- int centerChildIndex = findCenterViewIndex();
- View centerView = getChildAt(centerChildIndex);
- return getChildAdapterPosition(centerView) == 0 &&
- getScrollState() == RecyclerView.SCROLL_STATE_IDLE;
- }
-
- /**
- * Clears the state of the layout manager that positions list items.
- */
- public void resetLayoutManager() {
- setLayoutManager(new LayoutManager());
- }
-
- /**
- * Controls whether WearableListView should intercept all touch events and also prevent the
- * parent from receiving them.
- * @param greedy If true it will intercept all touch events.
- */
- public void setGreedyTouchMode(boolean greedy) {
- mGreedyTouchMode = greedy;
- }
-
- /**
- * By default the first element of the list is initially positioned in the center of the screen.
- * This method allows the developer to specify a different offset, e.g. to hide the
- * WearableListView before the user is allowed to use it.
- *
- * @param top How far the elements should be pushed down.
- */
- public void setInitialOffset(int top) {
- mInitialOffset = top;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- if (!isEnabled()) {
- return false;
- }
-
- if (mGreedyTouchMode && getChildCount() > 0) {
- int action = event.getActionMasked();
- if (action == MotionEvent.ACTION_DOWN) {
- mStartX = event.getX();
- mStartY = event.getY();
- mStartFirstTop = getChildCount() > 0 ? getChildAt(0).getTop() : 0;
- mPossibleVerticalSwipe = true;
- mGestureDirectionLocked = false;
- } else if (action == MotionEvent.ACTION_MOVE && mPossibleVerticalSwipe) {
- handlePossibleVerticalSwipe(event);
- }
- getParent().requestDisallowInterceptTouchEvent(mPossibleVerticalSwipe);
- }
- return super.onInterceptTouchEvent(event);
- }
-
- private boolean handlePossibleVerticalSwipe(MotionEvent event) {
- if (mGestureDirectionLocked) {
- return mPossibleVerticalSwipe;
- }
- float deltaX = Math.abs(mStartX - event.getX());
- float deltaY = Math.abs(mStartY - event.getY());
- float distance = (deltaX * deltaX) + (deltaY * deltaY);
- // Verify that the distance moved in the combined x/y direction is at
- // least touch slop before determining the gesture direction.
- if (distance > (mTouchSlop * mTouchSlop)) {
- if (deltaX > deltaY) {
- mPossibleVerticalSwipe = false;
- }
- mGestureDirectionLocked = true;
- }
- return mPossibleVerticalSwipe;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (!isEnabled()) {
- return false;
- }
-
- // super.onTouchEvent can change the state of the scroll, keep a copy so that handleTouchUp
- // can exit early if scrollState != IDLE when the touch event started.
- int scrollState = getScrollState();
- boolean result = super.onTouchEvent(event);
- if (getChildCount() > 0) {
- int action = event.getActionMasked();
- if (action == MotionEvent.ACTION_DOWN) {
- handleTouchDown(event);
- } else if (action == MotionEvent.ACTION_UP) {
- handleTouchUp(event, scrollState);
- getParent().requestDisallowInterceptTouchEvent(false);
- } else if (action == MotionEvent.ACTION_MOVE) {
- if (Math.abs(mTapPositionX - (int) event.getX()) >= mTouchSlop ||
- Math.abs(mTapPositionY - (int) event.getY()) >= mTouchSlop) {
- releasePressedItem();
- mCanClick = false;
- }
- result |= handlePossibleVerticalSwipe(event);
- getParent().requestDisallowInterceptTouchEvent(mPossibleVerticalSwipe);
- } else if (action == MotionEvent.ACTION_CANCEL) {
- getParent().requestDisallowInterceptTouchEvent(false);
- mCanClick = true;
- }
- }
- return result;
- }
-
- private void releasePressedItem() {
- if (mPressedView != null) {
- mPressedView.setPressed(false);
- mPressedView = null;
- }
- Handler handler = getHandler();
- if (handler != null) {
- handler.removeCallbacks(mPressedRunnable);
- }
- }
-
- private void onScroll(int dy) {
- for (OnScrollListener listener : mOnScrollListeners) {
- listener.onScroll(dy);
- }
- notifyChildrenAboutProximity(true);
- }
-
- /**
- * Adds a listener that will be called when the content of the list view is scrolled.
- */
- public void addOnScrollListener(OnScrollListener listener) {
- mOnScrollListeners.add(listener);
- }
-
- /**
- * Removes listener for scroll events.
- */
- public void removeOnScrollListener(OnScrollListener listener) {
- mOnScrollListeners.remove(listener);
- }
-
- /**
- * Adds a listener that will be called when the central item of the list changes.
- */
- public void addOnCentralPositionChangedListener(OnCentralPositionChangedListener listener) {
- mOnCentralPositionChangedListeners.add(listener);
- }
-
- /**
- * Removes a listener that would be called when the central item of the list changes.
- */
- public void removeOnCentralPositionChangedListener(OnCentralPositionChangedListener listener) {
- mOnCentralPositionChangedListeners.remove(listener);
- }
-
- /**
- * Determines if navigation of list with wrist gestures is enabled.
- */
- public boolean isGestureNavigationEnabled() {
- return mGestureNavigationEnabled;
- }
-
- /**
- * Sets whether navigation of list with wrist gestures is enabled.
- */
- public void setEnableGestureNavigation(boolean enabled) {
- mGestureNavigationEnabled = enabled;
- }
-
- @Override /* KeyEvent.Callback */
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // Respond to keycodes (at least originally generated and injected by wrist gestures).
- if (mGestureNavigationEnabled) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
- fling(0, -mMinFlingVelocity);
- return true;
- case KeyEvent.KEYCODE_NAVIGATE_NEXT:
- fling(0, mMinFlingVelocity);
- return true;
- case KeyEvent.KEYCODE_NAVIGATE_IN:
- return tapCenterView();
- case KeyEvent.KEYCODE_NAVIGATE_OUT:
- // Returing false leaves the action to the container of this WearableListView
- // (e.g. finishing the activity containing this WearableListView).
- return false;
- }
- }
- return super.onKeyDown(keyCode, event);
- }
-
- /**
- * Simulate tapping the child view at the center of this list.
- */
- private boolean tapCenterView() {
- if (!isEnabled() || getVisibility() != View.VISIBLE) {
- return false;
- }
- int index = findCenterViewIndex();
- View view = getChildAt(index);
- ViewHolder holder = getChildViewHolder(view);
- if (mClickListener != null) {
- mClickListener.onClick(holder);
- return true;
- }
- return false;
- }
-
- private boolean checkForTap(MotionEvent event) {
- // No taps are accepted if this view is disabled.
- if (!isEnabled()) {
- return false;
- }
-
- float rawY = event.getRawY();
- int index = findCenterViewIndex();
- View view = getChildAt(index);
- ViewHolder holder = getChildViewHolder(view);
- computeTapRegions(mTapRegions);
- if (rawY > mTapRegions[0] && rawY < mTapRegions[1]) {
- if (mClickListener != null) {
- mClickListener.onClick(holder);
- }
- return true;
- }
- if (index > 0 && rawY <= mTapRegions[0]) {
- animateToMiddle(index - 1, index);
- return true;
- }
- if (index < getChildCount() - 1 && rawY >= mTapRegions[1]) {
- animateToMiddle(index + 1, index);
- return true;
- }
- if (index == 0 && rawY <= mTapRegions[0] && mClickListener != null) {
- // Special case: if the top third of the screen is empty and the touch event happens
- // there, we don't want to immediately disallow the parent from using it. We tell
- // parent to disallow intercept only after we locked a gesture. Before that he
- // might do something with the action.
- mClickListener.onTopEmptyRegionClick();
- return true;
- }
- return false;
- }
-
- private void animateToMiddle(int newCenterIndex, int oldCenterIndex) {
- if (newCenterIndex == oldCenterIndex) {
- throw new IllegalArgumentException(
- "newCenterIndex must be different from oldCenterIndex");
- }
- List<Animator> animators = new ArrayList<Animator>();
- View child = getChildAt(newCenterIndex);
- int scrollToMiddle = getCentralViewTop() - child.getTop();
- startScrollAnimation(animators, scrollToMiddle, FLIP_ANIMATION_DURATION_MS);
- }
-
- private void startScrollAnimation(List<Animator> animators, int scroll, long duration) {
- startScrollAnimation(animators, scroll, duration, 0);
- }
-
- private void startScrollAnimation(List<Animator> animators, int scroll, long duration,
- long delay) {
- startScrollAnimation(animators, scroll, duration, delay, null);
- }
-
- private void startScrollAnimation(
- int scroll, long duration, long delay, Animator.AnimatorListener listener) {
- startScrollAnimation(null, scroll, duration, delay, listener);
- }
-
- private void startScrollAnimation(List<Animator> animators, int scroll, long duration,
- long delay, Animator.AnimatorListener listener) {
- if (mScrollAnimator != null) {
- mScrollAnimator.cancel();
- }
-
- mLastScrollChange = 0;
- ObjectAnimator scrollAnimator = ObjectAnimator.ofInt(this, mSetScrollVerticallyProperty,
- 0, -scroll);
-
- if (animators != null) {
- animators.add(scrollAnimator);
- AnimatorSet animatorSet = new AnimatorSet();
- animatorSet.playTogether(animators);
- mScrollAnimator = animatorSet;
- } else {
- mScrollAnimator = scrollAnimator;
- }
- mScrollAnimator.setDuration(duration);
- if (listener != null) {
- mScrollAnimator.addListener(listener);
- }
- if (delay > 0) {
- mScrollAnimator.setStartDelay(delay);
- }
- mScrollAnimator.start();
- }
-
- @Override
- public boolean fling(int velocityX, int velocityY) {
- if (getChildCount() == 0) {
- return false;
- }
- // If we are flinging towards empty space (before first element or after last), we reuse
- // original flinging mechanism.
- final int index = findCenterViewIndex();
- final View child = getChildAt(index);
- int currentPosition = getChildPosition(child);
- if ((currentPosition == 0 && velocityY < 0) ||
- (currentPosition == getAdapter().getItemCount() - 1 && velocityY > 0)) {
- return super.fling(velocityX, velocityY);
- }
-
- if (Math.abs(velocityY) < mMinFlingVelocity) {
- return false;
- }
- velocityY = Math.max(Math.min(velocityY, mMaxFlingVelocity), -mMaxFlingVelocity);
-
- if (mScroller == null) {
- mScroller = new Scroller(getContext(), null, true);
- }
- mScroller.fling(0, 0, 0, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE,
- Integer.MIN_VALUE, Integer.MAX_VALUE);
- int finalY = mScroller.getFinalY();
- int delta = finalY / (getPaddingTop() + getAdjustedHeight() / 2);
- if (delta == 0) {
- // If the fling would not be enough to change position, we increase it to satisfy user's
- // intent of switching current position.
- delta = velocityY > 0 ? 1 : -1;
- }
- int finalPosition = Math.max(
- 0, Math.min(getAdapter().getItemCount() - 1, currentPosition + delta));
- smoothScrollToPosition(finalPosition);
- return true;
- }
-
- public void smoothScrollToPosition(int position, RecyclerView.SmoothScroller smoothScroller) {
- LayoutManager layoutManager = (LayoutManager) getLayoutManager();
- layoutManager.setCustomSmoothScroller(smoothScroller);
- smoothScrollToPosition(position);
- layoutManager.clearCustomSmoothScroller();
- }
-
- @Override
- public ViewHolder getChildViewHolder(View child) {
- return (ViewHolder) super.getChildViewHolder(child);
- }
-
- /**
- * Adds a listener that will be called when the user taps on the WearableListView or its items.
- */
- public void setClickListener(ClickListener clickListener) {
- mClickListener = clickListener;
- }
-
- /**
- * Adds a listener that will be called when the user drags the top element below its allowed
- * bottom position.
- *
- * @hide
- */
- public void setOverScrollListener(OnOverScrollListener listener) {
- mOverScrollListener = listener;
- }
-
- private int findCenterViewIndex() {
- // TODO(gruszczy): This could be easily optimized, so that we stop looking when we the
- // distance starts growing again, instead of finding the closest. It would safe half of
- // the loop.
- int count = getChildCount();
- int index = -1;
- int closest = Integer.MAX_VALUE;
- int centerY = getCenterYPos(this);
- for (int i = 0; i < count; ++i) {
- final View child = getChildAt(i);
- int childCenterY = getTop() + getCenterYPos(child);
- final int distance = Math.abs(centerY - childCenterY);
- if (distance < closest) {
- closest = distance;
- index = i;
- }
- }
- if (index == -1) {
- throw new IllegalStateException("Can't find central view.");
- }
- return index;
- }
-
- private static int getCenterYPos(View v) {
- return v.getTop() + v.getPaddingTop() + getAdjustedHeight(v) / 2;
- }
-
- private void handleTouchUp(MotionEvent event, int scrollState) {
- if (mCanClick && event != null && checkForTap(event)) {
- Handler handler = getHandler();
- if (handler != null) {
- handler.postDelayed(mReleasedRunnable, ViewConfiguration.getTapTimeout());
- }
- return;
- }
-
- if (scrollState != RecyclerView.SCROLL_STATE_IDLE) {
- // We are flinging, so let's not start animations just yet. Instead we will start them
- // when the fling finishes.
- return;
- }
-
- if (isOverScrolling()) {
- mOverScrollListener.onOverScroll();
- } else {
- animateToCenter();
- }
- }
-
- private boolean isOverScrolling() {
- return getChildCount() > 0
- // If first view top was below the central top, it means it was never centered.
- // Don't allow overscroll, otherwise a simple touch (instead of a drag) will be
- // enough to trigger overscroll.
- && mStartFirstTop <= getCentralViewTop()
- && getChildAt(0).getTop() >= getTopViewMaxTop()
- && mOverScrollListener != null;
- }
-
- private int getTopViewMaxTop() {
- return getHeight() / 2;
- }
-
- private int getItemHeight() {
- // Round up so that the screen is fully occupied by 3 items.
- return getAdjustedHeight() / THIRD + 1;
- }
-
- /**
- * Returns top of the central {@code View} in the list when such view is fully centered.
- *
- * This is a more or a less a static value that you can use to align other views with the
- * central one.
- */
- public int getCentralViewTop() {
- return getPaddingTop() + getItemHeight();
- }
-
- /**
- * Automatically starts an animation that snaps the list to center on the element closest to the
- * middle.
- */
- public void animateToCenter() {
- final int index = findCenterViewIndex();
- final View child = getChildAt(index);
- final int scrollToMiddle = getCentralViewTop() - child.getTop();
- startScrollAnimation(scrollToMiddle, CENTERING_ANIMATION_DURATION_MS, 0,
- new SimpleAnimatorListener() {
- @Override
- public void onAnimationEnd(Animator animator) {
- if (!wasCanceled()) {
- mCanClick = true;
- }
- }
- });
- }
-
- /**
- * Animate the list so that the first view is back to its initial position.
- * @param endAction Action to execute when the animation is done.
- * @hide
- */
- public void animateToInitialPosition(final Runnable endAction) {
- final View child = getChildAt(0);
- final int scrollToMiddle = getCentralViewTop() + mInitialOffset - child.getTop();
- startScrollAnimation(scrollToMiddle, CENTERING_ANIMATION_DURATION_MS, 0,
- new SimpleAnimatorListener() {
- @Override
- public void onAnimationEnd(Animator animator) {
- if (endAction != null) {
- endAction.run();
- }
- }
- });
- }
-
- private void handleTouchDown(MotionEvent event) {
- if (mCanClick) {
- mTapPositionX = (int) event.getX();
- mTapPositionY = (int) event.getY();
- float rawY = event.getRawY();
- computeTapRegions(mTapRegions);
- if (rawY > mTapRegions[0] && rawY < mTapRegions[1]) {
- View view = getChildAt(findCenterViewIndex());
- if (view instanceof OnCenterProximityListener) {
- Handler handler = getHandler();
- if (handler != null) {
- handler.removeCallbacks(mReleasedRunnable);
- handler.postDelayed(mPressedRunnable, ViewConfiguration.getTapTimeout());
- }
- }
- }
- }
- }
-
- private void setScrollVertically(int scroll) {
- scrollBy(0, scroll - mLastScrollChange);
- mLastScrollChange = scroll;
- }
-
- private int getAdjustedHeight() {
- return getAdjustedHeight(this);
- }
-
- private static int getAdjustedHeight(View v) {
- return v.getHeight() - v.getPaddingBottom() - v.getPaddingTop();
- }
-
- private void computeTapRegions(float[] tapRegions) {
- mLocation[0] = mLocation[1] = 0;
- getLocationOnScreen(mLocation);
- int mScreenTop = mLocation[1];
- int height = getHeight();
- tapRegions[0] = mScreenTop + height * TOP_TAP_REGION_PERCENTAGE;
- tapRegions[1] = mScreenTop + height * (1 - BOTTOM_TAP_REGION_PERCENTAGE);
- }
-
- /**
- * Determines if, when there is only one item in the WearableListView, that the single item
- * is laid out so that it's height fills the entire WearableListView.
- */
- public boolean getMaximizeSingleItem() {
- return mMaximizeSingleItem;
- }
-
- /**
- * When set to true, if there is only one item in the WearableListView, it will fill the entire
- * WearableListView. When set to false, the default behavior will be used and the single item
- * will fill only a third of the screen.
- */
- public void setMaximizeSingleItem(boolean maximizeSingleItem) {
- mMaximizeSingleItem = maximizeSingleItem;
- }
-
- private void notifyChildrenAboutProximity(boolean animate) {
- LayoutManager layoutManager = (LayoutManager) getLayoutManager();
- int count = layoutManager.getChildCount();
-
- if (count == 0) {
- return;
- }
-
- int index = layoutManager.findCenterViewIndex();
- for (int i = 0; i < count; ++i) {
- final View view = layoutManager.getChildAt(i);
- ViewHolder holder = getChildViewHolder(view);
- holder.onCenterProximity(i == index, animate);
- }
- final int position = getChildViewHolder(getChildAt(index)).getPosition();
- if (position != mPreviousCentral) {
- for (OnScrollListener listener : mOnScrollListeners) {
- listener.onCentralPositionChanged(position);
- }
- for (OnCentralPositionChangedListener listener :
- mOnCentralPositionChangedListeners) {
- listener.onCentralPositionChanged(position);
- }
- mPreviousCentral = position;
- }
- }
-
- // TODO: Move this to a separate class, so it can't directly interact with the WearableListView.
- private class LayoutManager extends RecyclerView.LayoutManager {
- private int mFirstPosition;
-
- private boolean mPushFirstHigher;
-
- private int mAbsoluteScroll;
-
- private boolean mUseOldViewTop = true;
-
- private boolean mWasZoomedIn = false;
-
- private RecyclerView.SmoothScroller mSmoothScroller;
-
- private RecyclerView.SmoothScroller mDefaultSmoothScroller;
-
- // We need to have another copy of the same method, because this one uses
- // LayoutManager.getChildCount/getChildAt instead of View.getChildCount/getChildAt and
- // they return different values.
- private int findCenterViewIndex() {
- // TODO(gruszczy): This could be easily optimized, so that we stop looking when we the
- // distance starts growing again, instead of finding the closest. It would safe half of
- // the loop.
- int count = getChildCount();
- int index = -1;
- int closest = Integer.MAX_VALUE;
- int centerY = getCenterYPos(WearableListView.this);
- for (int i = 0; i < count; ++i) {
- final View child = getLayoutManager().getChildAt(i);
- int childCenterY = getTop() + getCenterYPos(child);
- final int distance = Math.abs(centerY - childCenterY);
- if (distance < closest) {
- closest = distance;
- index = i;
- }
- }
- if (index == -1) {
- throw new IllegalStateException("Can't find central view.");
- }
- return index;
- }
-
- @Override
- public void onLayoutChildren(RecyclerView.Recycler recycler, State state) {
- final int parentBottom = getHeight() - getPaddingBottom();
- // By default we assume this is the first run and the first element will be centered
- // with optional initial offset.
- int oldTop = getCentralViewTop() + mInitialOffset;
- // Here we handle any other situation where we relayout or we want to achieve a
- // specific layout of children.
- if (mUseOldViewTop && getChildCount() > 0) {
- // We are performing a relayout after we already had some children, because e.g. the
- // contents of an adapter has changed. First we want to check, if the central item
- // from before the layout is still here, because we want to preserve it.
- int index = findCenterViewIndex();
- int position = getPosition(getChildAt(index));
- if (position == NO_POSITION) {
- // Central item was removed. Let's find the first surviving item and use it
- // as an anchor.
- for (int i = 0, N = getChildCount(); index + i < N || index - i >= 0; ++i) {
- View child = getChildAt(index + i);
- if (child != null) {
- position = getPosition(child);
- if (position != NO_POSITION) {
- index = index + i;
- break;
- }
- }
- child = getChildAt(index - i);
- if (child != null) {
- position = getPosition(child);
- if (position != NO_POSITION) {
- index = index - i;
- break;
- }
- }
- }
- }
- if (position == NO_POSITION) {
- // None of the children survives the relayout, let's just use the top of the
- // first one.
- oldTop = getChildAt(0).getTop();
- int count = state.getItemCount();
- // Lets first make sure that the first position is not above the last element,
- // which can happen if elements were removed.
- while (mFirstPosition >= count && mFirstPosition > 0) {
- mFirstPosition--;
- }
- } else {
- // Some of the children survived the relayout. We will keep it in its place,
- // but go through previous children and maybe add them.
- if (!mWasZoomedIn) {
- // If we were previously zoomed-in on a single item, ignore this and just
- // use the default value set above. Reasoning: if we are still zoomed-in,
- // oldTop will be ignored when laying out the single child element. If we
- // are no longer zoomed in, then we want to position items using the top
- // of the single item as if the single item was not zoomed in, which is
- // equal to the default value.
- oldTop = getChildAt(index).getTop();
- }
- while (oldTop > getPaddingTop() && position > 0) {
- position--;
- oldTop -= getItemHeight();
- }
- if (position == 0 && oldTop > getCentralViewTop()) {
- // We need to handle special case where the first, central item was removed
- // and now the first element is hanging below, instead of being nicely
- // centered.
- oldTop = getCentralViewTop();
- }
- mFirstPosition = position;
- }
- } else if (mPushFirstHigher) {
- // We are trying to position elements ourselves, so we force position of the first
- // one.
- oldTop = getCentralViewTop() - getItemHeight();
- }
-
- performLayoutChildren(recycler, state, parentBottom, oldTop);
-
- // Since the content might have changed, we need to adjust the absolute scroll in case
- // some elements have disappeared or were added.
- if (getChildCount() == 0) {
- setAbsoluteScroll(0);
- } else {
- View child = getChildAt(findCenterViewIndex());
- setAbsoluteScroll(child.getTop() - getCentralViewTop() + getPosition(child) *
- getItemHeight());
- }
-
- mUseOldViewTop = true;
- mPushFirstHigher = false;
- }
-
- private void performLayoutChildren(Recycler recycler, State state, int parentBottom,
- int top) {
- detachAndScrapAttachedViews(recycler);
-
- if (mMaximizeSingleItem && state.getItemCount() == 1) {
- performLayoutOneChild(recycler, parentBottom);
- mWasZoomedIn = true;
- } else {
- performLayoutMultipleChildren(recycler, state, parentBottom, top);
- mWasZoomedIn = false;
- }
-
- if (getChildCount() > 0) {
- post(mNotifyChildrenPostLayoutRunnable);
- }
- }
-
- private void performLayoutOneChild(Recycler recycler, int parentBottom) {
- final int right = getWidth() - getPaddingRight();
- View v = recycler.getViewForPosition(getFirstPosition());
- addView(v, 0);
- measureZoomView(v);
- v.layout(getPaddingLeft(), getPaddingTop(), right, parentBottom);
- }
-
- private void performLayoutMultipleChildren(Recycler recycler, State state, int parentBottom,
- int top) {
- int bottom;
- final int left = getPaddingLeft();
- final int right = getWidth() - getPaddingRight();
- final int count = state.getItemCount();
- // If we are laying out children with center element being different than the first, we
- // need to start with previous child which appears half visible at the top.
- for (int i = 0; getFirstPosition() + i < count; i++, top = bottom) {
- if (top >= parentBottom) {
- break;
- }
- View v = recycler.getViewForPosition(getFirstPosition() + i);
- addView(v, i);
- measureThirdView(v);
- bottom = top + getItemHeight();
- v.layout(left, top, right, bottom);
- }
- }
-
- private void setAbsoluteScroll(int absoluteScroll) {
- mAbsoluteScroll = absoluteScroll;
- for (OnScrollListener listener : mOnScrollListeners) {
- listener.onAbsoluteScrollChange(mAbsoluteScroll);
- }
- }
-
- private void measureView(View v, int height) {
- final LayoutParams lp = (LayoutParams) v.getLayoutParams();
- final int widthSpec = getChildMeasureSpec(getWidth(),
- getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin, lp.width,
- canScrollHorizontally());
- final int heightSpec = getChildMeasureSpec(getHeight(),
- getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin,
- height, canScrollVertically());
- v.measure(widthSpec, heightSpec);
- }
-
- private void measureThirdView(View v) {
- measureView(v, (int) (1 + (float) getHeight() / THIRD));
- }
-
- private void measureZoomView(View v) {
- measureView(v, getHeight());
- }
-
- @Override
- public RecyclerView.LayoutParams generateDefaultLayoutParams() {
- return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- }
-
- @Override
- public boolean canScrollVertically() {
- // Disable vertical scrolling when zoomed.
- return getItemCount() != 1 || !mWasZoomedIn;
- }
-
- @Override
- public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, State state) {
- // TODO(gruszczy): This code is shit, needs to be rewritten.
- if (getChildCount() == 0) {
- return 0;
- }
- int scrolled = 0;
- final int left = getPaddingLeft();
- final int right = getWidth() - getPaddingRight();
- if (dy < 0) {
- while (scrolled > dy) {
- final View topView = getChildAt(0);
- if (getFirstPosition() > 0) {
- final int hangingTop = Math.max(-topView.getTop(), 0);
- final int scrollBy = Math.min(scrolled - dy, hangingTop);
- scrolled -= scrollBy;
- offsetChildrenVertical(scrollBy);
- if (getFirstPosition() > 0 && scrolled > dy) {
- mFirstPosition--;
- View v = recycler.getViewForPosition(getFirstPosition());
- addView(v, 0);
- measureThirdView(v);
- final int bottom = topView.getTop();
- final int top = bottom - getItemHeight();
- v.layout(left, top, right, bottom);
- } else {
- break;
- }
- } else {
- mPushFirstHigher = false;
- int maxScroll = mOverScrollListener!= null ?
- getHeight() : getTopViewMaxTop();
- final int scrollBy = Math.min(-dy + scrolled, maxScroll - topView.getTop());
- scrolled -= scrollBy;
- offsetChildrenVertical(scrollBy);
- break;
- }
- }
- } else if (dy > 0) {
- final int parentHeight = getHeight();
- while (scrolled < dy) {
- final View bottomView = getChildAt(getChildCount() - 1);
- if (state.getItemCount() > mFirstPosition + getChildCount()) {
- final int hangingBottom =
- Math.max(bottomView.getBottom() - parentHeight, 0);
- final int scrollBy = -Math.min(dy - scrolled, hangingBottom);
- scrolled -= scrollBy;
- offsetChildrenVertical(scrollBy);
- if (scrolled < dy) {
- View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
- final int top = getChildAt(getChildCount() - 1).getBottom();
- addView(v);
- measureThirdView(v);
- final int bottom = top + getItemHeight();
- v.layout(left, top, right, bottom);
- } else {
- break;
- }
- } else {
- final int scrollBy =
- Math.max(-dy + scrolled, getHeight() / 2 - bottomView.getBottom());
- scrolled -= scrollBy;
- offsetChildrenVertical(scrollBy);
- break;
- }
- }
- }
- recycleViewsOutOfBounds(recycler);
- setAbsoluteScroll(mAbsoluteScroll + scrolled);
- return scrolled;
- }
-
- @Override
- public void scrollToPosition(int position) {
- mUseOldViewTop = false;
- if (position > 0) {
- mFirstPosition = position - 1;
- mPushFirstHigher = true;
- } else {
- mFirstPosition = position;
- mPushFirstHigher = false;
- }
- requestLayout();
- }
-
- public void setCustomSmoothScroller(RecyclerView.SmoothScroller smoothScroller) {
- mSmoothScroller = smoothScroller;
- }
-
- public void clearCustomSmoothScroller() {
- mSmoothScroller = null;
- }
-
- public RecyclerView.SmoothScroller getDefaultSmoothScroller(RecyclerView recyclerView) {
- if (mDefaultSmoothScroller == null) {
- mDefaultSmoothScroller = new SmoothScroller(
- recyclerView.getContext(), this);
- }
- return mDefaultSmoothScroller;
- }
- @Override
- public void smoothScrollToPosition(RecyclerView recyclerView, State state,
- int position) {
- RecyclerView.SmoothScroller scroller = mSmoothScroller;
- if (scroller == null) {
- scroller = getDefaultSmoothScroller(recyclerView);
- }
- scroller.setTargetPosition(position);
- startSmoothScroll(scroller);
- }
-
- private void recycleViewsOutOfBounds(RecyclerView.Recycler recycler) {
- final int childCount = getChildCount();
- final int parentWidth = getWidth();
- // Here we want to use real height, so we don't remove views that are only visible in
- // padded section.
- final int parentHeight = getHeight();
- boolean foundFirst = false;
- int first = 0;
- int last = 0;
- for (int i = 0; i < childCount; i++) {
- final View v = getChildAt(i);
- if (v.hasFocus() || (v.getRight() >= 0 && v.getLeft() <= parentWidth &&
- v.getBottom() >= 0 && v.getTop() <= parentHeight)) {
- if (!foundFirst) {
- first = i;
- foundFirst = true;
- }
- last = i;
- }
- }
- for (int i = childCount - 1; i > last; i--) {
- removeAndRecycleViewAt(i, recycler);
- }
- for (int i = first - 1; i >= 0; i--) {
- removeAndRecycleViewAt(i, recycler);
- }
- if (getChildCount() == 0) {
- mFirstPosition = 0;
- } else if (first > 0) {
- mPushFirstHigher = true;
- mFirstPosition += first;
- }
- }
-
- public int getFirstPosition() {
- return mFirstPosition;
- }
-
- @Override
- public void onAdapterChanged(RecyclerView.Adapter oldAdapter,
- RecyclerView.Adapter newAdapter) {
- removeAllViews();
- }
- }
-
- /**
- * Interface for receiving callbacks when WearableListView children become or cease to be the
- * central item.
- */
- public interface OnCenterProximityListener {
- /**
- * Called when this view becomes central item of the WearableListView.
- *
- * @param animate Whether you should animate your transition of the View to become the
- * central item. If false, this is the initial setting and you should
- * transition immediately.
- */
- void onCenterPosition(boolean animate);
-
- /**
- * Called when this view stops being the central item of the WearableListView.
- * @param animate Whether you should animate your transition of the View to being
- * non central item. If false, this is the initial setting and you should
- * transition immediately.
- */
- void onNonCenterPosition(boolean animate);
- }
-
- /**
- * Interface for listening for click events on WearableListView.
- */
- public interface ClickListener {
- /**
- * Called when the central child of the WearableListView is tapped.
- * @param view View that was clicked.
- */
- public void onClick(ViewHolder view);
-
- /**
- * Called when the user taps the top third of the WearableListView and no item is present
- * there. This can happen when you are in initial state and the first, top-most item of the
- * WearableListView is centered.
- */
- public void onTopEmptyRegionClick();
- }
-
- /**
- * @hide
- */
- public interface OnOverScrollListener {
- public void onOverScroll();
- }
-
- /**
- * Interface for listening to WearableListView content scrolling.
- */
- public interface OnScrollListener {
- /**
- * Called when the content is scrolled, reporting the relative scroll value.
- * @param scroll Amount the content was scrolled. This is a delta from the previous
- * position to the new position.
- */
- public void onScroll(int scroll);
-
- /**
- * Called when the content is scrolled, reporting the absolute scroll value.
- *
- * @deprecated BE ADVISED DO NOT USE THIS This might provide wrong values when contents
- * of a RecyclerView change.
- *
- * @param scroll Absolute scroll position of the content inside the WearableListView.
- */
- @Deprecated
- public void onAbsoluteScrollChange(int scroll);
-
- /**
- * Called when WearableListView's scroll state changes.
- *
- * @param scrollState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
- * {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
- */
- public void onScrollStateChanged(int scrollState);
-
- /**
- * Called when the central item of the WearableListView changes.
- *
- * @param centralPosition Position of the item in the Adapter.
- */
- public void onCentralPositionChanged(int centralPosition);
- }
-
- /**
- * A listener interface that can be added to the WearableListView to get notified when the
- * central item is changed.
- */
- public interface OnCentralPositionChangedListener {
- /**
- * Called when the central item of the WearableListView changes.
- *
- * @param centralPosition Position of the item in the Adapter.
- */
- void onCentralPositionChanged(int centralPosition);
- }
-
- /**
- * Base class for adapters providing data for the WearableListView. For details refer to
- * RecyclerView.Adapter.
- */
- public static abstract class Adapter extends RecyclerView.Adapter<ViewHolder> {
- }
-
- private static class SmoothScroller extends LinearSmoothScroller {
-
- private static final float MILLISECONDS_PER_INCH = 100f;
-
- private final LayoutManager mLayoutManager;
-
- public SmoothScroller(Context context, WearableListView.LayoutManager manager) {
- super(context);
- mLayoutManager = manager;
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- }
-
- // TODO: (mindyp): when flinging, return the dydt that triggered the fling.
- @Override
- protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
- return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
- }
-
- @Override
- public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int
- snapPreference) {
- // Snap to center.
- return (boxStart + boxEnd) / 2 - (viewStart + viewEnd) / 2;
- }
-
- @Override
- public PointF computeScrollVectorForPosition(int targetPosition) {
- if (targetPosition < mLayoutManager.getFirstPosition()) {
- return new PointF(0, -1);
- } else {
- return new PointF(0, 1);
- }
- }
- }
-
- /**
- * Wrapper around items displayed in the list view. {@link .Adapter} must return objects that
- * are instances of this class. Consider making the wrapped View implement
- * {@link .OnCenterProximityListener} if you want to receive a callback when it becomes or
- * ceases to be the central item in the WearableListView.
- */
- public static class ViewHolder extends RecyclerView.ViewHolder {
- public ViewHolder(View itemView) {
- super(itemView);
- }
-
- /**
- * Called when the wrapped view is becoming or ceasing to be the central item of the
- * WearableListView.
- *
- * Retained as protected for backwards compatibility.
- *
- * @hide
- */
- protected void onCenterProximity(boolean isCentralItem, boolean animate) {
- if (!(itemView instanceof OnCenterProximityListener)) {
- return;
- }
- OnCenterProximityListener item = (OnCenterProximityListener) itemView;
- if (isCentralItem) {
- item.onCenterPosition(animate);
- } else {
- item.onNonCenterPosition(animate);
- }
- }
- }
-
- private class SetScrollVerticallyProperty extends Property<WearableListView, Integer> {
- public SetScrollVerticallyProperty() {
- super(Integer.class, "scrollVertically");
- }
-
- @Override
- public Integer get(WearableListView wearableListView) {
- return wearableListView.mLastScrollChange;
- }
-
- @Override
- public void set(WearableListView wearableListView, Integer value) {
- wearableListView.setScrollVertically(value);
- }
- }
-}
diff --git a/PermissionController/src/com/android/permissioncontroller/DeviceUtils.java b/PermissionController/src/com/android/permissioncontroller/DeviceUtils.java
index 60caf888c..ec3642d1d 100644
--- a/PermissionController/src/com/android/permissioncontroller/DeviceUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/DeviceUtils.java
@@ -18,12 +18,10 @@ package com.android.permissioncontroller;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.res.Configuration;
public class DeviceUtils {
public static boolean isTelevision(Context context) {
- int uiMode = context.getResources().getConfiguration().uiMode;
- return (uiMode & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_TELEVISION;
+ return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
}
public static boolean isWear(final Context context) {
diff --git a/PermissionController/src/com/android/permissioncontroller/PermissionController.proto b/PermissionController/src/com/android/permissioncontroller/PermissionController.proto
index 429909b71..02e51ce2d 100644
--- a/PermissionController/src/com/android/permissioncontroller/PermissionController.proto
+++ b/PermissionController/src/com/android/permissioncontroller/PermissionController.proto
@@ -17,7 +17,7 @@ syntax = "proto2";
package com.android.permissioncontroller;
option java_outer_classname = "PermissionControllerProto";
-import "packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.proto";
+import "permission/service/AutoRevokePermissions.proto";
message PermissionControllerDumpProto {
optional permission.service.AutoRevokePermissionsDumpProto autoRevoke = 1;
diff --git a/PermissionController/src/com/android/permissioncontroller/PermissionControllerApplication.java b/PermissionController/src/com/android/permissioncontroller/PermissionControllerApplication.java
index bc7a1d051..8a6fa3286 100644
--- a/PermissionController/src/com/android/permissioncontroller/PermissionControllerApplication.java
+++ b/PermissionController/src/com/android/permissioncontroller/PermissionControllerApplication.java
@@ -27,6 +27,7 @@ import android.view.accessibility.AccessibilityManager;
import androidx.annotation.RequiresApi;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.permissioncontroller.privacysources.SafetyCenterAccessibilityListener;
import com.android.permissioncontroller.role.model.Role;
@@ -48,6 +49,9 @@ public final class PermissionControllerApplication extends Application {
if (SdkLevel.isAtLeastT()) {
addAccessibilityListener();
}
+ if (Utils.isHealthPermissionUiEnabled()) {
+ KotlinUtils.INSTANCE.addHealthPermissions(this);
+ }
}
/**
diff --git a/PermissionController/src/com/android/permissioncontroller/hibernation/OWNERS b/PermissionController/src/com/android/permissioncontroller/hibernation/OWNERS
new file mode 100644
index 000000000..21ab3aa28
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/hibernation/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/core/java/android/apphibernation/OWNERS
diff --git a/PermissionController/src/com/android/permissioncontroller/incident/ReportDetails.java b/PermissionController/src/com/android/permissioncontroller/incident/ReportDetails.java
index 95fd2516f..d19ef460a 100644
--- a/PermissionController/src/com/android/permissioncontroller/incident/ReportDetails.java
+++ b/PermissionController/src/com/android/permissioncontroller/incident/ReportDetails.java
@@ -100,7 +100,7 @@ public class ReportDetails {
final IncidentHeaderProto header = incident.getHeader(i);
if (header.hasReason()) {
final String reason = header.getReason();
- if (reason != null && reason.length() > 0) {
+ if (reason.length() > 0) {
result.add(reason);
}
}
@@ -122,9 +122,6 @@ public class ReportDetails {
final int setsCount = section.getSetsCount();
for (int i = 0; i < setsCount; i++) {
final RestrictedImageSetProto set = section.getSets(i);
- if (set == null) {
- continue;
- }
final int imageCount = set.getImagesCount();
for (int j = 0; j < imageCount; j++) {
// Hard cap on number of images, as a guardrail.
@@ -135,18 +132,12 @@ public class ReportDetails {
}
final RestrictedImageProto image = set.getImages(j);
- if (image == null) {
- continue;
- }
final String mimeType = image.getMimeType();
if (!("image/jpeg".equals(mimeType)
|| "image/png".equals(mimeType))) {
throw new ParseException("Unsupported image type " + mimeType);
}
final ByteString bytes = image.getImageData();
- if (bytes == null) {
- continue;
- }
final byte[] buf = bytes.toByteArray();
if (buf.length == 0) {
continue;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/TEST_MAPPING b/PermissionController/src/com/android/permissioncontroller/permission/TEST_MAPPING
index 6b89bc2f7..de7511e19 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/TEST_MAPPING
+++ b/PermissionController/src/com/android/permissioncontroller/permission/TEST_MAPPING
@@ -5,6 +5,24 @@
"options": [
{
"include-filter": "android.permission.cts.BackgroundPermissionsTest"
+ },
+ {
+ "include-filter": "android.permission.cts.LocationAccessCheckTest"
+ },
+ {
+ "include-filter": "android.permission.cts.NotificationListenerCheckTest"
+ },
+ {
+ "include-filter": "android.permission.cts.OneTimePermissionTest"
+ },
+ {
+ "include-filter": "android.permission.cts.PermissionControllerTest"
+ },
+ {
+ "include-filter": "android.permission.cts.PlatformPermissionGroupMappingTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
}
]
},
@@ -13,15 +31,57 @@
"options": [
{
"include-filter": "android.os.cts.AutoRevokeTest"
+ },
+ {
+ "include-filter": "android.os.cts.AppHibernationIntegrationTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
}
]
}
],
- "presubmit-large": [
+ "mainline-presubmit": [
+ {
+ "name": "CtsPermissionTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "include-filter": "android.permission.cts.BackgroundPermissionsTest"
+ },
+ {
+ "include-filter": "android.permission.cts.LocationAccessCheckTest"
+ },
+ {
+ "include-filter": "android.permission.cts.NotificationListenerCheckTest"
+ },
+ {
+ "include-filter": "android.permission.cts.OneTimePermissionTest"
+ },
+ {
+ "include-filter": "android.permission.cts.PermissionControllerTest"
+ },
+ {
+ "include-filter": "android.permission.cts.PlatformPermissionGroupMappingTest"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ },
{
- "name": "CtsPermission3TestCases",
+ "name": "CtsOsTestCases[com.google.android.permission.apex]",
"options": [
{
+ "include-filter": "android.os.cts.AutoRevokeTest"
+ },
+ {
+ "include-filter": "android.os.cts.AppHibernationIntegrationTest"
+ },
+ // TODO(b/238677038): This test currently fails on R base image
+ {
+ "exclude-filter": "android.os.cts.AutoRevokeTest#testUnusedApp_uninstallApp"
+ },
+ {
"exclude-annotation": "android.platform.test.annotations.FlakyTest"
}
]
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
index 0318144e4..5d91ebfda 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
@@ -18,6 +18,8 @@ package com.android.permissioncontroller.permission.data
import android.app.Application
import android.app.role.RoleManager
+import android.os.Handler
+import android.os.Looper
import android.os.UserHandle
import androidx.lifecycle.LiveData
import com.android.permissioncontroller.PermissionControllerApplication
@@ -34,11 +36,24 @@ import com.android.permissioncontroller.permission.utils.Utils
*/
class PermGroupsPackagesUiInfoLiveData(
private val app: Application,
- groupNamesLiveData: LiveData<List<String>>
+ private val groupNamesLiveData: LiveData<List<String>>
) : SmartUpdateMediatorLiveData<
@kotlin.jvm.JvmSuppressWildcards Map<String, PermGroupPackagesUiInfo?>>() {
private val SYSTEM_SHELL = "android.app.role.SYSTEM_SHELL"
+ private val STAGGER_LOAD_TIME_MS = 50L
+
+ // Optimization: This LiveData relies on a large number of other ones. Enough that they can
+ // cause loading issues when they all become active at once. If this value is true, then it will
+ // slowly load data from all source LiveDatas, spacing loads them STAGGER_LOAD_TIME_MS apart
+ var loadStaggered: Boolean = false
+
+ // If we are returning from a particular permission group page, then that particular group is
+ // the one most likely to change. If so, then it will be prioritized in the load order.
+ var firstLoadGroup: String? = null
+
+ private val handler: Handler = Handler(Looper.getMainLooper())
+
/**
* Map<permission group name, PermGroupUiLiveDatas>
*/
@@ -139,4 +154,39 @@ class PermGroupsPackagesUiInfoLiveData(
}
value = allPackageData.toMap()
}
+
+ // Schedule a staggered loading of individual permission group livedatas
+ private fun scheduleStaggeredGroupLoad() {
+ if (groupNamesLiveData.value != null) {
+ if (firstLoadGroup in groupNames) {
+ addLiveDataDelayed(firstLoadGroup!!, 0)
+ }
+ for ((idx, groupName) in groupNames.withIndex()) {
+ if (groupName != firstLoadGroup) {
+ addLiveDataDelayed(groupName, idx * STAGGER_LOAD_TIME_MS)
+ }
+ }
+ }
+ }
+
+ private fun addLiveDataDelayed(groupName: String, delayTimeMs: Long) {
+ val liveData = SinglePermGroupPackagesUiInfoLiveData[groupName]
+ permGroupPackagesLiveDatas[groupName] = liveData
+ handler.postDelayed( { addSource(liveData) { update() } }, delayTimeMs)
+ }
+
+ override fun onActive() {
+ super.onActive()
+ if (loadStaggered && permGroupPackagesLiveDatas.isEmpty()) {
+ scheduleStaggeredGroupLoad()
+ }
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ if (loadStaggered) {
+ permGroupPackagesLiveDatas.forEach { (_, liveData) -> removeSource(liveData) }
+ permGroupPackagesLiveDatas.clear()
+ }
+ }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
index c74567d52..cca266721 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/SmartUpdateMediatorLiveData.kt
@@ -36,8 +36,8 @@ import kotlinx.coroutines.launch
*
* @param isStaticVal Whether or not this LiveData value is expected to change
*/
-abstract class SmartUpdateMediatorLiveData<T>(private val isStaticVal: Boolean = false)
- : MediatorLiveData<T>(), DataRepository.InactiveTimekeeper {
+abstract class SmartUpdateMediatorLiveData<T>(private val isStaticVal: Boolean = false) :
+ MediatorLiveData<T>(), DataRepository.InactiveTimekeeper {
companion object {
const val DEBUG_UPDATES = false
@@ -146,8 +146,9 @@ abstract class SmartUpdateMediatorLiveData<T>(private val isStaticVal: Boolean =
}
try {
super.addSource(source, onChanged)
- } catch (other: IllegalStateException) {
- throw other.apply { initCause(exception) }
+ } catch (ex: IllegalStateException) {
+ val other = ex as java.lang.Throwable
+ throw other.initCause(exception)
}
}
}
@@ -179,7 +180,7 @@ abstract class SmartUpdateMediatorLiveData<T>(private val isStaticVal: Boolean =
have: MutableMap<K, V>,
getLiveDataFun: (K) -> V,
onUpdateFun: ((K) -> Unit)? = null
- ) : Pair<Set<K>, Set<K>>{
+ ): Pair<Set<K>, Set<K>>{
// Ensure the map is correct when method returns
val (toAdd, toRemove) = KotlinUtils.getMapAndListDifferences(desired, have)
for (key in toAdd) {
@@ -252,4 +253,4 @@ abstract class SmartUpdateMediatorLiveData<T>(private val isStaticVal: Boolean =
},
isInitialized = { isInitialized && (staleOk || !isStale) })
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/model/v31/AppPermissionUsage.java b/PermissionController/src/com/android/permissioncontroller/permission/model/v31/AppPermissionUsage.java
index 8622ef3ab..b7cddace2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/model/v31/AppPermissionUsage.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/model/v31/AppPermissionUsage.java
@@ -125,16 +125,6 @@ public final class AppPermissionUsage {
return lastAccessTime;
}
- public long getAccessCount() {
- long accessCount = 0;
- final int permissionCount = mGroupUsages.size();
- for (int i = 0; i < permissionCount; i++) {
- final GroupUsage permission = mGroupUsages.get(i);
- accessCount += permission.getAccessCount();
- }
- return accessCount;
- }
-
public @NonNull List<GroupUsage> getGroupUsages() {
return mGroupUsages;
}
@@ -163,62 +153,6 @@ public final class AppPermissionUsage {
return lastAccessAggregate((op) -> op.getLastAccessTime(PRIVACY_HUB_FLAGS));
}
- public long getLastAccessForegroundTime() {
- if (mLastUsage == null) {
- return 0;
- }
-
- return lastAccessAggregate((op) -> op.getLastAccessForegroundTime(PRIVACY_HUB_FLAGS));
- }
-
- public long getLastAccessBackgroundTime() {
- if (mLastUsage == null) {
- return 0;
- }
-
- return lastAccessAggregate((op) -> op.getLastAccessBackgroundTime(PRIVACY_HUB_FLAGS));
- }
-
- public long getForegroundAccessCount() {
- if (mHistoricalUsage == null) {
- return 0;
- }
-
- return extractAggregate((HistoricalOp op)
- -> op.getForegroundAccessCount(PRIVACY_HUB_FLAGS));
- }
-
- public long getBackgroundAccessCount() {
- if (mHistoricalUsage == null) {
- return 0;
- }
-
- return extractAggregate((HistoricalOp op)
- -> op.getBackgroundAccessCount(PRIVACY_HUB_FLAGS));
- }
-
- public long getAccessCount() {
- if (mHistoricalUsage == null) {
- return 0;
- }
-
- return extractAggregate((HistoricalOp op) ->
- op.getForegroundAccessCount(PRIVACY_HUB_FLAGS)
- + op.getBackgroundAccessCount(PRIVACY_HUB_FLAGS)
- );
- }
-
- /**
- * Get the last access duration.
- */
- public long getLastAccessDuration() {
- if (mLastUsage == null) {
- return 0;
- }
- return lastAccessAggregate(
- (op) -> op.getLastDuration(AppOpsManager.OP_FLAGS_ALL_TRUSTED));
- }
-
/**
* Get the access duration.
*/
@@ -508,11 +442,12 @@ public final class AppPermissionUsage {
}
AttributionLabelledGroupUsage build() {
+ ArrayList<String> attributionTagsList = new ArrayList<>();
+ attributionTagsList.addAll(mAttributionTags);
return new AttributionLabelledGroupUsage(mLabel,
mAppPermissionGroup,
- new ArrayList<String>() {{
- addAll(mAttributionTags);
- }}, mDiscreteAccessTime);
+ attributionTagsList,
+ mDiscreteAccessTime);
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/LocationAccessCheck.java b/PermissionController/src/com/android/permissioncontroller/permission/service/LocationAccessCheck.java
index e0e124f54..6d58d96d2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/LocationAccessCheck.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/LocationAccessCheck.java
@@ -160,7 +160,7 @@ import java.util.stream.Collectors;
*/
public class LocationAccessCheck {
private static final String LOG_TAG = LocationAccessCheck.class.getSimpleName();
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final long DEFAULT_RENOTIFY_DURATION_MILLIS = DAYS.toMillis(90);
private static final String ISSUE_ID_PREFIX = "bg_location_";
private static final String ISSUE_TYPE_ID = "bg_location_privacy_issue";
@@ -410,6 +410,7 @@ public class LocationAccessCheck {
private void addLocationNotificationIfNeeded(@NonNull JobParameters params,
@NonNull LocationAccessCheckJobService service) {
if (!checkLocationAccessCheckEnabledAndUpdateEnabledTime()) {
+ Log.v(LOG_TAG, "LocationAccessCheck feature is not enabled.");
service.jobFinished(params, false);
return;
}
@@ -419,11 +420,13 @@ public class LocationAccessCheck {
if (currentTimeMillis() - mSharedPrefs.getLong(
KEY_LAST_LOCATION_ACCESS_NOTIFICATION_SHOWN, 0)
< getInBetweenNotificationsMillis()) {
+ Log.v(LOG_TAG, "location notification interval is not enough.");
service.jobFinished(params, false);
return;
}
if (getCurrentlyShownNotificationLocked() != null) {
+ Log.v(LOG_TAG, "already location notification exist.");
service.jobFinished(params, false);
return;
}
@@ -437,6 +440,7 @@ public class LocationAccessCheck {
} finally {
synchronized (sLock) {
service.mAddLocationNotificationIfNeededTask = null;
+ Log.v(LOG_TAG, "LocationAccessCheck privacy job marked complete.");
}
}
}
@@ -447,6 +451,10 @@ public class LocationAccessCheck {
synchronized (sLock) {
List<UserPackage> packages = getLocationUsersLocked(ops);
ArraySet<UserPackage> alreadyNotifiedPackages = loadAlreadyNotifiedPackagesLocked();
+ if (DEBUG) {
+ Log.v(LOG_TAG, "location packages: " + packages);
+ Log.v(LOG_TAG, "already notified packages: " + alreadyNotifiedPackages);
+ }
throwInterruptedExceptionIfTaskIsCanceled();
// Send these issues to safety center
if (isSafetyCenterBgLocationReminderEnabled()) {
@@ -462,6 +470,9 @@ public class LocationAccessCheck {
throwInterruptedExceptionIfTaskIsCanceled();
if (packages.isEmpty()) {
+ if (DEBUG) {
+ Log.v(LOG_TAG, "No package found to send a notification");
+ }
return;
}
@@ -1152,6 +1163,7 @@ public class LocationAccessCheck {
@Override
public void onCreate() {
+ Log.v(LOG_TAG, "LocationAccessCheck privacy job is created");
super.onCreate();
mLocationAccessCheck = new LocationAccessCheck(this, () -> {
synchronized (sLock) {
@@ -1170,8 +1182,10 @@ public class LocationAccessCheck {
*/
@Override
public boolean onStartJob(JobParameters params) {
+ Log.v(LOG_TAG, "LocationAccessCheck privacy job is started");
synchronized (LocationAccessCheck.sLock) {
if (mAddLocationNotificationIfNeededTask != null) {
+ Log.v(LOG_TAG, "LocationAccessCheck old job not completed yet.");
return false;
}
@@ -1192,6 +1206,7 @@ public class LocationAccessCheck {
*/
@Override
public boolean onStopJob(JobParameters params) {
+ Log.v(LOG_TAG, "LocationAccessCheck privacy source onStopJob called.");
AddLocationNotificationIfNeededTask task;
synchronized (sLock) {
if (mAddLocationNotificationIfNeededTask == null) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt
index af151320f..b4a0d73ea 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt
@@ -19,6 +19,7 @@ package com.android.permissioncontroller.permission.service.v33
import android.content.ComponentName
import android.content.Intent
import android.content.pm.PackageManager
+import android.graphics.drawable.Icon
import android.os.IBinder
import android.provider.DeviceConfig
import android.safetycenter.SafetyCenterManager
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
index 296a007aa..e40941178 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
@@ -59,9 +59,9 @@ import com.android.modules.utils.build.SdkLevel;
import com.android.permissioncontroller.DeviceUtils;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.ui.auto.GrantPermissionsAutoViewHandler;
-import com.android.permissioncontroller.permission.ui.model.v31.GrantPermissionsViewModel;
-import com.android.permissioncontroller.permission.ui.model.v31.GrantPermissionsViewModel.RequestInfo;
-import com.android.permissioncontroller.permission.ui.model.v31.GrantPermissionsViewModelFactory;
+import com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel;
+import com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.RequestInfo;
+import com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModelFactory;
import com.android.permissioncontroller.permission.ui.wear.GrantPermissionsWearViewHandler;
import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.permission.utils.Utils;
@@ -106,11 +106,9 @@ public class GrantPermissionsActivity extends SettingsActivity
public static final int DIALOG_WITH_FINE_LOCATION_ONLY = 4;
public static final int DIALOG_WITH_COARSE_LOCATION_ONLY = 5;
- public static final Map<String, Integer> PERMISSION_TO_BIT_SHIFT =
- new HashMap<String, Integer>() {{
- put(ACCESS_COARSE_LOCATION, 0);
- put(ACCESS_FINE_LOCATION, 1);
- }};
+ public static final Map<String, Integer> PERMISSION_TO_BIT_SHIFT = Map.of(
+ ACCESS_COARSE_LOCATION, 0,
+ ACCESS_FINE_LOCATION, 1);
private static final int APP_PERMISSION_REQUEST_CODE = 1;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
index 91ca82338..85f1e9977 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
@@ -364,6 +364,14 @@ public final class ManagePermissionsActivity extends SettingsActivity {
return;
}
+ if (Utils.isHealthPermissionUiEnabled() && permissionGroupName
+ .equals(PermissionMapping.getHealthPermissionGroupString())) {
+ // TODO(b/248358404): Redirect to the health connect UI, health permissions list
+ // for all apps.
+ finishAfterTransition();
+ return;
+ }
+
if (DeviceUtils.isAuto(this)) {
androidXFragment =
AutoPermissionAppsFragment.newInstance(permissionGroupName, sessionId);
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ReviewOngoingUsageActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ReviewOngoingUsageActivity.java
index 6dfceb90d..05a75f594 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ReviewOngoingUsageActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ReviewOngoingUsageActivity.java
@@ -25,8 +25,8 @@ import android.view.MenuItem;
import androidx.annotation.NonNull;
import com.android.permissioncontroller.DeviceUtils;
-import com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt;
import com.android.permissioncontroller.permission.ui.handheld.v31.ReviewOngoingUsageWrapperFragment;
+import com.android.permissioncontroller.permission.utils.KotlinUtils;
/**
* A dialog listing the currently uses of camera, microphone, and location.
@@ -40,8 +40,8 @@ public final class ReviewOngoingUsageActivity extends SettingsActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (!DashboardUtilsKt.shouldShowCameraMicIndicators()
- && !DashboardUtilsKt.shouldShowLocationIndicators()) {
+ if (!KotlinUtils.INSTANCE.shouldShowCameraMicIndicators()
+ && !KotlinUtils.INSTANCE.shouldShowLocationIndicators()) {
finishAfterTransition();
return;
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionsFragment.java
index 0973d1dfe..cf58f1e17 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionsFragment.java
@@ -23,7 +23,6 @@ import static com.android.permissioncontroller.PermissionControllerStatsLog.APP_
import static com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND;
import static com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__DENIED;
import static com.android.permissioncontroller.permission.ui.ManagePermissionsActivity.EXTRA_CALLER_NAME;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.is7DayToggleEnabled;
import static java.util.concurrent.TimeUnit.DAYS;
@@ -146,7 +145,7 @@ public class AutoAppPermissionsFragment extends AutoSettingsFrameFragment implem
if (SdkLevel.isAtLeastS()) {
mPermissionUsages = new PermissionUsages(getContext());
- long aggregateDataFilterBeginDays = is7DayToggleEnabled()
+ long aggregateDataFilterBeginDays = KotlinUtils.INSTANCE.is7DayToggleEnabled()
? AppPermissionGroupsViewModel.AGGREGATE_DATA_FILTER_BEGIN_DAYS_7 :
AppPermissionGroupsViewModel.AGGREGATE_DATA_FILTER_BEGIN_DAYS_1;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionHistoryPreference.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionHistoryPreference.kt
index 0d2ee9895..ff7697cf9 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionHistoryPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionHistoryPreference.kt
@@ -18,14 +18,13 @@ package com.android.permissioncontroller.permission.ui.auto.dashboard
import android.content.Context
import android.content.Intent
+import android.text.format.DateFormat
import androidx.preference.Preference.OnPreferenceClickListener
import com.android.car.ui.preference.CarUiPreference
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
-/**
- * Preference that displays a permission usage for an app.
- */
+/** Preference that displays a permission usage for an app. */
class AutoPermissionHistoryPreference(
context: Context,
historyPreferenceData: PermissionUsageDetailsViewModel.HistoryPreferenceData
@@ -33,21 +32,25 @@ class AutoPermissionHistoryPreference(
init {
title = historyPreferenceData.preferenceTitle
- summary = if (historyPreferenceData.summaryText != null) {
- context.getString(R.string.auto_permission_usage_timeline_summary,
- historyPreferenceData.accessTime, historyPreferenceData.summaryText)
- } else {
- historyPreferenceData.accessTime
- }
+ summary =
+ if (historyPreferenceData.summaryText != null) {
+ context.getString(
+ R.string.auto_permission_usage_timeline_summary,
+ DateFormat.getTimeFormat(context).format(historyPreferenceData.accessEndTime),
+ historyPreferenceData.summaryText)
+ } else {
+ DateFormat.getTimeFormat(context).format(historyPreferenceData.accessEndTime)
+ }
if (historyPreferenceData.appIcon != null) {
icon = historyPreferenceData.appIcon
}
onPreferenceClickListener = OnPreferenceClickListener {
- val intent = Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS).apply {
- putExtra(Intent.EXTRA_USER, historyPreferenceData.userHandle)
- putExtra(Intent.EXTRA_PACKAGE_NAME, historyPreferenceData.pkgName)
- }
+ val intent =
+ Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS).apply {
+ putExtra(Intent.EXTRA_USER, historyPreferenceData.userHandle)
+ putExtra(Intent.EXTRA_PACKAGE_NAME, historyPreferenceData.pkgName)
+ }
context.startActivity(intent)
true
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
index f13a3565d..1e336d905 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
@@ -17,14 +17,15 @@
package com.android.permissioncontroller.permission.ui.auto.dashboard
import android.app.role.RoleManager
-import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
+import android.text.format.DateFormat
import androidx.annotation.RequiresApi
import androidx.lifecycle.ViewModelProvider
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
+import androidx.preference.PreferenceScreen
import com.android.car.ui.preference.CarUiPreference
import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.DumpableLog
@@ -34,47 +35,56 @@ import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.auto.AutoSettingsFrameFragment
+import com.android.permissioncontroller.permission.model.legacy.PermissionApps.AppDataLoader
import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.model.v31.PermissionUsages
import com.android.permissioncontroller.permission.model.v31.PermissionUsages.PermissionsUsagesChangeCallback
-import com.android.permissioncontroller.permission.model.legacy.PermissionApps.AppDataLoader
-import com.android.permissioncontroller.permission.model.legacy.PermissionApps.PermissionApp
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
import com.android.permissioncontroller.permission.ui.auto.AutoDividerPreference
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.AppPermissionUsageEntry
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModelFactory
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
import com.android.permissioncontroller.permission.utils.Utils
-import java.util.concurrent.atomic.AtomicBoolean
+import java.time.Clock
+import java.time.Instant
+import java.time.ZoneId
+import java.time.ZonedDateTime
+import java.time.temporal.ChronoUnit
import java.util.concurrent.atomic.AtomicReference
@RequiresApi(Build.VERSION_CODES.S)
-class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
- PermissionsUsagesChangeCallback {
+class AutoPermissionUsageDetailsFragment :
+ AutoSettingsFrameFragment(), PermissionsUsagesChangeCallback {
companion object {
private const val LOG_TAG = "AutoPermissionUsageDetailsFragment"
private const val KEY_SESSION_ID = "_session_id"
private const val FILTER_24_HOURS = 2
+ private val MIDNIGHT_TODAY =
+ ZonedDateTime.now(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toEpochSecond() *
+ 1000L
+ private val MIDNIGHT_YESTERDAY =
+ ZonedDateTime.now(ZoneId.systemDefault())
+ .minusDays(1)
+ .truncatedTo(ChronoUnit.DAYS)
+ .toEpochSecond() * 1000L
// Only show the last 24 hours on Auto right now
private const val SHOW_7_DAYS = false
- /**
- * Creates a new instance of [AutoPermissionUsageDetailsFragment].
- */
+ /** Creates a new instance of [AutoPermissionUsageDetailsFragment]. */
fun newInstance(
groupName: String?,
showSystem: Boolean,
sessionId: Long
): AutoPermissionUsageDetailsFragment {
return AutoPermissionUsageDetailsFragment().apply {
- arguments = Bundle().apply {
- putString(Intent.EXTRA_PERMISSION_GROUP_NAME, groupName)
- putLong(Constants.EXTRA_SESSION_ID, sessionId)
- putBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, showSystem)
- }
+ arguments =
+ Bundle().apply {
+ putString(Intent.EXTRA_PERMISSION_GROUP_NAME, groupName)
+ putLong(Constants.EXTRA_SESSION_ID, sessionId)
+ putBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, showSystem)
+ }
}
}
}
@@ -91,7 +101,7 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
private var finishedInitialLoad = false
private var hasSystemApps = false
- /** Unique Id of a request */
+ /** Unique Id of a request */
private var sessionId: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
@@ -108,25 +118,26 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
return
}
filterGroup = requireArguments().getString(Intent.EXTRA_PERMISSION_GROUP_NAME)!!
- showSystem = requireArguments().getBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM,
- false)
- sessionId = savedInstanceState?.getLong(SESSION_ID_KEY)
- ?: (arguments?.getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID)
- ?: Constants.INVALID_SESSION_ID)
- headerLabel = resources.getString(R.string.permission_group_usage_title,
- getPermGroupLabel(requireContext(), filterGroup))
+ showSystem =
+ requireArguments().getBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, false)
+ sessionId =
+ savedInstanceState?.getLong(SESSION_ID_KEY)
+ ?: (arguments?.getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID)
+ ?: Constants.INVALID_SESSION_ID)
+ headerLabel =
+ resources.getString(
+ R.string.permission_group_usage_title,
+ getPermGroupLabel(requireContext(), filterGroup))
val context = preferenceManager.getContext()
- permissionUsages =
- PermissionUsages(
- context
- )
+ permissionUsages = PermissionUsages(context)
roleManager = Utils.getSystemServiceSafe(context, RoleManager::class.java)
- val usageViewModelFactory = PermissionUsageDetailsViewModelFactory(
- PermissionControllerApplication.get(), roleManager,
- filterGroup, sessionId)
- usageViewModel = ViewModelProvider(this,
- usageViewModelFactory)[PermissionUsageDetailsViewModel::class.java]
+ val usageViewModelFactory =
+ PermissionUsageDetailsViewModelFactory(
+ PermissionControllerApplication.get(), roleManager, filterGroup, sessionId)
+ usageViewModel =
+ ViewModelProvider(this, usageViewModelFactory)[
+ PermissionUsageDetailsViewModel::class.java]
reloadData()
}
@@ -142,9 +153,7 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
preferenceScreen.addPreference(AutoDividerPreference(context))
}
- /**
- * Reloads the data to show.
- */
+ /** Reloads the data to show. */
private fun reloadData() {
usageViewModel.loadPermissionUsages(
requireActivity().getLoaderManager(), permissionUsages, this, FILTER_24_HOURS)
@@ -164,7 +173,8 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
private fun updateSystemToggle() {
if (!showSystem) {
PermissionControllerStatsLog.write(
- PERMISSION_USAGE_FRAGMENT_INTERACTION, sessionId,
+ PERMISSION_USAGE_FRAGMENT_INTERACTION,
+ sessionId,
PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED)
}
showSystem = !showSystem
@@ -177,11 +187,12 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
setAction(null, null)
return
}
- val label = if (showSystem) {
- getString(R.string.menu_hide_system)
- } else {
- getString(R.string.menu_show_system)
- }
+ val label =
+ if (showSystem) {
+ getString(R.string.menu_hide_system)
+ } else {
+ getString(R.string.menu_show_system)
+ }
setAction(label) { updateSystemToggle() }
}
@@ -192,68 +203,102 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment(),
preferenceScreen.removeAll()
setupHeaderPreferences()
- val permApps = arrayListOf<PermissionApp>()
val exemptedPackages = Utils.getExemptedPackages(roleManager)
- val seenSystemApp = AtomicBoolean(false)
- val usages: List<AppPermissionUsageEntry> = usageViewModel.parseUsages(
- appPermissionUsages, exemptedPackages, permApps, seenSystemApp, showSystem,
- SHOW_7_DAYS)
- if (hasSystemApps != seenSystemApp.get()) {
- hasSystemApps = seenSystemApp.get()
+ val uiData =
+ usageViewModel.buildPermissionUsageDetailsUiData(
+ appPermissionUsages, showSystem, SHOW_7_DAYS)
+
+ if (hasSystemApps != uiData.shouldDisplayShowSystemToggle) {
+ hasSystemApps = uiData.shouldDisplayShowSystemToggle
updateAction()
}
- val preferenceFactory = PreferenceFactory(requireActivity())
- val category = AtomicReference(preferenceFactory.createDayCategoryPreference())
+ val category = AtomicReference(PreferenceCategory(context))
preferenceScreen.addPreference(category.get())
AppDataLoader(context) {
- usageViewModel.renderTimelinePreferences(usages, category, preferenceScreen,
- preferenceFactory)
+ renderHistoryPreferences(
+ uiData.getHistoryPreferenceDataList(), category, preferenceScreen)
- setLoading(false)
- finishedInitialLoad = true
- permissionUsages.stopLoader(requireActivity().getLoaderManager())
- }.execute(*permApps.toTypedArray())
+ setLoading(false)
+ finishedInitialLoad = true
+ permissionUsages.stopLoader(requireActivity().getLoaderManager())
+ }
+ .execute(*uiData.permissionApps.toTypedArray())
}
- private class PreferenceFactory(val context: Context) :
- PermissionUsageDetailsViewModel.HistoryPreferenceFactory {
-
- override fun createDayCategoryPreference(): PreferenceCategory {
- return PreferenceCategory(context)
- }
-
- override fun createPermissionHistoryPreference(
- historyPreferenceData: PermissionUsageDetailsViewModel.HistoryPreferenceData
- ): Preference {
- return AutoPermissionHistoryPreference(context, historyPreferenceData)
- }
+ fun createPermissionHistoryPreference(
+ historyPreferenceData: PermissionUsageDetailsViewModel.HistoryPreferenceData
+ ): Preference {
+ return AutoPermissionHistoryPreference(requireContext(), historyPreferenceData)
}
private fun addTimelineDescriptionPreference() {
- val preference = CarUiPreference(context).apply {
- summary = getString(R.string.permission_group_usage_subtitle_24h,
- getPermGroupLabel(requireContext(), filterGroup))
- isSelectable = false
- }
+ val preference =
+ CarUiPreference(context).apply {
+ summary =
+ getString(
+ R.string.permission_group_usage_subtitle_24h,
+ getPermGroupLabel(requireContext(), filterGroup))
+ isSelectable = false
+ }
preferenceScreen.addPreference(preference)
}
private fun addManagePermissionPreference() {
- val preference = CarUiPreference(context).apply {
- title = getString(R.string.manage_permission)
- summary = getString(R.string.manage_permission_summary,
- getPermGroupLabel(requireContext(), filterGroup))
- onPreferenceClickListener = Preference.OnPreferenceClickListener {
- val intent = Intent(Intent.ACTION_MANAGE_PERMISSION_APPS).apply {
- putExtra(Intent.EXTRA_PERMISSION_NAME, filterGroup)
+ val preference =
+ CarUiPreference(context).apply {
+ title = getString(R.string.manage_permission)
+ summary =
+ getString(
+ R.string.manage_permission_summary,
+ getPermGroupLabel(requireContext(), filterGroup))
+ onPreferenceClickListener =
+ Preference.OnPreferenceClickListener {
+ val intent =
+ Intent(Intent.ACTION_MANAGE_PERMISSION_APPS).apply {
+ putExtra(Intent.EXTRA_PERMISSION_NAME, filterGroup)
+ }
+ startActivity(intent)
+ true
+ }
+ }
+ preferenceScreen.addPreference(preference)
+ }
+
+ /** Render the provided [historyPreferenceDataList] into the [preferenceScreen] UI. */
+ fun renderHistoryPreferences(
+ historyPreferenceDataList: List<PermissionUsageDetailsViewModel.HistoryPreferenceData>,
+ category: AtomicReference<PreferenceCategory>,
+ preferenceScreen: PreferenceScreen,
+ ) {
+ var previousDateMs = 0L
+ historyPreferenceDataList.forEach {
+ val usageTimestamp = it.accessEndTime
+ val currentDateMs =
+ ZonedDateTime.ofInstant(
+ Instant.ofEpochMilli(usageTimestamp),
+ Clock.system(ZoneId.systemDefault()).zone)
+ .truncatedTo(ChronoUnit.DAYS)
+ .toEpochSecond() * 1000L
+ if (currentDateMs != previousDateMs) {
+ if (previousDateMs != 0L) {
+ category.set(PreferenceCategory(context))
+ preferenceScreen.addPreference(category.get())
}
- startActivity(intent)
- true
+ if (usageTimestamp > MIDNIGHT_TODAY) {
+ category.get().setTitle(R.string.permission_history_category_today)
+ } else if (usageTimestamp > MIDNIGHT_YESTERDAY) {
+ category.get().setTitle(R.string.permission_history_category_yesterday)
+ } else {
+ category
+ .get()
+ .setTitle(DateFormat.getDateFormat(context).format(currentDateMs))
+ }
+ previousDateMs = currentDateMs
}
+ category.get().addPreference(createPermissionHistoryPreference(it))
}
- preferenceScreen.addPreference(preference)
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt
index 323a13706..a4d1398b0 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageFragment.kt
@@ -31,15 +31,16 @@ import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.auto.AutoSettingsFrameFragment
-import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
-import com.android.permissioncontroller.permission.model.v31.PermissionUsages
-import com.android.permissioncontroller.permission.model.v31.PermissionUsages.PermissionsUsagesChangeCallback
import com.android.permissioncontroller.permission.model.legacy.PermissionApps.AppDataLoader
import com.android.permissioncontroller.permission.model.legacy.PermissionApps.PermissionApp
import com.android.permissioncontroller.permission.model.livedatatypes.PermGroupPackagesUiInfo
+import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
+import com.android.permissioncontroller.permission.model.v31.PermissionUsages
+import com.android.permissioncontroller.permission.model.v31.PermissionUsages.PermissionsUsagesChangeCallback
import com.android.permissioncontroller.permission.ui.model.ManagePermissionsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageControlPreferenceUtils
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel.PermissionGroupWithUsageCount
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModelFactory
import com.android.permissioncontroller.permission.utils.Utils
@@ -67,33 +68,32 @@ class AutoPermissionUsageFragment : AutoSettingsFrameFragment(), PermissionsUsag
private var finishedInitialLoad = false
private var hasSystemApps = false
- /** Unique Id of a request */
+ /** Unique Id of a request */
private var sessionId: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
headerLabel = getString(R.string.permission_usage_title)
- sessionId = savedInstanceState?.getLong(SESSION_ID_KEY)
- ?: (arguments?.getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID)
- ?: Constants.INVALID_SESSION_ID)
+ sessionId =
+ savedInstanceState?.getLong(SESSION_ID_KEY)
+ ?: (arguments?.getLong(Constants.EXTRA_SESSION_ID, Constants.INVALID_SESSION_ID)
+ ?: Constants.INVALID_SESSION_ID)
val context: Context = preferenceManager.getContext()
- permissionUsages =
- PermissionUsages(
- context
- )
+ permissionUsages = PermissionUsages(context)
val roleManager = Utils.getSystemServiceSafe(context, RoleManager::class.java)
val application: Application = requireActivity().getApplication()
- val managePermissionsViewModelFactory = ViewModelProvider.AndroidViewModelFactory
- .getInstance(application)
- managePermissionsViewModel = ViewModelProvider(this,
- managePermissionsViewModelFactory)[ManagePermissionsViewModel::class.java]
+ val managePermissionsViewModelFactory =
+ ViewModelProvider.AndroidViewModelFactory.getInstance(application)
+ managePermissionsViewModel =
+ ViewModelProvider(this, managePermissionsViewModelFactory)[
+ ManagePermissionsViewModel::class.java]
val usageViewModelFactory = PermissionUsageViewModelFactory(roleManager)
- usageViewModel = ViewModelProvider(this,
- usageViewModelFactory)[PermissionUsageViewModel::class.java]
+ usageViewModel =
+ ViewModelProvider(this, usageViewModelFactory)[PermissionUsageViewModel::class.java]
- managePermissionsViewModel.standardPermGroupsLiveData.observe(this,
- this::onPermissionGroupsChanged)
+ managePermissionsViewModel.standardPermGroupsLiveData.observe(
+ this, this::onPermissionGroupsChanged)
setLoading(true)
reloadData()
}
@@ -114,7 +114,9 @@ class AutoPermissionUsageFragment : AutoSettingsFrameFragment(), PermissionsUsag
private fun updateSystemToggle() {
if (!showSystem) {
- PermissionControllerStatsLog.write(PERMISSION_USAGE_FRAGMENT_INTERACTION, sessionId,
+ PermissionControllerStatsLog.write(
+ PERMISSION_USAGE_FRAGMENT_INTERACTION,
+ sessionId,
PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED)
}
showSystem = !showSystem
@@ -127,17 +129,16 @@ class AutoPermissionUsageFragment : AutoSettingsFrameFragment(), PermissionsUsag
setAction(null, null)
return
}
- val label = if (showSystem) {
- getString(R.string.menu_hide_system)
- } else {
- getString(R.string.menu_show_system)
- }
+ val label =
+ if (showSystem) {
+ getString(R.string.menu_hide_system)
+ } else {
+ getString(R.string.menu_show_system)
+ }
setAction(label) { updateSystemToggle() }
}
- /**
- * Reloads the data to show.
- */
+ /** Reloads the data to show. */
private fun reloadData() {
usageViewModel.loadPermissionUsages(
requireActivity().getLoaderManager(), permissionUsages, this)
@@ -160,56 +161,67 @@ class AutoPermissionUsageFragment : AutoSettingsFrameFragment(), PermissionsUsag
}
getPreferenceScreen().removeAll()
- val (usages, permApps, seenSystemApps) = usageViewModel.extractUsages(appPermissionUsages,
- show7Days, showSystem)
+ val permissionUsagesUiData =
+ usageViewModel.buildPermissionUsagesUiData(
+ appPermissionUsages, show7Days, showSystem, requireContext())
+ val permissionApps = permissionUsagesUiData.permissionApps
+ val displayShowSystemToggle = permissionUsagesUiData.displayShowSystemToggle
- if (hasSystemApps != seenSystemApps) {
- hasSystemApps = seenSystemApps
+ if (hasSystemApps != displayShowSystemToggle) {
+ hasSystemApps = displayShowSystemToggle
updateAction()
}
- val groupUsagesList: List<Map.Entry<String, Int>> = usageViewModel
- .createGroupUsagesList(requireContext(), usages)
+ val permissionGroupWithUsageCounts: List<PermissionGroupWithUsageCount> =
+ permissionUsagesUiData.orderedPermissionGroupsWithUsageCount
- addUIContent(groupUsagesList, permApps)
+ addUIContent(permissionGroupWithUsageCounts, permissionApps)
}
- /**
- * Use the usages and permApps that are previously constructed to add UI content to the page
- */
+ /** Use the usages and permApps that are previously constructed to add UI content to the page */
private fun addUIContent(
- usages: List<Map.Entry<String, Int>>,
+ permissionGroupWithUsageCounts:
+ List<PermissionGroupWithUsageCount>,
permApps: java.util.ArrayList<PermissionApp>
) {
AppDataLoader(context) {
- // Show permission groups with permissions granted to an app, including groups
- // where the permission is only granted to a system app. This still excludes groups
- // that don't have grants from any apps. Showing the same groups regardless of
- // whether showSystem is selected avoids permission groups hiding and appearing,
- // which is a confusing user experience.
- val usedPermissionGroups = permissionGroups
- .filter {
- (it.nonSystemUserSetOrPreGranted > 0) or
- (it.systemUserSetOrPreGranted > 0)
+ // Show permission groups with permissions granted to an app, including groups
+ // where the permission is only granted to a system app. This still excludes groups
+ // that don't have grants from any apps. Showing the same groups regardless of
+ // whether showSystem is selected avoids permission groups hiding and appearing,
+ // which is a confusing user experience.
+ val usedPermissionGroups =
+ permissionGroups
+ .filter {
+ (it.nonSystemUserSetOrPreGranted > 0) or
+ (it.systemUserSetOrPreGranted > 0)
+ }
+ .filterNot { it.onlyShellPackageGranted }
+
+ for (i in permissionGroupWithUsageCounts.indices) {
+ val groupName = permissionGroupWithUsageCounts[i].permGroup
+ val count = permissionGroupWithUsageCounts[i].appCount
+ if ((usedPermissionGroups.filter { it.name == groupName }).isEmpty()) {
+ continue
+ }
+ val permissionUsagePreference = CarUiPreference(requireContext())
+ PermissionUsageControlPreferenceUtils.initPreference(
+ permissionUsagePreference,
+ requireContext(),
+ groupName,
+ count,
+ showSystem,
+ sessionId,
+ show7Days)
+ getPreferenceScreen().addPreference(permissionUsagePreference)
}
- .filterNot { it.onlyShellPackageGranted }
-
- for (i in usages.indices) {
- val (groupName, count) = usages[i]
- if ((usedPermissionGroups.filter { it.name == groupName }).isEmpty()) {
- continue
+ finishedInitialLoad = true
+ setLoading(false)
+ val activity: Activity? = activity
+ if (activity != null) {
+ permissionUsages.stopLoader(activity.loaderManager)
}
- val permissionUsagePreference = CarUiPreference(requireContext())
- PermissionUsageControlPreferenceUtils.initPreference(permissionUsagePreference,
- requireContext(), groupName, count, showSystem, sessionId, show7Days)
- getPreferenceScreen().addPreference(permissionUsagePreference)
- }
- finishedInitialLoad = true
- setLoading(false)
- val activity: Activity? = activity
- if (activity != null) {
- permissionUsages.stopLoader(activity.loaderManager)
}
- }.execute(*permApps.toTypedArray())
+ .execute(*permApps.toTypedArray())
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
index 9bb49bed6..568d7f225 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
@@ -24,7 +24,6 @@ import static com.android.permissioncontroller.PermissionControllerStatsLog.APP_
import static com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSIONS_FRAGMENT_VIEWED__CATEGORY__DENIED;
import static com.android.permissioncontroller.hibernation.HibernationPolicyKt.isHibernationEnabled;
import static com.android.permissioncontroller.permission.ui.handheld.UtilsKt.pressBack;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.is7DayToggleEnabled;
import static java.util.concurrent.TimeUnit.DAYS;
@@ -183,7 +182,7 @@ public final class AppPermissionGroupsFragment extends SettingsWithLargeHeader i
Context context = getPreferenceManager().getContext();
mPermissionUsages = new PermissionUsages(context);
- long aggregateDataFilterBeginDays = is7DayToggleEnabled()
+ long aggregateDataFilterBeginDays = KotlinUtils.INSTANCE.is7DayToggleEnabled()
? AppPermissionGroupsViewModel.AGGREGATE_DATA_FILTER_BEGIN_DAYS_7 :
AppPermissionGroupsViewModel.AGGREGATE_DATA_FILTER_BEGIN_DAYS_1;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.kt
index 5d1d29df5..61bb65e9d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/GrantPermissionsViewHandlerImpl.kt
@@ -19,17 +19,7 @@ package com.android.permissioncontroller.permission.ui.handheld
import android.Manifest.permission.ACCESS_COARSE_LOCATION
import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.app.Activity
-import android.content.res.Configuration
-import android.graphics.Color
-import android.graphics.ImageDecoder
-import android.graphics.Paint
-import android.graphics.Path
-import android.graphics.PixelFormat
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffXfermode
import android.graphics.Typeface
-import android.graphics.drawable.AnimatedImageDrawable
-import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon
import android.os.Bundle
import android.text.method.LinkMovementMethod
@@ -50,6 +40,9 @@ import android.widget.LinearLayout
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
+import androidx.annotation.RawRes
+import com.airbnb.lottie.LottieCompositionFactory
+import com.airbnb.lottie.LottieDrawable
import com.android.modules.utils.build.SdkLevel
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.ALLOW_ALWAYS_BUTTON
@@ -87,7 +80,7 @@ class GrantPermissionsViewHandlerImpl(
private val LOCATION_ACCURACY_DIALOGS = listOf(DIALOG_WITH_BOTH_LOCATIONS,
DIALOG_WITH_FINE_LOCATION_ONLY, DIALOG_WITH_COARSE_LOCATION_ONLY)
private val LOCATION_ACCURACY_IMAGE_DIAMETER = mActivity.resources.getDimension(
- R.dimen.location_accuracy_image_size).toInt()
+ R.dimen.location_accuracy_image_size)
// Configuration of the current dialog
private var groupName: String? = null
@@ -102,10 +95,10 @@ class GrantPermissionsViewHandlerImpl(
private var isLocationPermissionDialogActionClicked: Boolean = false
private var coarseRadioButton: RadioButton? = null
private var fineRadioButton: RadioButton? = null
- private var coarseOffDrawable: AnimatedImageDrawable? = null
- private var coarseOnDrawable: AnimatedImageDrawable? = null
- private var fineOffDrawable: AnimatedImageDrawable? = null
- private var fineOnDrawable: AnimatedImageDrawable? = null
+ private var coarseOffDrawable: LottieDrawable? = null
+ private var coarseOnDrawable: LottieDrawable? = null
+ private var fineOffDrawable: LottieDrawable? = null
+ private var fineOnDrawable: LottieDrawable? = null
// Views
private var iconView: ImageView? = null
@@ -174,8 +167,8 @@ class GrantPermissionsViewHandlerImpl(
updateButtons()
updateLocationVisibilities()
- // Animate change in size
- // Grow or shrink the content container to size of new content
+ // Animate change in size
+ // Grow or shrink the content container to size of new content
val growShrinkToNewContentSize = ChangeBounds()
growShrinkToNewContentSize.duration = ANIMATION_DURATION_MILLIS
growShrinkToNewContentSize.interpolator = AnimationUtils.loadInterpolator(mActivity,
@@ -227,6 +220,7 @@ class GrantPermissionsViewHandlerImpl(
val locationView = rootView.findViewById<View>(LOCATION_RES_ID_TO_NUM.keyAt(i))
locationViews[LOCATION_RES_ID_TO_NUM.valueAt(i)] = locationView
}
+
initializeAnimatedImages()
// Set location accuracy radio buttons' click listeners
@@ -243,44 +237,26 @@ class GrantPermissionsViewHandlerImpl(
return rootView
}
- private fun initializeAnimatedImages() {
- val isDarkMode = (mActivity.resources.configuration.uiMode and
- Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
- val coarseOffDrawableId = if (isDarkMode) R.drawable.coarse_off_dark
- else R.drawable.coarse_off_light
- val coarseOnDrawableId = if (isDarkMode) R.drawable.coarse_on_dark
- else R.drawable.coarse_on_light
- val fineOffDrawableId = if (isDarkMode) R.drawable.fine_off_dark
- else R.drawable.fine_off_light
- val fineOnDrawableId = if (isDarkMode) R.drawable.fine_on_dark else R.drawable.fine_on_light
-
- coarseOffDrawable = getDrawableFromId(coarseOffDrawableId) as AnimatedImageDrawable
- coarseOnDrawable = getDrawableFromId(coarseOnDrawableId) as AnimatedImageDrawable
- fineOffDrawable = getDrawableFromId(fineOffDrawableId) as AnimatedImageDrawable
- fineOnDrawable = getDrawableFromId(fineOnDrawableId) as AnimatedImageDrawable
- }
-
- private fun getDrawableFromId(drawableId: Int): Drawable {
- val source = ImageDecoder.createSource(mActivity.resources, drawableId)
- return ImageDecoder.decodeDrawable(source) { decoder, _, _ ->
- decoder.setTargetSize(LOCATION_ACCURACY_IMAGE_DIAMETER,
- LOCATION_ACCURACY_IMAGE_DIAMETER)
- decoder.setPostProcessor { canvas ->
- // This will crop the image to circle image.
- val path = Path()
- path.fillType = Path.FillType.INVERSE_EVEN_ODD
- val width: Int = canvas.width
- val height: Int = canvas.height
- path.addRoundRect(0f, 0f, width.toFloat(), height.toFloat(),
- width.toFloat() / 2, height.toFloat() / 2, Path.Direction.CW)
- val paint = Paint()
- paint.isAntiAlias = true
- paint.color = Color.TRANSPARENT
- paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC)
- canvas.drawPath(path, paint)
- PixelFormat.TRANSLUCENT
+ private fun getLottieDrawable(@RawRes rawResId: Int): LottieDrawable {
+ val composition = LottieCompositionFactory.fromRawResSync(mActivity, rawResId).value!!
+ val scale = LOCATION_ACCURACY_IMAGE_DIAMETER / composition.bounds.width()
+ val drawable = object : LottieDrawable() {
+ override fun getIntrinsicHeight(): Int {
+ return (super.getIntrinsicHeight() * scale).toInt()
+ }
+ override fun getIntrinsicWidth(): Int {
+ return (super.getIntrinsicWidth() * scale).toInt()
}
}
+ drawable.composition = composition
+ return drawable
+ }
+
+ private fun initializeAnimatedImages() {
+ coarseOffDrawable = getLottieDrawable(R.raw.coarse_loc_off)
+ coarseOnDrawable = getLottieDrawable(R.raw.coarse_loc_on)
+ fineOffDrawable = getLottieDrawable(R.raw.fine_loc_off)
+ fineOnDrawable = getLottieDrawable(R.raw.fine_loc_on)
}
override fun updateWindowAttributes(outLayoutParams: LayoutParams) {
@@ -420,8 +396,8 @@ class GrantPermissionsViewHandlerImpl(
null, null)
fineRadioButton?.setCompoundDrawablesWithIntrinsicBounds(null, fineOffDrawable,
null, null)
- coarseOnDrawable?.start()
fineOffDrawable?.start()
+ coarseOnDrawable?.start()
coarseRadioButton?.setTypeface(null, Typeface.BOLD)
fineRadioButton?.setTypeface(null, Typeface.NORMAL)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
index 879e6082a..8e3192eee 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ManageStandardPermissionsFragment.java
@@ -20,7 +20,6 @@ import static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory;
import static com.android.permissioncontroller.Constants.EXTRA_SESSION_ID;
import static com.android.permissioncontroller.Constants.INVALID_SESSION_ID;
import static com.android.permissioncontroller.permission.ui.handheld.UtilsKt.pressBack;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.shouldShowPermissionsDashboard;
import android.app.Application;
import android.content.Intent;
@@ -39,6 +38,7 @@ import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity;
import com.android.permissioncontroller.permission.ui.UnusedAppsFragment;
import com.android.permissioncontroller.permission.ui.model.ManageStandardPermissionsViewModel;
+import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.permission.utils.StringUtils;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.settingslib.widget.FooterPreference;
@@ -77,6 +77,9 @@ public final class ManageStandardPermissionsFragment extends ManagePermissionsFr
mPermissionGroups = mViewModel.getUiDataLiveData().getValue();
mViewModel.getUiDataLiveData().observe(this, permissionGroups -> {
+ // Once we have loaded data for the first time, further loads should be staggered,
+ // for performance reasons.
+ mViewModel.getUiDataLiveData().setLoadStaggered(true);
if (permissionGroups != null) {
mPermissionGroups = permissionGroups;
updatePermissionsUi();
@@ -84,6 +87,11 @@ public final class ManageStandardPermissionsFragment extends ManagePermissionsFr
Log.e(LOG_TAG, "ViewModel returned null data, exiting");
getActivity().finishAfterTransition();
}
+
+ // If we've loaded all LiveDatas, no need to prioritize loading any particular one
+ if (!mViewModel.getUiDataLiveData().isStale()) {
+ mViewModel.getUiDataLiveData().setFirstLoadGroup(null);
+ }
});
mViewModel.getNumCustomPermGroups().observe(this, permNames -> updatePermissionsUi());
@@ -115,7 +123,7 @@ public final class ManageStandardPermissionsFragment extends ManagePermissionsFr
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
- if (shouldShowPermissionsDashboard()) {
+ if (KotlinUtils.INSTANCE.shouldShowPermissionsDashboard()) {
menu.add(Menu.NONE, MENU_PERMISSION_USAGE, Menu.NONE, R.string.permission_usage_title);
}
}
@@ -209,6 +217,9 @@ public final class ManageStandardPermissionsFragment extends ManagePermissionsFr
@Override
public void showPermissionApps(String permissionGroupName) {
+ // If we return to this page within a reasonable time, prioritize loading data from the
+ // permission group whose page we are going to, as that is group most likely to have changed
+ mViewModel.getUiDataLiveData().setFirstLoadGroup(permissionGroupName);
mViewModel.showPermissionApps(this, PermissionAppsFragment.createArgs(
permissionGroupName, getArguments().getLong(EXTRA_SESSION_ID)));
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
index 1d92a6e74..90d7204cf 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
@@ -22,7 +22,6 @@ import static com.android.permissioncontroller.permission.ui.Category.ALLOWED_FO
import static com.android.permissioncontroller.permission.ui.Category.ASK;
import static com.android.permissioncontroller.permission.ui.Category.DENIED;
import static com.android.permissioncontroller.permission.ui.handheld.UtilsKt.pressBack;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.shouldShowPermissionsDashboard;
import android.Manifest;
import android.app.ActionBar;
@@ -197,7 +196,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
updateMenu(mViewModel.getShouldShowSystemLiveData().getValue());
}
- if (shouldShowPermissionsDashboard()) {
+ if (KotlinUtils.INSTANCE.shouldShowPermissionsDashboard()) {
menu.add(Menu.NONE, MENU_PERMISSION_USAGE, Menu.NONE, R.string.permission_usage_title);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionControlPreference.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionControlPreference.java
index 31ef791b6..e7caefdc7 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionControlPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionControlPreference.java
@@ -44,6 +44,7 @@ import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.model.AppPermissionGroup;
import com.android.permissioncontroller.permission.ui.LocationProviderInterceptDialog;
import com.android.permissioncontroller.permission.utils.LocationUtils;
+import com.android.permissioncontroller.permission.utils.PermissionMapping;
import com.android.permissioncontroller.permission.utils.Utils;
import java.util.List;
@@ -221,6 +222,12 @@ public class PermissionControlPreference extends Preference {
Utils.navigateToAppNotificationSettings(mContext, mPackageName, mUser);
return true;
}
+ if (Utils.isHealthPermissionUiEnabled()
+ && mPermGroupName.equals(
+ PermissionMapping.getHealthPermissionGroupString())) {
+ // TODO(b/248358404): Redirect to the health connect UI.
+ return true;
+ }
Bundle args = new Bundle();
args.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
args.putString(Intent.EXTRA_PERMISSION_GROUP_NAME, mPermGroupName);
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionPreference.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionPreference.java
index 9569baeeb..658a82af5 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionPreference.java
@@ -36,10 +36,10 @@ import androidx.preference.PreferenceFragmentCompat;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionSummary;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionTarget;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.SummaryMessage;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionSummary;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionTarget;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.SummaryMessage;
import com.android.permissioncontroller.permission.utils.LocationUtils;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.settingslib.RestrictedLockUtils;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ReviewPermissionsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ReviewPermissionsFragment.java
index a6f74c822..5e5c221ae 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ReviewPermissionsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/ReviewPermissionsFragment.java
@@ -57,9 +57,9 @@ import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup;
import com.android.permissioncontroller.permission.model.livedatatypes.LightPermission;
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionViewModelFactory;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel;
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionTarget;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionViewModelFactory;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel;
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionTarget;
import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.permission.utils.Utils;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/DashboardUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/DashboardUtils.kt
index 19b19f620..5b92dd36d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/DashboardUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/DashboardUtils.kt
@@ -19,7 +19,6 @@ package com.android.permissioncontroller.permission.ui.handheld.v31
import android.content.Context
import android.icu.util.Calendar
import android.os.Build
-import android.provider.DeviceConfig
import android.text.format.DateFormat.getMediumDateFormat
import android.text.format.DateFormat.getTimeFormat
import android.util.Pair
@@ -30,58 +29,12 @@ import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage.
import com.android.permissioncontroller.permission.utils.StringUtils
import java.util.Locale
-/** Whether to show the Permissions Hub. */
-private const val PROPERTY_PERMISSIONS_HUB_2_ENABLED = "permissions_hub_2_enabled"
-
-/** Whether to show the mic and camera icons. */
-const val PROPERTY_CAMERA_MIC_ICONS_ENABLED = "camera_mic_icons_enabled"
-
-/** Whether to show the location indicators. */
-const val PROPERTY_LOCATION_INDICATORS_ENABLED = "location_indicators_enabled"
-
-/* Whether location accuracy feature is enabled */
-const val PROPERTY_LOCATION_ACCURACY_ENABLED = "location_accuracy_enabled"
-
-/** Whether to show 7-day toggle in privacy hub. */
-private const val PRIVACY_DASHBOARD_7_DAY_TOGGLE = "privacy_dashboard_7_day_toggle"
-
-/* Default location precision */
-const val PROPERTY_LOCATION_PRECISION = "location_precision"
-
const val SECONDS = 1
const val MINUTES = 2
const val HOURS = 3
const val DAYS = 4
/**
- * Whether the Permissions Hub 2 flag is enabled
- *
- * @return whether the flag is enabled
- */
-fun isPermissionsHub2FlagEnabled(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_PERMISSIONS_HUB_2_ENABLED, false)
-}
-/**
- * Whether to show the Permissions Dashboard
- *
- * @return whether to show the Permissions Dashboard.
- */
-fun shouldShowPermissionsDashboard(): Boolean {
- return isPermissionsHub2FlagEnabled()
-}
-
-/**
- * Whether we should enable the 7-day toggle in privacy dashboard
- *
- * @return whether the flag is enabled
- */
-fun is7DayToggleEnabled(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PRIVACY_DASHBOARD_7_DAY_TOGGLE, false)
-}
-
-/**
* Whether to show the subattribution in the Permissions Dashboard
*
* @return whether to show subattribution in the Permissions Dashboard.
@@ -91,62 +44,6 @@ fun shouldShowSubattributionInPermissionsDashboard(): Boolean {
}
/**
- * Whether the Camera and Mic Icons are enabled by flag.
- *
- * @return whether the Camera and Mic Icons are enabled.
- */
-fun isCameraMicIconsFlagEnabled(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_CAMERA_MIC_ICONS_ENABLED, true)
-}
-
-/**
- * Whether to show Camera and Mic Icons. They should be shown if the permission hub, or the icons
- * specifically, are enabled.
- *
- * @return whether to show the icons.
- */
-fun shouldShowCameraMicIndicators(): Boolean {
- return isCameraMicIconsFlagEnabled() || isPermissionsHub2FlagEnabled()
-}
-
-/**
- * Whether the location indicators are enabled by flag.
- *
- * @return whether the location indicators are enabled by flag.
- */
-fun isLocationIndicatorsFlagEnabled(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_LOCATION_INDICATORS_ENABLED, false)
-}
-
-/**
- * Whether to show the location indicators. The location indicators are enable if the
- * permission hub, or location indicator specifically are enabled.
- */
-fun shouldShowLocationIndicators(): Boolean {
- return isLocationIndicatorsFlagEnabled() || isPermissionsHub2FlagEnabled()
-}
-
-/**
- * Whether the location accuracy feature is enabled
- */
-fun isLocationAccuracyEnabled(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_LOCATION_ACCURACY_ENABLED, true)
-}
-
-/**
- * Default state of location precision
- * true: default is FINE.
- * false: default is COARSE.
- */
-fun getDefaultPrecision(): Boolean {
- return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_LOCATION_PRECISION, true)
-}
-
-/**
* Build a string representing the given time if it happened on the current day and the date
* otherwise.
*
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionDetailsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionDetailsFragment.java
index 9556d1590..5b24bc316 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionDetailsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionDetailsFragment.java
@@ -18,7 +18,6 @@ package com.android.permissioncontroller.permission.ui.handheld.v31;
import static com.android.permissioncontroller.Constants.EXTRA_SESSION_ID;
import static com.android.permissioncontroller.Constants.INVALID_SESSION_ID;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.is7DayToggleEnabled;
import android.app.ActionBar;
import android.app.Activity;
@@ -30,6 +29,7 @@ import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
+import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -61,31 +61,40 @@ import com.android.permissioncontroller.permission.utils.Utils;
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-/**
- * The permission details page showing the history/timeline of a permission
- */
+/** The permission details page showing the history/timeline of a permission */
@RequiresApi(Build.VERSION_CODES.S)
-public class PermissionDetailsFragment extends SettingsWithLargeHeader implements
- PermissionUsages.PermissionsUsagesChangeCallback {
+public class PermissionDetailsFragment extends SettingsWithLargeHeader
+ implements PermissionUsages.PermissionsUsagesChangeCallback {
public static final int FILTER_7_DAYS = 1;
private static final String KEY_SHOW_SYSTEM_PREFS = "_show_system";
- private static final String SHOW_SYSTEM_KEY = PermissionDetailsFragment.class.getName()
- + KEY_SHOW_SYSTEM_PREFS;
+ private static final String SHOW_SYSTEM_KEY =
+ PermissionDetailsFragment.class.getName() + KEY_SHOW_SYSTEM_PREFS;
private static final String KEY_SESSION_ID = "_session_id";
- private static final String SESSION_ID_KEY = PermissionDetailsFragment.class.getName()
- + KEY_SESSION_ID;
+ private static final String SESSION_ID_KEY =
+ PermissionDetailsFragment.class.getName() + KEY_SESSION_ID;
private static final int MENU_SHOW_7_DAYS_DATA = Menu.FIRST + 4;
private static final int MENU_SHOW_24_HOURS_DATA = Menu.FIRST + 5;
-
+ private static final long MIDNIGHT_TODAY =
+ ZonedDateTime.now(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toEpochSecond()
+ * 1000L;
+ private static final long MIDNIGHT_YESTERDAY =
+ ZonedDateTime.now(ZoneId.systemDefault())
+ .minusDays(1)
+ .truncatedTo(ChronoUnit.DAYS)
+ .toEpochSecond()
+ * 1000L;
private @Nullable String mFilterGroup;
private int mFilterTimeIndex;
private @Nullable List<AppPermissionUsage> mAppPermissionUsages = new ArrayList<>();
@@ -117,10 +126,12 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
mShowSystem = savedInstanceState.getBoolean(SHOW_SYSTEM_KEY);
mSessionId = savedInstanceState.getLong(SESSION_ID_KEY);
} else {
- mShowSystem = getArguments().getBoolean(
- ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, false);
- mShow7Days = is7DayToggleEnabled() && getArguments().getBoolean(
- ManagePermissionsActivity.EXTRA_SHOW_7_DAYS, false);
+ mShowSystem =
+ getArguments().getBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, false);
+ mShow7Days =
+ KotlinUtils.INSTANCE.is7DayToggleEnabled()
+ && getArguments()
+ .getBoolean(ManagePermissionsActivity.EXTRA_SHOW_7_DAYS, false);
mSessionId = getArguments().getLong(EXTRA_SESSION_ID, INVALID_SESSION_ID);
}
@@ -139,51 +150,63 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
mPermissionUsages = new PermissionUsages(context);
mRoleManager = Utils.getSystemServiceSafe(context, RoleManager.class);
- PermissionUsageDetailsViewModelFactory factory = new PermissionUsageDetailsViewModelFactory(
- PermissionControllerApplication.get(), mRoleManager, mFilterGroup, mSessionId);
- mViewModel = new ViewModelProvider(this, factory).get(
- PermissionUsageDetailsViewModel.class);
+ PermissionUsageDetailsViewModelFactory factory =
+ new PermissionUsageDetailsViewModelFactory(
+ PermissionControllerApplication.get(),
+ mRoleManager,
+ mFilterGroup,
+ mSessionId);
+ mViewModel =
+ new ViewModelProvider(this, factory).get(PermissionUsageDetailsViewModel.class);
reloadData();
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- ViewGroup rootView = (ViewGroup) super.onCreateView(inflater, container,
- savedInstanceState);
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ ViewGroup rootView =
+ (ViewGroup) super.onCreateView(inflater, container, savedInstanceState);
- PermissionDetailsWrapperFragment parentFragment = (PermissionDetailsWrapperFragment)
- requireParentFragment();
+ PermissionDetailsWrapperFragment parentFragment =
+ (PermissionDetailsWrapperFragment) requireParentFragment();
CoordinatorLayout coordinatorLayout = parentFragment.getCoordinatorLayout();
inflater.inflate(R.layout.permission_details_extended_fab, coordinatorLayout);
- ExtendedFloatingActionButton extendedFab = coordinatorLayout.requireViewById(
- R.id.extended_fab);
+ ExtendedFloatingActionButton extendedFab =
+ coordinatorLayout.requireViewById(R.id.extended_fab);
// Load the background tint color from the application theme
// rather than the Material Design theme
Activity activity = getActivity();
- ColorStateList backgroundColor = activity.getColorStateList(
- android.R.color.system_accent3_100);
+ ColorStateList backgroundColor =
+ activity.getColorStateList(android.R.color.system_accent3_100);
extendedFab.setBackgroundTintList(backgroundColor);
extendedFab.setText(R.string.manage_permission);
- boolean isUiModeNight = (activity.getResources().getConfiguration().uiMode
- & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
- int textColorAttr = isUiModeNight ? android.R.attr.textColorPrimaryInverse
- : android.R.attr.textColorPrimary;
- TypedArray typedArray = activity.obtainStyledAttributes(new int[] { textColorAttr });
+ boolean isUiModeNight =
+ (activity.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK)
+ == Configuration.UI_MODE_NIGHT_YES;
+ int textColorAttr =
+ isUiModeNight
+ ? android.R.attr.textColorPrimaryInverse
+ : android.R.attr.textColorPrimary;
+ TypedArray typedArray = activity.obtainStyledAttributes(new int[] {textColorAttr});
ColorStateList textColor = typedArray.getColorStateList(0);
typedArray.recycle();
extendedFab.setTextColor(textColor);
extendedFab.setIcon(activity.getDrawable(R.drawable.ic_settings_outline));
extendedFab.setVisibility(View.VISIBLE);
- extendedFab.setOnClickListener(view -> {
- Intent intent = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
- .putExtra(Intent.EXTRA_PERMISSION_NAME, mFilterGroup);
- startActivity(intent);
- });
+ extendedFab.setOnClickListener(
+ view -> {
+ Intent intent =
+ new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS)
+ .putExtra(Intent.EXTRA_PERMISSION_NAME, mFilterGroup);
+ startActivity(intent);
+ });
RecyclerView recyclerView = getListView();
- int bottomPadding = getResources()
- .getDimensionPixelSize(R.dimen.privhub_details_recycler_view_bottom_padding);
+ int bottomPadding =
+ getResources()
+ .getDimensionPixelSize(
+ R.dimen.privhub_details_recycler_view_bottom_padding);
recyclerView.setPadding(0, 0, 0, bottomPadding);
recyclerView.setClipToPadding(false);
recyclerView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
@@ -196,8 +219,12 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
super.onStart();
CharSequence title = getString(R.string.permission_history_title);
if (mFilterGroup != null) {
- title = getResources().getString(R.string.permission_group_usage_title,
- KotlinUtils.INSTANCE.getPermGroupLabel(getActivity(), mFilterGroup));
+ title =
+ getResources()
+ .getString(
+ R.string.permission_group_usage_title,
+ KotlinUtils.INSTANCE.getPermGroupLabel(
+ getActivity(), mFilterGroup));
}
getActivity().setTitle(title);
}
@@ -210,7 +237,7 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
mAppPermissionUsages = new ArrayList<>(mPermissionUsages.getUsages());
// Ensure the group name is valid.
- if (mViewModel.getGroup(mFilterGroup, mAppPermissionUsages) == null) {
+ if (!mViewModel.containsPlatformAppPermissionGroup(mAppPermissionUsages, mFilterGroup)) {
mFilterGroup = null;
}
@@ -226,15 +253,23 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
- R.string.menu_show_system);
- mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE,
- R.string.menu_hide_system);
- if (is7DayToggleEnabled()) {
- mShow7DaysDataMenu = menu.add(Menu.NONE, MENU_SHOW_7_DAYS_DATA, Menu.NONE,
- R.string.menu_show_7_days_data);
- mShow24HoursDataMenu = menu.add(Menu.NONE, MENU_SHOW_24_HOURS_DATA, Menu.NONE,
- R.string.menu_show_24_hours_data);
+ mShowSystemMenu =
+ menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE, R.string.menu_show_system);
+ mHideSystemMenu =
+ menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE, R.string.menu_hide_system);
+ if (KotlinUtils.INSTANCE.is7DayToggleEnabled()) {
+ mShow7DaysDataMenu =
+ menu.add(
+ Menu.NONE,
+ MENU_SHOW_7_DAYS_DATA,
+ Menu.NONE,
+ R.string.menu_show_7_days_data);
+ mShow24HoursDataMenu =
+ menu.add(
+ Menu.NONE,
+ MENU_SHOW_24_HOURS_DATA,
+ Menu.NONE,
+ R.string.menu_show_24_hours_data);
}
updateMenu();
@@ -280,7 +315,8 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
break;
case MENU_SHOW_7_DAYS_DATA:
case MENU_SHOW_24_HOURS_DATA:
- mShow7Days = is7DayToggleEnabled() && itemId == MENU_SHOW_7_DAYS_DATA;
+ mShow7Days = KotlinUtils.INSTANCE.is7DayToggleEnabled()
+ && itemId == MENU_SHOW_7_DAYS_DATA;
updateUI();
updateMenu();
break;
@@ -301,94 +337,125 @@ public class PermissionDetailsFragment extends SettingsWithLargeHeader implement
}
screen.removeAll();
- Set<String> exemptedPackages = Utils.getExemptedPackages(mRoleManager);
-
Preference subtitlePreference = new Preference(context);
- int usageSubtitle = mShow7Days
- ? R.string.permission_group_usage_subtitle_7d
- : R.string.permission_group_usage_subtitle_24h;
+ int usageSubtitle =
+ mShow7Days
+ ? R.string.permission_group_usage_subtitle_7d
+ : R.string.permission_group_usage_subtitle_24h;
subtitlePreference.setSummary(
- getResources().getString(usageSubtitle,
- KotlinUtils.INSTANCE.getPermGroupLabel(getActivity(), mFilterGroup)));
+ getResources()
+ .getString(
+ usageSubtitle,
+ KotlinUtils.INSTANCE.getPermGroupLabel(
+ getActivity(), mFilterGroup)));
subtitlePreference.setSelectable(false);
screen.addPreference(subtitlePreference);
- AtomicBoolean seenSystemApp = new AtomicBoolean(false);
+ PermissionUsageDetailsViewModel.PermissionUsageDetailsUiData uiData =
+ mViewModel.buildPermissionUsageDetailsUiData(
+ mAppPermissionUsages, mShowSystem, mShow7Days);
- ArrayList<PermissionApps.PermissionApp> permApps = new ArrayList<>();
- List<PermissionUsageDetailsViewModel.AppPermissionUsageEntry> usages =
- mViewModel.parseUsages(mAppPermissionUsages, exemptedPackages, permApps,
- seenSystemApp, mShowSystem, mShow7Days);
+ boolean seenSystemApp = uiData.getShouldDisplayShowSystemToggle();
+ List<PermissionApps.PermissionApp> permissionApps = uiData.getPermissionApps();
- if (mHasSystemApps != seenSystemApp.get()) {
- mHasSystemApps = seenSystemApp.get();
+ if (mHasSystemApps != seenSystemApp) {
+ mHasSystemApps = seenSystemApp;
getActivity().invalidateOptionsMenu();
}
// Make these variables effectively final so that
// we can use these captured variables in the below lambda expression
- PreferenceFactory preferenceFactory = new PreferenceFactory(requireActivity());
- AtomicReference<PreferenceCategory> category = new AtomicReference<>(
- preferenceFactory.createDayCategoryPreference());
+ AtomicReference<PreferenceCategory> category =
+ new AtomicReference<>(createDayCategoryPreference());
screen.addPreference(category.get());
PreferenceScreen finalScreen = screen;
- new PermissionApps.AppDataLoader(context, () -> {
- if (getActivity() == null) {
- // Fragment has no Activity, return.
- return;
- }
- mViewModel.renderTimelinePreferences(usages, category, finalScreen, preferenceFactory);
-
- setLoading(false, true);
- mFinishedInitialLoad = true;
- setProgressBarVisible(false);
- mPermissionUsages.stopLoader(getActivity().getLoaderManager());
-
- }).execute(permApps.toArray(new PermissionApps.PermissionApp[permApps.size()]));
+ new PermissionApps.AppDataLoader(
+ context,
+ () -> {
+ if (getActivity() == null) {
+ // Fragment has no Activity, return.
+ return;
+ }
+ renderHistoryPreferences(
+ uiData.getHistoryPreferenceDataList(), category, finalScreen);
+
+ setLoading(false, true);
+ mFinishedInitialLoad = true;
+ setProgressBarVisible(false);
+ mPermissionUsages.stopLoader(getActivity().getLoaderManager());
+ })
+ .execute(
+ permissionApps.toArray(
+ new PermissionApps.PermissionApp[permissionApps.size()]));
}
- private static class PreferenceFactory implements
- PermissionUsageDetailsViewModel.HistoryPreferenceFactory {
-
- private Context mContext;
-
- PreferenceFactory(Context context) {
- mContext = context;
- }
+ /** Render the provided [historyPreferenceDataList] into the [preferenceScreen] UI. */
+ private void renderHistoryPreferences(
+ List<PermissionUsageDetailsViewModel.HistoryPreferenceData> historyPreferenceDataList,
+ AtomicReference<PreferenceCategory> category,
+ PreferenceScreen preferenceScreen) {
+ Context context = getContext();
+ long previousDateMs = 0L;
+ for (int i = 0; i < historyPreferenceDataList.size(); i++) {
+ PermissionUsageDetailsViewModel.HistoryPreferenceData historyPreferenceData =
+ historyPreferenceDataList.get(i);
+ long accessEndTime = historyPreferenceData.getAccessEndTime();
+ long currentDateMs =
+ ZonedDateTime.ofInstant(
+ Instant.ofEpochMilli(accessEndTime),
+ Clock.system(ZoneId.systemDefault()).getZone())
+ .truncatedTo(ChronoUnit.DAYS)
+ .toEpochSecond()
+ * 1000L;
+ if (currentDateMs != previousDateMs) {
+ if (previousDateMs != 0L) {
+ category.set(createDayCategoryPreference());
+ preferenceScreen.addPreference(category.get());
+ }
+ if (accessEndTime > MIDNIGHT_TODAY) {
+ category.get().setTitle(R.string.permission_history_category_today);
+ } else if (accessEndTime > MIDNIGHT_YESTERDAY) {
+ category.get().setTitle(R.string.permission_history_category_yesterday);
+ } else {
+ category.get()
+ .setTitle(DateFormat.getDateFormat(context).format(currentDateMs));
+ }
+ previousDateMs = currentDateMs;
+ }
- @Override
- public PreferenceCategory createDayCategoryPreference() {
- PreferenceCategory category = new PreferenceCategory(mContext);
- // Do not reserve icon space, so that the text moves all the way left.
- category.setIconSpaceReserved(false);
- return category;
+ Preference permissionUsagePreference =
+ new PermissionHistoryPreference(
+ getContext(),
+ historyPreferenceData.getUserHandle(),
+ historyPreferenceData.getPkgName(),
+ historyPreferenceData.getAppIcon(),
+ historyPreferenceData.getPreferenceTitle(),
+ historyPreferenceData.getPermissionGroup(),
+ DateFormat.getTimeFormat(getContext())
+ .format(historyPreferenceData.getAccessEndTime()),
+ historyPreferenceData.getSummaryText(),
+ historyPreferenceData.getShowingAttribution(),
+ historyPreferenceData.getAccessTimeList(),
+ historyPreferenceData.getAttributionTags(),
+ i == historyPreferenceDataList.size() - 1,
+ historyPreferenceData.getSessionId());
+
+ category.get().addPreference(permissionUsagePreference);
}
+ }
- @Override
- public Preference createPermissionHistoryPreference(
- PermissionUsageDetailsViewModel.HistoryPreferenceData historyPreferenceData) {
- return new PermissionHistoryPreference(mContext,
- historyPreferenceData.getUserHandle(),
- historyPreferenceData.getPkgName(),
- historyPreferenceData.getAppIcon(),
- historyPreferenceData.getPreferenceTitle(),
- historyPreferenceData.getPermissionGroup(),
- historyPreferenceData.getAccessTime(),
- historyPreferenceData.getSummaryText(),
- historyPreferenceData.getShowingAttribution(),
- historyPreferenceData.getAccessTimeList(),
- historyPreferenceData.getAttributionTags(),
- historyPreferenceData.isLastUsage(),
- historyPreferenceData.getSessionId()
- );
- }
+ private PreferenceCategory createDayCategoryPreference() {
+ PreferenceCategory category = new PreferenceCategory(getContext());
+ // Do not reserve icon space, so that the text moves all the way left.
+ category.setIconSpaceReserved(false);
+ return category;
}
private void reloadData() {
- mViewModel.loadPermissionUsages(getActivity().getLoaderManager(),
- mPermissionUsages, this, mFilterTimeIndex);
+ mViewModel.loadPermissionUsages(
+ getActivity().getLoaderManager(), mPermissionUsages, this, mFilterTimeIndex);
if (mFinishedInitialLoad) {
setProgressBarVisible(true);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageV2Fragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageV2Fragment.java
index 46f016455..9c60b074d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageV2Fragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageV2Fragment.java
@@ -22,7 +22,6 @@ import static com.android.permissioncontroller.PermissionControllerStatsLog.PERM
import static com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SEE_OTHER_PERMISSIONS_CLICKED;
import static com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED;
import static com.android.permissioncontroller.PermissionControllerStatsLog.write;
-import static com.android.permissioncontroller.permission.ui.handheld.v31.DashboardUtilsKt.is7DayToggleEnabled;
import android.app.ActionBar;
import android.app.Activity;
@@ -45,28 +44,26 @@ import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView;
import com.android.permissioncontroller.R;
+import com.android.permissioncontroller.permission.model.legacy.PermissionApps;
import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage;
import com.android.permissioncontroller.permission.model.v31.PermissionUsages;
-import com.android.permissioncontroller.permission.model.legacy.PermissionApps;
import com.android.permissioncontroller.permission.ui.handheld.SettingsWithLargeHeader;
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel;
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel.PermissionGroupWithUsageCount;
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModelFactory;
import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.settingslib.HelpUtils;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import kotlin.Triple;
-
-/**
- * The main page for the privacy dashboard.
- */
+/** The main page for the privacy dashboard. */
@RequiresApi(Build.VERSION_CODES.S)
-public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implements
- PermissionUsages.PermissionsUsagesChangeCallback {
+public class PermissionUsageV2Fragment extends SettingsWithLargeHeader
+ implements PermissionUsages.PermissionsUsagesChangeCallback {
// Pie chart in this screen will be the first child.
// Hence we use PERMISSION_GROUP_ORDER + 1 here.
@@ -75,15 +72,15 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
private static final int EXPAND_BUTTON_ORDER = 999;
private static final String KEY_SESSION_ID = "_session_id";
- private static final String SESSION_ID_KEY = PermissionUsageV2Fragment.class.getName()
- + KEY_SESSION_ID;
+ private static final String SESSION_ID_KEY =
+ PermissionUsageV2Fragment.class.getName() + KEY_SESSION_ID;
private static final int MENU_SHOW_7_DAYS_DATA = Menu.FIRST + 4;
private static final int MENU_SHOW_24_HOURS_DATA = Menu.FIRST + 5;
private static final int MENU_REFRESH = Menu.FIRST + 6;
- private @NonNull PermissionUsages mPermissionUsages;
- private @Nullable List<AppPermissionUsage> mAppPermissionUsages = new ArrayList<>();
+ @NonNull private PermissionUsages mPermissionUsages;
+ @Nullable private List<AppPermissionUsage> mAppPermissionUsages = new ArrayList<>();
private PermissionUsageViewModel mViewModel;
@@ -98,7 +95,7 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
private boolean mFinishedInitialLoad;
- private @NonNull RoleManager mRoleManager;
+ @NonNull private RoleManager mRoleManager;
private PermissionUsageGraphicPreference mGraphic;
@@ -148,39 +145,40 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
PreferenceGroupAdapter adapter =
(PreferenceGroupAdapter) super.onCreateAdapter(preferenceScreen);
- adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
- @Override
- public void onChanged() {
- updatePreferenceScreenAdvancedTitleAndSummary(preferenceScreen, adapter);
- }
-
- @Override
- public void onItemRangeInserted(int positionStart, int itemCount) {
- onChanged();
- }
-
- @Override
- public void onItemRangeRemoved(int positionStart, int itemCount) {
- onChanged();
- }
-
- @Override
- public void onItemRangeChanged(int positionStart, int itemCount) {
- onChanged();
- }
-
- @Override
- public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
- onChanged();
- }
- });
+ adapter.registerAdapterDataObserver(
+ new RecyclerView.AdapterDataObserver() {
+ @Override
+ public void onChanged() {
+ updatePreferenceScreenAdvancedTitleAndSummary(preferenceScreen, adapter);
+ }
+
+ @Override
+ public void onItemRangeInserted(int positionStart, int itemCount) {
+ onChanged();
+ }
+
+ @Override
+ public void onItemRangeRemoved(int positionStart, int itemCount) {
+ onChanged();
+ }
+
+ @Override
+ public void onItemRangeChanged(int positionStart, int itemCount) {
+ onChanged();
+ }
+
+ @Override
+ public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
+ onChanged();
+ }
+ });
updatePreferenceScreenAdvancedTitleAndSummary(preferenceScreen, adapter);
return adapter;
}
- private void updatePreferenceScreenAdvancedTitleAndSummary(PreferenceScreen preferenceScreen,
- PreferenceGroupAdapter adapter) {
+ private void updatePreferenceScreenAdvancedTitleAndSummary(
+ PreferenceScreen preferenceScreen, PreferenceGroupAdapter adapter) {
int count = adapter.getItemCount();
if (count == 0) {
return;
@@ -215,23 +213,31 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if (mHasSystemApps) {
- mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
- R.string.menu_show_system);
- mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE,
- R.string.menu_hide_system);
+ mShowSystemMenu =
+ menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE, R.string.menu_show_system);
+ mHideSystemMenu =
+ menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE, R.string.menu_hide_system);
}
- if (is7DayToggleEnabled()) {
- mShow7DaysDataMenu = menu.add(Menu.NONE, MENU_SHOW_7_DAYS_DATA, Menu.NONE,
- R.string.menu_show_7_days_data);
- mShow24HoursDataMenu = menu.add(Menu.NONE, MENU_SHOW_24_HOURS_DATA, Menu.NONE,
- R.string.menu_show_24_hours_data);
+ if (KotlinUtils.INSTANCE.is7DayToggleEnabled()) {
+ mShow7DaysDataMenu =
+ menu.add(
+ Menu.NONE,
+ MENU_SHOW_7_DAYS_DATA,
+ Menu.NONE,
+ R.string.menu_show_7_days_data);
+ mShow24HoursDataMenu =
+ menu.add(
+ Menu.NONE,
+ MENU_SHOW_24_HOURS_DATA,
+ Menu.NONE,
+ R.string.menu_show_24_hours_data);
}
- HelpUtils.prepareHelpMenuItem(getActivity(), menu, R.string.help_permission_usage,
- getClass().getName());
- MenuItem refresh = menu.add(Menu.NONE, MENU_REFRESH, Menu.NONE,
- R.string.permission_usage_refresh);
+ HelpUtils.prepareHelpMenuItem(
+ getActivity(), menu, R.string.help_permission_usage, getClass().getName());
+ MenuItem refresh =
+ menu.add(Menu.NONE, MENU_REFRESH, Menu.NONE, R.string.permission_usage_refresh);
refresh.setIcon(R.drawable.ic_refresh);
refresh.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
updateMenu();
@@ -245,7 +251,9 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
getActivity().finishAfterTransition();
return true;
case MENU_SHOW_SYSTEM:
- write(PERMISSION_USAGE_FRAGMENT_INTERACTION, mSessionId,
+ write(
+ PERMISSION_USAGE_FRAGMENT_INTERACTION,
+ mSessionId,
PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SHOW_SYSTEM_CLICKED);
// fall through
case MENU_HIDE_SYSTEM:
@@ -256,7 +264,8 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
break;
case MENU_SHOW_7_DAYS_DATA:
case MENU_SHOW_24_HOURS_DATA:
- mShow7Days = is7DayToggleEnabled() && itemId == MENU_SHOW_7_DAYS_DATA;
+ mShow7Days = KotlinUtils.INSTANCE.is7DayToggleEnabled()
+ && itemId == MENU_SHOW_7_DAYS_DATA;
updateUI();
updateMenu();
break;
@@ -328,83 +337,116 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SEE_OTHER_PERMISSIONS_CLICKED);
});
- Triple<Map<String, Integer>, ArrayList<PermissionApps.PermissionApp>, Boolean>
- triple = mViewModel.extractUsages(mAppPermissionUsages, mShow7Days, mShowSystem);
- Map<String, Integer> usages = triple.getFirst();
- ArrayList<PermissionApps.PermissionApp> permApps = triple.getSecond();
- boolean seenSystemApp = triple.getThird();
-
- if (mHasSystemApps != seenSystemApp) {
- mHasSystemApps = seenSystemApp;
+ PermissionUsageViewModel.PermissionUsagesUiData permissionUsageUiData =
+ mViewModel.buildPermissionUsagesUiData(
+ mAppPermissionUsages, mShow7Days, mShowSystem, getContext());
+ ArrayList<PermissionApps.PermissionApp> permissionApps =
+ permissionUsageUiData.getPermissionApps();
+ boolean displayShowSystemToggle = permissionUsageUiData.getDisplayShowSystemToggle();
+ List<PermissionUsageViewModel.PermissionGroupWithUsageCount>
+ orderedPermissionGroupsWithUsageCount =
+ permissionUsageUiData.getOrderedPermissionGroupsWithUsageCount();
+
+ if (mHasSystemApps != displayShowSystemToggle) {
+ mHasSystemApps = displayShowSystemToggle;
getActivity().invalidateOptionsMenu();
}
mGraphic = new PermissionUsageGraphicPreference(context, mShow7Days);
screen.addPreference(mGraphic);
- mGraphic.setUsages(usages);
+
+
+ Map<String, Integer> permissionGroupUsageCounts = new HashMap<>();
+ for (PermissionGroupWithUsageCount groupWithUsage: orderedPermissionGroupsWithUsageCount) {
+ permissionGroupUsageCounts.put(groupWithUsage.getPermGroup(),
+ groupWithUsage.getAppCount());
+ }
+ mGraphic.setUsages(permissionGroupUsageCounts);
// Add the preference header.
PreferenceCategory category = new PreferenceCategory(context);
screen.addPreference(category);
- List<Map.Entry<String, Integer>> groupUsagesList = mViewModel.createGroupUsagesList(
- getContext(), usages);
-
- CharSequence advancedInfoSummary = getAdvancedInfoSummaryString(context, groupUsagesList);
+ CharSequence advancedInfoSummary =
+ getAdvancedInfoSummaryString(context, orderedPermissionGroupsWithUsageCount);
screen.setSummary(advancedInfoSummary);
- addUIContent(context, groupUsagesList, permApps, category);
+ addUIContent(context, orderedPermissionGroupsWithUsageCount, permissionApps, category);
}
- private CharSequence getAdvancedInfoSummaryString(Context context,
- List<Map.Entry<String, Integer>> groupUsagesList) {
- int size = groupUsagesList.size();
+ private CharSequence getAdvancedInfoSummaryString(
+ Context context,
+ List<PermissionUsageViewModel.PermissionGroupWithUsageCount>
+ permissionGroupWithUsageCounts) {
+ int size = permissionGroupWithUsageCounts.size();
if (size <= PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1) {
return "";
}
// case for 1 extra item in the advanced info
if (size == PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT) {
- String permGroupName = groupUsagesList
- .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1).getKey();
+ String permGroupName =
+ permissionGroupWithUsageCounts
+ .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1)
+ .getPermGroup();
return KotlinUtils.INSTANCE.getPermGroupLabel(context, permGroupName);
}
- String permGroupName1 = groupUsagesList
- .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1).getKey();
- String permGroupName2 = groupUsagesList
- .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT).getKey();
- CharSequence permGroupLabel1 = KotlinUtils
- .INSTANCE.getPermGroupLabel(context, permGroupName1);
- CharSequence permGroupLabel2 = KotlinUtils
- .INSTANCE.getPermGroupLabel(context, permGroupName2);
+ String permGroupName1 =
+ permissionGroupWithUsageCounts
+ .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1)
+ .getPermGroup();
+ String permGroupName2 =
+ permissionGroupWithUsageCounts
+ .get(PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT)
+ .getPermGroup();
+ CharSequence permGroupLabel1 =
+ KotlinUtils.INSTANCE.getPermGroupLabel(context, permGroupName1);
+ CharSequence permGroupLabel2 =
+ KotlinUtils.INSTANCE.getPermGroupLabel(context, permGroupName2);
// case for 2 extra items in the advanced info
if (size == PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT + 1) {
- return context.getResources().getString(R.string.perm_usage_adv_info_summary_2_items,
- permGroupLabel1, permGroupLabel2);
+ return context.getResources()
+ .getString(
+ R.string.perm_usage_adv_info_summary_2_items,
+ permGroupLabel1,
+ permGroupLabel2);
}
// case for 3 or more extra items in the advanced info
int numExtraItems = size - PERMISSION_USAGE_INITIAL_EXPANDED_CHILDREN_COUNT - 1;
- return context.getResources().getString(R.string.perm_usage_adv_info_summary_more_items,
- permGroupLabel1, permGroupLabel2, numExtraItems);
+ return context.getResources()
+ .getString(
+ R.string.perm_usage_adv_info_summary_more_items,
+ permGroupLabel1,
+ permGroupLabel2,
+ numExtraItems);
}
- /**
- * Use the usages and permApps that are previously constructed to add UI content to the page
- */
- private void addUIContent(Context context,
- List<Map.Entry<String, Integer>> usages,
+ /** Use the usages and permApps that are previously constructed to add UI content to the page */
+ private void addUIContent(
+ Context context,
+ List<PermissionGroupWithUsageCount>
+ permissionGroupWithUsageCounts,
ArrayList<PermissionApps.PermissionApp> permApps,
PreferenceCategory category) {
- new PermissionApps.AppDataLoader(context, () -> {
- for (int i = 0; i < usages.size(); i++) {
- Map.Entry<String, Integer> currentEntry = usages.get(i);
- PermissionUsageV2ControlPreference permissionUsagePreference =
- new PermissionUsageV2ControlPreference(context, currentEntry.getKey(),
- currentEntry.getValue(), mShowSystem, mSessionId, mShow7Days);
- category.addPreference(permissionUsagePreference);
- }
+ new PermissionApps.AppDataLoader(
+ context,
+ () -> {
+ for (int i = 0; i < permissionGroupWithUsageCounts.size(); i++) {
+ PermissionGroupWithUsageCount
+ permissionGroupWithUsageCount =
+ permissionGroupWithUsageCounts.get(i);
+ PermissionUsageV2ControlPreference permissionUsagePreference =
+ new PermissionUsageV2ControlPreference(
+ context,
+ permissionGroupWithUsageCount.getPermGroup(),
+ permissionGroupWithUsageCount.getAppCount(),
+ mShowSystem,
+ mSessionId,
+ mShow7Days);
+ category.addPreference(permissionUsagePreference);
+ }
setLoading(false, true);
mFinishedInitialLoad = true;
@@ -417,9 +459,7 @@ public class PermissionUsageV2Fragment extends SettingsWithLargeHeader implement
}).execute(permApps.toArray(new PermissionApps.PermissionApp[0]));
}
- /**
- * Reloads the data to show.
- */
+ /** Reloads the data to show. */
private void reloadData() {
mViewModel.loadPermissionUsages(getActivity().getLoaderManager(), mPermissionUsages, this);
if (mFinishedInitialLoad) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
index bb060e831..5e3cd8684 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionGroupsViewModel.kt
@@ -38,7 +38,6 @@ import com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISS
import com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSION_GROUPS_FRAGMENT_AUTO_REVOKE_ACTION__ACTION__SWITCH_ENABLED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.hibernation.isHibernationEnabled
-import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.data.AppPermGroupUiInfoLiveData
import com.android.permissioncontroller.permission.data.FullStoragePermissionAppsLiveData
import com.android.permissioncontroller.permission.data.HibernationSettingStateLiveData
@@ -47,19 +46,20 @@ import com.android.permissioncontroller.permission.data.PackagePermissionsLiveDa
import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData.Companion.NON_RUNTIME_NORMAL_PERMS
import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
import com.android.permissioncontroller.permission.data.get
-import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState
+import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.ui.Category
-import com.android.permissioncontroller.permission.ui.handheld.v31.is7DayToggleEnabled
import com.android.permissioncontroller.permission.utils.IPC
+import com.android.permissioncontroller.permission.utils.KotlinUtils
+import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.permission.utils.Utils.AppPermsLastAccessType
import com.android.permissioncontroller.permission.utils.navigateSafe
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.launch
import java.time.Instant
import java.util.concurrent.TimeUnit
import kotlin.math.max
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
/**
* ViewModel for the AppPermissionGroupsFragment. Has a liveData with the UI information for all
@@ -281,7 +281,7 @@ class AppPermissionGroupsViewModel(
return
}
- val aggregateDataFilterBeginDays = if (is7DayToggleEnabled())
+ val aggregateDataFilterBeginDays = if (KotlinUtils.is7DayToggleEnabled())
AGGREGATE_DATA_FILTER_BEGIN_DAYS_7 else AGGREGATE_DATA_FILTER_BEGIN_DAYS_1
accessTime.clear()
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt
index 98bb5d80c..f04d7750a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt
@@ -19,7 +19,6 @@ package com.android.permissioncontroller.permission.ui.model
import android.Manifest
import android.Manifest.permission.ACCESS_COARSE_LOCATION
import android.Manifest.permission.ACCESS_FINE_LOCATION
-import android.Manifest.permission_group.LOCATION
import android.annotation.SuppressLint
import android.app.AppOpsManager
import android.app.AppOpsManager.MODE_ALLOWED
@@ -44,7 +43,6 @@ import com.android.permissioncontroller.PermissionControllerStatsLog
import com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_ACTION_REPORTED
import com.android.permissioncontroller.PermissionControllerStatsLog.APP_PERMISSION_FRAGMENT_VIEWED
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.data.FullStoragePermissionAppsLiveData
import com.android.permissioncontroller.permission.data.FullStoragePermissionAppsLiveData.FullStoragePackageState
import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveData
@@ -55,9 +53,6 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPerm
import com.android.permissioncontroller.permission.service.PermissionChangeStorageImpl
import com.android.permissioncontroller.permission.service.v33.PermissionDecisionStorageImpl
import com.android.permissioncontroller.permission.ui.AdvancedConfirmDialogArgs
-
-import com.android.permissioncontroller.permission.ui.handheld.v31.getDefaultPrecision
-import com.android.permissioncontroller.permission.ui.handheld.v31.isLocationAccuracyEnabled
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType.ALLOW
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType.ALLOW_ALWAYS
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType.ALLOW_FOREGROUND
@@ -67,7 +62,10 @@ import com.android.permissioncontroller.permission.ui.model.AppPermissionViewMod
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType.DENY_FOREGROUND
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType.LOCATION_ACCURACY
import com.android.permissioncontroller.permission.utils.KotlinUtils
+import com.android.permissioncontroller.permission.utils.KotlinUtils.getDefaultPrecision
+import com.android.permissioncontroller.permission.utils.KotlinUtils.isLocationAccuracyEnabled
import com.android.permissioncontroller.permission.utils.LocationUtils
+import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.SafetyNetLogger
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.permission.utils.navigateSafe
@@ -200,8 +198,8 @@ class AppPermissionViewModel(
/**
* A livedata which computes the state of the radio buttons
*/
- val buttonStateLiveData = object
- : SmartUpdateMediatorLiveData<@JvmSuppressWildcards Map<ButtonType, ButtonState>>() {
+ val buttonStateLiveData = object :
+ SmartUpdateMediatorLiveData<@JvmSuppressWildcards Map<ButtonType, ButtonState>>() {
private val appPermGroupLiveData = LightAppPermGroupLiveData[packageName, permGroupName,
user]
@@ -376,9 +374,8 @@ class AppPermissionViewModel(
}
if (shouldShowLocationAccuracy == null) {
- shouldShowLocationAccuracy = group.permGroupName == LOCATION &&
- group.permissions.containsKey(ACCESS_FINE_LOCATION) &&
- isLocationAccuracyEnabled()
+ shouldShowLocationAccuracy = isLocationAccuracyEnabled() &&
+ group.permissions.containsKey(ACCESS_FINE_LOCATION)
}
val locationAccuracyState = ButtonState(isFineLocationChecked(group),
true, false, null)
@@ -551,7 +548,8 @@ class AppPermissionViewModel(
if (changeRequest == ChangeRequest.GRANT_FINE_LOCATION) {
if (!group.isOneTime) {
- KotlinUtils.grantForegroundRuntimePermissions(app, group)
+ val newGroup = KotlinUtils.grantForegroundRuntimePermissions(app, group)
+ logPermissionChanges(group, newGroup, buttonClicked)
}
KotlinUtils.setFlagsWhenLocationAccuracyChanged(app, group, true)
return
@@ -559,8 +557,9 @@ class AppPermissionViewModel(
if (changeRequest == ChangeRequest.REVOKE_FINE_LOCATION) {
if (!group.isOneTime) {
- KotlinUtils.revokeForegroundRuntimePermissions(app, group,
+ val newGroup = KotlinUtils.revokeForegroundRuntimePermissions(app, group,
filterPermissions = listOf(ACCESS_FINE_LOCATION))
+ logPermissionChanges(group, newGroup, buttonClicked)
}
KotlinUtils.setFlagsWhenLocationAccuracyChanged(app, group, false)
return
@@ -667,11 +666,12 @@ class AppPermissionViewModel(
}
if (shouldGrantForeground) {
- if (shouldShowLocationAccuracy == true && !isFineLocationChecked(newGroup)) {
- newGroup = KotlinUtils.grantForegroundRuntimePermissions(app, newGroup,
- filterPermissions = listOf(ACCESS_COARSE_LOCATION))
+ newGroup = if (shouldShowLocationAccuracy == true &&
+ !isFineLocationChecked(newGroup)) {
+ KotlinUtils.grantForegroundRuntimePermissions(app, newGroup,
+ filterPermissions = listOf(ACCESS_COARSE_LOCATION))
} else {
- newGroup = KotlinUtils.grantForegroundRuntimePermissions(app, newGroup)
+ KotlinUtils.grantForegroundRuntimePermissions(app, newGroup)
}
if (!wasForegroundGranted) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
index 07b6d62de..d2b09a7c8 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.model.v31
+package com.android.permissioncontroller.permission.ui.model
import android.Manifest
import android.Manifest.permission.ACCESS_COARSE_LOCATION
@@ -59,7 +59,6 @@ import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_GRANTED_ONE_TIME
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_GRANT_REQUEST_RESULT_REPORTED__RESULT__USER_IGNORED
import com.android.permissioncontroller.auto.DrivingDecisionReminderService
-import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveData
import com.android.permissioncontroller.permission.data.LightPackageInfoLiveData
import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData
@@ -98,10 +97,11 @@ import com.android.permissioncontroller.permission.ui.GrantPermissionsViewHandle
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_INTERACTED
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_RESULT
-import com.android.permissioncontroller.permission.ui.handheld.v31.getDefaultPrecision
-import com.android.permissioncontroller.permission.ui.handheld.v31.isLocationAccuracyEnabled
import com.android.permissioncontroller.permission.utils.AdminRestrictedPermissionsUtils
import com.android.permissioncontroller.permission.utils.KotlinUtils
+import com.android.permissioncontroller.permission.utils.KotlinUtils.getDefaultPrecision
+import com.android.permissioncontroller.permission.utils.KotlinUtils.isLocationAccuracyEnabled
+import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.SafetyNetLogger
import com.android.permissioncontroller.permission.utils.Utils
@@ -440,7 +440,7 @@ class GrantPermissionsViewModel(
// Show location permission dialogs based on location permissions
val locationVisibilities = MutableList(NEXT_LOCATION_DIALOG) { false }
if (groupState.group.permGroupName == LOCATION && isLocationAccuracyEnabled() &&
- packageInfo.targetSdkVersion >= Build.VERSION_CODES.S) {
+ packageInfo.targetSdkVersion >= Build.VERSION_CODES.S) {
if (needFgPermissions) {
locationVisibilities[LOCATION_ACCURACY_LAYOUT] = true
if (fgState != null &&
@@ -729,7 +729,7 @@ class GrantPermissionsViewModel(
if (isBackground) {
KotlinUtils.grantBackgroundRuntimePermissions(app, group, listOf(perm))
} else {
- KotlinUtils.grantForegroundRuntimePermissions(app, group, listOf(perm))
+ KotlinUtils.grantForegroundRuntimePermissions(app, group, listOf(perm), group.isOneTime)
}
KotlinUtils.setGroupFlags(app, group, FLAG_PERMISSION_USER_SET to false,
FLAG_PERMISSION_USER_FIXED to false, filterPermissions = listOf(perm))
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ManageStandardPermissionsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ManageStandardPermissionsViewModel.kt
index 682ec108f..f9140d0b9 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ManageStandardPermissionsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ManageStandardPermissionsViewModel.kt
@@ -30,6 +30,7 @@ import com.android.permissioncontroller.permission.data.PermGroupsPackagesUiInfo
import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
import com.android.permissioncontroller.permission.data.StandardPermGroupNamesLiveData
import com.android.permissioncontroller.permission.data.unusedAutoRevokePackagesLiveData
+import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.permission.utils.navigateSafe
@@ -73,6 +74,12 @@ class ManageStandardPermissionsViewModel(
Utils.navigateToNotificationSettings(fragment.context!!)
return
}
+ if (Utils.isHealthPermissionUiEnabled() &&
+ groupName == PermissionMapping.getHealthPermissionGroupString()) {
+ // TODO(b/248358404): Redirect to the health connect UI, health permissions list for
+ // all apps.
+ return
+ }
fragment.findNavController().navigateSafe(R.id.manage_to_perm_apps, args)
}
@@ -99,4 +106,4 @@ class NumCustomPermGroupsWithPackagesLiveData() :
override fun onUpdate() {
value = customPermGroupPackages.value?.size ?: 0
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt
index 9814a115f..cd1a936f7 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt
@@ -38,25 +38,25 @@ import androidx.savedstate.SavedStateRegistryOwner
import com.android.modules.utils.build.SdkLevel
import com.android.permissioncontroller.PermissionControllerStatsLog
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED
-import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__UNDEFINED
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__ALLOWED_FOREGROUND
import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__DENIED
+import com.android.permissioncontroller.PermissionControllerStatsLog.PERMISSION_APPS_FRAGMENT_VIEWED__CATEGORY__UNDEFINED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.data.AllPackageInfosLiveData
import com.android.permissioncontroller.permission.data.FullStoragePermissionAppsLiveData
import com.android.permissioncontroller.permission.data.FullStoragePermissionAppsLiveData.FullStoragePackageState
import com.android.permissioncontroller.permission.data.SinglePermGroupPackagesUiInfoLiveData
-import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo.PermGrantState
+import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.ui.Category
import com.android.permissioncontroller.permission.ui.LocationProviderInterceptDialog
-import com.android.permissioncontroller.permission.ui.handheld.v31.is7DayToggleEnabled
import com.android.permissioncontroller.permission.ui.model.PermissionAppsViewModel.Companion.CREATION_LOGGED_KEY
import com.android.permissioncontroller.permission.ui.model.PermissionAppsViewModel.Companion.HAS_SYSTEM_APPS_KEY
import com.android.permissioncontroller.permission.ui.model.PermissionAppsViewModel.Companion.SHOULD_SHOW_SYSTEM_KEY
import com.android.permissioncontroller.permission.ui.model.PermissionAppsViewModel.Companion.SHOW_ALWAYS_ALLOWED
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPackageUid
+import com.android.permissioncontroller.permission.utils.KotlinUtils.is7DayToggleEnabled
import com.android.permissioncontroller.permission.utils.LocationUtils
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.permission.utils.navigateSafe
@@ -169,8 +169,8 @@ class PermissionAppsViewModel(
}
}
- inner class CategorizedAppsLiveData(groupName: String)
- : MediatorLiveData<@kotlin.jvm.JvmSuppressWildcards
+ inner class CategorizedAppsLiveData(groupName: String) :
+ MediatorLiveData<@kotlin.jvm.JvmSuppressWildcards
Map<Category, List<Pair<String, UserHandle>>>>() {
private val packagesUiInfoLiveData = SinglePermGroupPackagesUiInfoLiveData[groupName]
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreference.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreference.java
index b69fb66a7..4006bcfd3 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreference.java
@@ -44,8 +44,12 @@ class PermissionGroupPreference extends Preference {
setTitle(label);
setIcon(tintedIcon);
setIntent(managePgIntent);
- updateSummary(permissionGroupInfo.getNonSystemGranted(),
- permissionGroupInfo.getNonSystemUserSetOrPreGranted());
+ updateSummary(permissionGroupInfo);
+ }
+
+ void updateSummary(PermGroupPackagesUiInfo info) {
+ updateSummary(info.getNonSystemGranted(),
+ info.getNonSystemTotal());
}
void updateSummary(int granted, int used) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreferenceUtils.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreferenceUtils.java
index 49a01efaf..3541edead 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreferenceUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionGroupPreferenceUtils.java
@@ -60,8 +60,7 @@ public final class PermissionGroupPreferenceUtils {
if (preference == null) {
preference = new PermissionGroupPreference(context, info);
} else {
- preference.updateSummary(info.getNonSystemGranted(),
- info.getNonSystemUserSetOrPreGranted());
+ preference.updateSummary(info);
// Reset the ordering back to default, so that when we add it back it falls into the
// right place, and the preferences are ordered as we add them.
preference.setOrder(Preference.DEFAULT_ORDER);
@@ -99,8 +98,7 @@ public final class PermissionGroupPreferenceUtils {
final PermissionGroupPreference preference =
(PermissionGroupPreference) preferenceGroup.getPreference(i);
final PermGroupPackagesUiInfo info = permissionGroups.get(i);
- preference.updateSummary(info.getNonSystemGranted(),
- info.getNonSystemUserSetOrPreGranted());
+ preference.updateSummary(info);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewOngoingUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewOngoingUsageViewModel.kt
index e65c5c1ff..309b9eba1 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewOngoingUsageViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewOngoingUsageViewModel.kt
@@ -47,15 +47,15 @@ import com.android.permissioncontroller.permission.data.PermGroupUsageLiveData
import com.android.permissioncontroller.permission.data.SmartAsyncMediatorLiveData
import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
import com.android.permissioncontroller.permission.data.micMutedLiveData
-import com.android.permissioncontroller.permission.ui.handheld.v31.shouldShowLocationIndicators
-import com.android.permissioncontroller.permission.ui.handheld.v31.shouldShowPermissionsDashboard
import com.android.permissioncontroller.permission.ui.handheld.v31.ReviewOngoingUsageFragment.PHONE_CALL
import com.android.permissioncontroller.permission.ui.handheld.v31.ReviewOngoingUsageFragment.VIDEO_CALL
import com.android.permissioncontroller.permission.utils.KotlinUtils
+import com.android.permissioncontroller.permission.utils.KotlinUtils.shouldShowLocationIndicators
+import com.android.permissioncontroller.permission.utils.KotlinUtils.shouldShowPermissionsDashboard
import com.android.permissioncontroller.permission.utils.Utils
-import kotlinx.coroutines.Job
import java.time.Instant
import kotlin.math.max
+import kotlinx.coroutines.Job
private const val FIRST_OPENED_KEY = "FIRST_OPENED"
private const val CALL_OP_USAGE_KEY = "CALL_OP_USAGE"
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewPermissionsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewPermissionsViewModel.kt
index 97c5d7596..4e1fc1861 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewPermissionsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/ReviewPermissionsViewModel.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.model.v33
+package com.android.permissioncontroller.permission.ui.model
import android.app.Application
import android.content.Context
@@ -26,13 +26,13 @@ import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.data.LightAppPermGroupLiveData
import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData
import com.android.permissioncontroller.permission.data.PackagePermissionsLiveData.Companion.NON_RUNTIME_NORMAL_PERMS
import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
import com.android.permissioncontroller.permission.data.get
import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup
+import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.permission.utils.navigateSafe
import com.android.settingslib.RestrictedLockUtils
@@ -326,4 +326,4 @@ class ReviewPermissionViewModelFactory(
@Suppress("UNCHECKED_CAST")
return ReviewPermissionsViewModel(app, packageInfo = packageInfo) as T
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageControlPreferenceUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageControlPreferenceUtils.kt
index b3442645d..db79165c3 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageControlPreferenceUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageControlPreferenceUtils.kt
@@ -61,9 +61,13 @@ object PermissionUsageControlPreferenceUtils {
if (count == 0) {
isEnabled = false
val permissionUsageSummaryNotUsed = if (show7Days) {
- R.string.permission_usage_preference_summary_not_used_7d
+ StringUtils.getIcuPluralsString(context,
+ R.string.permission_usage_preference_summary_not_used_in_past_n_days,
+ 7)
} else {
- R.string.permission_usage_preference_summary_not_used_24h
+ StringUtils.getIcuPluralsString(context,
+ R.string.permission_usage_preference_summary_not_used_in_past_n_hours,
+ 24)
}
setSummary(permissionUsageSummaryNotUsed)
} else if (SENSOR_DATA_PERMISSIONS.contains(groupName)) {
@@ -102,4 +106,4 @@ object PermissionUsageControlPreferenceUtils {
}
PermissionControllerStatsLog.write(PERMISSION_USAGE_FRAGMENT_INTERACTION, sessionId, act)
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
index 26a6db247..1171cfb0f 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
@@ -22,92 +22,66 @@ import android.app.Application
import android.app.LoaderManager
import android.app.role.RoleManager
import android.content.Context
+import android.content.pm.ApplicationInfo
import android.content.res.Resources
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.UserHandle
-import android.text.format.DateFormat
import androidx.annotation.RequiresApi
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
-import androidx.preference.Preference
-import androidx.preference.PreferenceCategory
-import androidx.preference.PreferenceScreen
import com.android.permissioncontroller.PermissionControllerApplication
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.model.AppPermissionGroup
+import com.android.permissioncontroller.permission.model.legacy.PermissionApps.PermissionApp
import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
-import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage.GroupUsage
-import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage.GroupUsage.AttributionLabelledGroupUsage
import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage.TimelineUsage
import com.android.permissioncontroller.permission.model.v31.PermissionUsages
-import com.android.permissioncontroller.permission.model.legacy.PermissionApps.PermissionApp
import com.android.permissioncontroller.permission.ui.handheld.v31.getDurationUsedStr
-import com.android.permissioncontroller.permission.ui.handheld.v31.is7DayToggleEnabled
import com.android.permissioncontroller.permission.ui.handheld.v31.shouldShowSubattributionInPermissionsDashboard
+import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPackageLabel
+import com.android.permissioncontroller.permission.utils.PermissionMapping
+import com.android.permissioncontroller.permission.utils.StringUtils
import com.android.permissioncontroller.permission.utils.SubattributionUtils
import com.android.permissioncontroller.permission.utils.Utils
-import java.time.Clock
import java.time.Instant
-import java.time.ZonedDateTime
-import java.time.temporal.ChronoUnit
-import java.util.Objects
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeUnit.DAYS
-import java.util.concurrent.atomic.AtomicBoolean
-import java.util.concurrent.atomic.AtomicReference
-import java.util.stream.Collectors
import kotlin.math.max
-/**
- * View model for the permission details fragment.
- */
+/** View model for the permission details fragment. */
@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageDetailsViewModel(
val application: Application,
val roleManager: RoleManager,
- private val filterGroup: String,
+ private val permissionGroup: String,
val sessionId: Long
) : ViewModel() {
companion object {
private const val ONE_HOUR_MS = 3_600_000
private const val ONE_MINUTE_MS = 60_000
- private const val CLUSTER_MINUTES_APART = 1
+ private const val CLUSTER_SPACING_MINUTES: Long = 1L
private val TIME_7_DAYS_DURATION: Long = DAYS.toMillis(7)
private val TIME_24_HOURS_DURATION: Long = DAYS.toMillis(1)
- private val ALLOW_CLUSTERING_PERMISSION_GROUPS = listOf(
- Manifest.permission_group.LOCATION,
- Manifest.permission_group.CAMERA,
- Manifest.permission_group.MICROPHONE
- )
}
- private val filterTimes = mutableListOf<TimeFilterItem>()
-
- // Truncate to midnight in current timezone.
- private val midnightToday = ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS)
- .toEpochSecond() * 1000L
- private val midnightYesterday = ZonedDateTime.now().minusDays(1).truncatedTo(ChronoUnit.DAYS)
- .toEpochSecond() * 1000L
+ private val mTimeFilterItemMs = mutableListOf<TimeFilterItemMs>()
init {
- initializeTimeFilter(application)
+ initializeTimeFilterItems(application)
}
- /**
- * Loads permission usages using [PermissionUsages]. Response is returned to the [callback].
- */
+ /** Loads permission usages using [PermissionUsages]. Response is returned to the [callback]. */
fun loadPermissionUsages(
loaderManager: LoaderManager,
permissionUsages: PermissionUsages,
callback: PermissionUsages.PermissionsUsagesChangeCallback,
filterTimesIndex: Int
) {
- val timeFilterItem: TimeFilterItem = filterTimes[filterTimesIndex]
- val filterTimeBeginMillis = max(System.currentTimeMillis() - timeFilterItem.time, 0)
+ val timeFilterItemMs: TimeFilterItemMs = mTimeFilterItemMs[filterTimesIndex]
+ val filterTimeBeginMillis = max(System.currentTimeMillis() - timeFilterItemMs.timeMs, 0)
permissionUsages.load(
/* filterPackageName= */ null,
/* filterPermissionGroups= */ null,
@@ -122,450 +96,466 @@ class PermissionUsageDetailsViewModel(
}
/**
- * Returns whether app subattribution should be shown.
- */
- private fun shouldShowSubattributionForApp(appPermissionUsage: AppPermissionUsage): Boolean {
- return shouldShowSubattributionInPermissionsDashboard() &&
- SubattributionUtils.isSubattributionSupported(application,
- appPermissionUsage.app.appInfo)
- }
-
- /**
- * Create a list of [AppPermissionUsageEntry]s based on the provided data.
+ * Create a [PermissionUsageDetailsUiData] based on the provided data.
*
* @param appPermissionUsages data about app permission usages
- * @param exemptedPackages packages whose usage should not be included in the out
- * @param permApps mutable list of [PermissionApp] for keeping track of information about apps.
- * This field is updated as a side effect of running this method.
- * @param seenSystemApp mutable field to track whether a system app has recent usage. Updated
- * as a side effect of running this method.
- * @param showSystemApp whether System apps should be shown
+ * @param showSystem whether system apps should be shown
* @param show7Days whether the last 7 days of history should be shown
*/
- fun parseUsages(
+ fun buildPermissionUsageDetailsUiData(
appPermissionUsages: List<AppPermissionUsage>,
- exemptedPackages: Set<String>,
- permApps: MutableList<PermissionApp>,
- seenSystemApp: AtomicBoolean,
- showSystemApp: Boolean,
+ showSystem: Boolean,
show7Days: Boolean
- ): List<AppPermissionUsageEntry> {
- val curTime = System.currentTimeMillis()
- val showPermissionUsagesDuration = if (is7DayToggleEnabled() && show7Days) {
- TIME_7_DAYS_DURATION
- } else {
- TIME_24_HOURS_DURATION
- }
- val startTime = (curTime - showPermissionUsagesDuration)
- .coerceAtLeast(Instant.EPOCH.toEpochMilli())
-
- return appPermissionUsages
- .asSequence()
- .filter { appUsage: AppPermissionUsage ->
- !exemptedPackages.contains(appUsage.packageName)
- }
- .map { appUsage: AppPermissionUsage ->
- filterAndConvert(appUsage, filterGroup)
+ ): PermissionUsageDetailsUiData {
+ val showPermissionUsagesDuration =
+ if (KotlinUtils.is7DayToggleEnabled() && show7Days) {
+ TIME_7_DAYS_DURATION
+ } else {
+ TIME_24_HOURS_DURATION
}
- .flatten()
- .map { usageData: UsageData ->
- // Fetch the access time list of the app accesses mFilterGroup permission group
- // The DiscreteAccessTime is a Triple of (access time, access duration,
- // proxy) of that app
- val discreteAccessTimeList:
- MutableList<Triple<Long, Long, AppOpsManager.OpEventProxyInfo>> =
- mutableListOf()
- val timelineUsages = usageData.timelineUsages
- val numGroups = timelineUsages.size
- for (groupIndex in 0 until numGroups) {
- val timelineUsage = timelineUsages[groupIndex]
- if (!timelineUsage.hasDiscreteData()) {
- continue
- }
- val isSystemApp = !Utils.isGroupOrBgGroupUserSensitive(timelineUsage.group)
- seenSystemApp.set(seenSystemApp.get() || isSystemApp)
- if (isSystemApp && !showSystemApp) {
- continue
- }
- for (discreteAccessTime in timelineUsage.allDiscreteAccessTime) {
- if (discreteAccessTime.first == 0L ||
- discreteAccessTime.first < startTime) {
- continue
- }
- discreteAccessTimeList.add(discreteAccessTime)
- }
- }
- discreteAccessTimeList.sortWith { x, y -> y.first.compareTo(x.first) }
- if (discreteAccessTimeList.size > 0) {
- permApps.add(usageData.app)
- }
+ val startTime =
+ (System.currentTimeMillis() - showPermissionUsagesDuration).coerceAtLeast(
+ Instant.EPOCH.toEpochMilli())
+ val appPermissionTimelineUsages: List<AppPermissionTimelineUsages> =
+ extractAppPermissionTimelineUsagesForGroup(appPermissionUsages, permissionGroup)
+ val shouldDisplayShowSystemToggle =
+ shouldDisplayShowSystemToggle(appPermissionTimelineUsages)
+ val permissionApps: List<PermissionApp> =
+ getPermissionAppsWithRecentDiscreteUsage(
+ appPermissionTimelineUsages, showSystem, startTime)
+ val appPermissionUsageEntries =
+ buildDiscreteAccessClusterData(appPermissionTimelineUsages, showSystem, startTime)
+
+ return PermissionUsageDetailsUiData(
+ permissionApps, shouldDisplayShowSystemToggle, appPermissionUsageEntries)
+ }
- // If the current permission group is not LOCATION or there's only one access
- // for the app, return individual entry early.
- if (!ALLOW_CLUSTERING_PERMISSION_GROUPS.contains(filterGroup) ||
- discreteAccessTimeList.size <= 1) {
- return@map discreteAccessTimeList.map { time ->
- AppPermissionUsageEntry(usageData, time.first, mutableListOf(time))
- }
- }
+ private fun getHistoryPreferenceData(
+ discreteAccessClusterData: DiscreteAccessClusterData,
+ ): HistoryPreferenceData {
+ val context = application
+ val accessTimeList =
+ discreteAccessClusterData.discreteAccessDataList.map { p -> p.accessTimeMs }
+ val durationSummaryLabel =
+ getDurationSummary(discreteAccessClusterData, accessTimeList, context)
+ val proxyLabel = getProxyPackageLabel(discreteAccessClusterData)
+ val subattributionLabel = getSubattributionLabel(discreteAccessClusterData)
+ val showingSubattribution =
+ subattributionLabel != null && subattributionLabel!!.isNotEmpty()
+ val summary =
+ buildUsageSummary(durationSummaryLabel, proxyLabel, subattributionLabel, context)
+
+ return HistoryPreferenceData(
+ UserHandle.getUserHandleForUid(
+ discreteAccessClusterData.appPermissionTimelineUsages.permissionApp.uid),
+ discreteAccessClusterData.appPermissionTimelineUsages.permissionApp.packageName,
+ discreteAccessClusterData.appPermissionTimelineUsages.permissionApp.icon,
+ discreteAccessClusterData.appPermissionTimelineUsages.permissionApp.label,
+ permissionGroup,
+ discreteAccessClusterData.endTime,
+ summary,
+ showingSubattribution,
+ accessTimeList,
+ discreteAccessClusterData.appPermissionTimelineUsages.attributionTags,
+ sessionId)
+ }
- // Group access time list
- val usageEntries = mutableListOf<AppPermissionUsageEntry>()
- var ongoingEntry: AppPermissionUsageEntry? = null
- for (time in discreteAccessTimeList) {
- if (ongoingEntry == null) {
- ongoingEntry = AppPermissionUsageEntry(usageData, time.first,
- mutableListOf(time))
- } else {
- val ongoingAccessTimeList:
- MutableList<Triple<Long, Long, AppOpsManager.OpEventProxyInfo>> =
- ongoingEntry.clusteredAccessTimeList
- if (time.first / ONE_HOUR_MS !=
- ongoingAccessTimeList[0].first / ONE_HOUR_MS ||
- ongoingAccessTimeList[ongoingAccessTimeList.size - 1].first /
- ONE_MINUTE_MS - time.first / ONE_MINUTE_MS > CLUSTER_MINUTES_APART
- ) {
- // If the current access time is not in the same hour nor within
- // CLUSTER_MINUTES_APART, add the ongoing entry to the usage list
- // and start a new ongoing entry.
- usageEntries.add(ongoingEntry)
- ongoingEntry = AppPermissionUsageEntry(usageData, time.first,
- mutableListOf(time))
- } else {
- ongoingAccessTimeList.add(time)
- }
- }
- }
- ongoingEntry?.let { usageEntries.add(it) }
- usageEntries
+ /**
+ * Returns whether the provided [AppPermissionUsage] instances contains the provided platform
+ * permission group.
+ */
+ fun containsPlatformAppPermissionGroup(
+ appPermissionUsages: List<AppPermissionUsage>,
+ groupName: String,
+ ) = appPermissionUsages.extractAllPlatformAppPermissionGroups().any { it.name == groupName }
+
+ /** Extracts a list of [AppPermissionTimelineUsages] for a particular permission group. */
+ private fun extractAppPermissionTimelineUsagesForGroup(
+ appPermissionUsages: List<AppPermissionUsage>,
+ group: String
+ ): List<AppPermissionTimelineUsages> =
+ appPermissionUsages
+ .filter { !Utils.getExemptedPackages(roleManager).contains(it.packageName) }
+ .map { appPermissionUsage ->
+ getAppPermissionTimelineUsages(
+ appPermissionUsage.app,
+ appPermissionUsage.groupUsages.firstOrNull { it.group.name == group })
}
.flatten()
- .sortedWith { x, y ->
- // Sort all usage entries by startTime desc, and then by app name.
- val timeCompare = java.lang.Long.compare(y.endTime, x.endTime)
- if (timeCompare != 0) {
- return@sortedWith timeCompare
- }
- x.usageData.app.label.compareTo(y.usageData.app.label)
- }
- .toList()
- }
+
+ /** Returns whether the show/hide system toggle should be displayed in the UI. */
+ private fun shouldDisplayShowSystemToggle(
+ appPermissionTimelineUsages: List<AppPermissionTimelineUsages>,
+ ): Boolean =
+ appPermissionTimelineUsages
+ .map { it.timelineUsages }
+ .flatten()
+ .filter { it.hasDiscreteData() }
+ .any { it.group.isSystem() }
/**
- * Render [usages] into the [preferenceScreen] UI.
+ * Returns a list of [PermissionApp] instances which had recent discrete permission usage
+ * (recent here refers to usages occurring after the provided start time).
*/
- fun renderTimelinePreferences(
- usages: List<AppPermissionUsageEntry>,
- category: AtomicReference<PreferenceCategory>,
- preferenceScreen: PreferenceScreen,
- historyPreferenceFactory: HistoryPreferenceFactory
- ) {
- val context = application
- var hasADateLabel = false
- var lastDateLabel = 0L
- usages.forEachIndexed { usageNum, usage ->
- val usageTimestamp = usage.endTime
- val usageDateLabel = ZonedDateTime.ofInstant(Instant.ofEpochMilli(usageTimestamp),
- Clock.systemDefaultZone().zone)
- .truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L
- if (!hasADateLabel || usageDateLabel != lastDateLabel) {
- if (hasADateLabel) {
- category.set(historyPreferenceFactory.createDayCategoryPreference())
- preferenceScreen.addPreference(category.get())
- }
- val formattedDateTitle = DateFormat.getDateFormat(context)
- .format(usageDateLabel)
- if (usageTimestamp > midnightToday) {
- category.get().setTitle(R.string.permission_history_category_today)
- } else if (usageTimestamp > midnightYesterday) {
- category.get().setTitle(R.string.permission_history_category_yesterday)
- } else {
- category.get().setTitle(formattedDateTitle)
- }
- hasADateLabel = true
- }
+ private fun getPermissionAppsWithRecentDiscreteUsage(
+ appPermissionTimelineUsagesList: List<AppPermissionTimelineUsages>,
+ showSystem: Boolean,
+ startTime: Long,
+ ): List<PermissionApp> =
+ appPermissionTimelineUsagesList.mapNotNull { appPermissionTimelineUsages ->
+ if (appPermissionTimelineUsages.timelineUsages
+ .filter { it.hasDiscreteData() }
+ .filter { showSystem || !it.group.isSystem() }
+ .any { timelineUsage ->
+ timelineUsage.allDiscreteAccessTime.any { it.first >= startTime }
+ })
+ appPermissionTimelineUsages.permissionApp
+ else null
+ }
- lastDateLabel = usageDateLabel
-
- val accessTime = DateFormat.getTimeFormat(context).format(usage.endTime)
- var durationLong: Long = usage.clusteredAccessTimeList
- .map { p -> p.second }
- .filter { dur -> dur > 0 }
- .sum()
-
- val accessTimeList: List<Long> = usage.clusteredAccessTimeList.map { p -> p.first }
-
- // Determine the preference summary. Start with the duration string
- var summaryLabel: String? = null
- // Since Location accesses are atomic, we manually calculate the access duration
- // by comparing the first and last access within the cluster
- if (filterGroup == Manifest.permission_group.LOCATION) {
- if (accessTimeList.size > 1) {
- durationLong = (accessTimeList[0] - accessTimeList[accessTimeList.size - 1])
-
- // Similar to other history items, only show the duration if it's longer
- // than the clustering granularity.
- if (durationLong
- >= TimeUnit.MINUTES.toMillis(CLUSTER_MINUTES_APART.toLong()) + 1) {
- summaryLabel = getDurationUsedStr(context, durationLong)
+ /**
+ * Builds a list of [DiscreteAccessClusterData] from the provided list of
+ * [AppPermissionTimelineUsages].
+ */
+ private fun buildDiscreteAccessClusterData(
+ appPermissionTimelineUsagesList: List<AppPermissionTimelineUsages>,
+ showSystem: Boolean,
+ startTime: Long,
+ ): List<DiscreteAccessClusterData> =
+ appPermissionTimelineUsagesList
+ .map { appPermissionTimelineUsages ->
+ val accessDataList =
+ extractRecentDiscreteAccessData(
+ appPermissionTimelineUsages.timelineUsages, showSystem, startTime)
+
+ if (accessDataList.size <= 1) {
+ return@map accessDataList.map {
+ DiscreteAccessClusterData(
+ appPermissionTimelineUsages, it.accessTimeMs, listOf(it))
}
}
- } else {
- // Only show the duration if it is at least (cluster + 1) minutes. Displaying
- // times that are the same as the cluster granularity does not convey useful
- // information.
- if (durationLong != null &&
- durationLong >=
- TimeUnit.MINUTES.toMillis((CLUSTER_MINUTES_APART + 1).toLong())) {
- summaryLabel = getDurationUsedStr(context, durationLong)
- }
- }
- var proxyPackageLabel: String? = null
- for (clusteredAccessTime in usage.clusteredAccessTimeList) {
- val proxy = clusteredAccessTime.third
- if (proxy != null && proxy.packageName != null) {
- proxyPackageLabel = getPackageLabel(
- PermissionControllerApplication.get(), proxy.packageName!!,
- UserHandle.getUserHandleForUid(proxy.uid))
- break
- }
- }
-
- // fetch the subattribution label for this usage.
- var subattributionLabel: String? = null
- if (usage.usageData.label != Resources.ID_NULL) {
- val attributionLabels: Map<Int, String>? = usage.usageData.app.attributionLabels
- if (attributionLabels != null) {
- subattributionLabel = attributionLabels[usage.usageData.label]
- }
+ clusterDiscreteAccessData(appPermissionTimelineUsages, accessDataList)
}
+ .flatten()
+ .sortedWith(
+ compareBy({ -it.endTime }, { it.appPermissionTimelineUsages.permissionApp.label }))
+ .toList()
- // create subtext string.
- val subTextStrings: MutableList<String?> = mutableListOf()
- val showingAttribution = subattributionLabel != null && subattributionLabel.isNotEmpty()
- if (showingAttribution) {
- subTextStrings.add(subattributionLabel)
- }
- if (proxyPackageLabel != null) {
- subTextStrings.add(proxyPackageLabel)
- }
- if (summaryLabel != null) {
- subTextStrings.add(summaryLabel)
- }
- var subText: String? = null
- when (subTextStrings.size) {
- 3 -> {
- subText = context.getString(
- R.string.history_preference_subtext_3,
- subTextStrings[0],
- subTextStrings[1],
- subTextStrings[2])
- }
- 2 -> {
- subText = context.getString(R.string.history_preference_subtext_2,
- subTextStrings[0],
- subTextStrings[1])
- }
- 1 -> {
- subText = subTextStrings[0]
- }
+ /**
+ * Clusters a list of [DiscreteAccessData] into a list of [DiscreteAccessClusterData] instances.
+ *
+ * [DiscreteAccessData] which have accesses sufficiently close together in time will be places
+ * in the same cluster.
+ */
+ private fun clusterDiscreteAccessData(
+ appPermissionTimelineUsages: AppPermissionTimelineUsages,
+ discreteAccessDataList: List<DiscreteAccessData>
+ ): List<DiscreteAccessClusterData> {
+ val clusterDataList = mutableListOf<DiscreteAccessClusterData>()
+ var currentAccessTimeMs: Long = 0
+ val currentDiscreteAccessDataList: MutableList<DiscreteAccessData> = mutableListOf()
+ for (discreteAccessData in discreteAccessDataList) {
+ if (currentDiscreteAccessDataList.isEmpty()) {
+ currentDiscreteAccessDataList.add(discreteAccessData)
+ currentAccessTimeMs = discreteAccessData.accessTimeMs
+ } else if (!canAccessBeAddedToCluster(
+ discreteAccessData, currentDiscreteAccessDataList)) {
+ clusterDataList.add(
+ DiscreteAccessClusterData(
+ appPermissionTimelineUsages,
+ currentAccessTimeMs,
+ currentDiscreteAccessDataList.toMutableList()))
+ currentDiscreteAccessDataList.clear()
+ currentDiscreteAccessDataList.add(discreteAccessData)
+ currentAccessTimeMs = discreteAccessData.accessTimeMs
+ } else {
+ currentDiscreteAccessDataList.add(discreteAccessData)
}
-
- val permissionUsagePreference = historyPreferenceFactory
- .createPermissionHistoryPreference(
- HistoryPreferenceData(
- UserHandle.getUserHandleForUid(usage.usageData.app.getUid()),
- usage.usageData.app.packageName,
- usage.usageData.app.icon,
- usage.usageData.app.label,
- filterGroup, accessTime, subText,
- showingAttribution, accessTimeList,
- usage.usageData.attributionTags,
- usageNum == usages.size - 1,
- sessionId)
- )
- category.get().addPreference(permissionUsagePreference)
}
+ if (currentDiscreteAccessDataList.isNotEmpty()) {
+ clusterDataList.add(
+ DiscreteAccessClusterData(
+ appPermissionTimelineUsages,
+ currentAccessTimeMs,
+ currentDiscreteAccessDataList))
+ }
+ return clusterDataList
}
/**
- * Filter the usage data from [appPermissionUsage] into a list of [UsageData].
+ * Extract recent [DiscreteAccessData] from a list of [TimelineUsage] instances, and return them
+ * ordered descending by access time (recent here refers to accesses occurring after the
+ * provided start time).
*/
- private fun filterAndConvert(
- appPermissionUsage: AppPermissionUsage,
- filterGroup: String
- ): List<UsageData> {
- if (shouldShowSubattributionForApp(appPermissionUsage)) {
- return appPermissionUsage.groupUsages
- .filter { groupUsage: GroupUsage -> groupUsage.group.name == filterGroup }
- .map(GroupUsage::getAttributionLabelledGroupUsages)
- .flatten()
- .map { labelledGroupUsage: AttributionLabelledGroupUsage ->
- UsageData(filterGroup, appPermissionUsage.app,
- listOf<TimelineUsage>(labelledGroupUsage),
- labelledGroupUsage.label)
- }
- }
- val groupUsages = appPermissionUsage.groupUsages
- .filter { groupUsage: GroupUsage -> groupUsage.group.name == filterGroup }
- return listOf(
- UsageData(filterGroup, appPermissionUsage.app, groupUsages,
- Resources.ID_NULL)
- )
- }
+ private fun extractRecentDiscreteAccessData(
+ timelineUsages: List<TimelineUsage>,
+ showSystem: Boolean,
+ startTime: Long
+ ): List<DiscreteAccessData> =
+ timelineUsages
+ .asSequence()
+ .filter { it.hasDiscreteData() }
+ .filter { showSystem || !it.group.isSystem() }
+ .map { getRecentDiscreteAccessData(it, startTime) }
+ .flatten()
+ .sortedWith(compareBy { -it.accessTimeMs })
+ .toList()
/**
- * Get an AppPermissionGroup that represents the given permission group (and an arbitrary app).
- *
- * @param groupName The name of the permission group.
- *
- * @return an AppPermissionGroup representing the given permission group or null if no such
- * AppPermissionGroup is found.
+ * Extract recent [DiscreteAccessData] from a [TimelineUsage]. (recent here refers to accesses
+ * occurring after the provided start time).
*/
- fun getGroup(
- groupName: String,
- appPermissionUsages: List<AppPermissionUsage>
- ): AppPermissionGroup? {
- val groups = getOSPermissionGroups(appPermissionUsages)
- return groups.firstOrNull { it.name == groupName }
+ private fun getRecentDiscreteAccessData(
+ timelineUsage: TimelineUsage,
+ startTime: Long
+ ): List<DiscreteAccessData> {
+ return timelineUsage.allDiscreteAccessTime
+ .filter { it.first >= startTime }
+ .map {
+ DiscreteAccessData(
+ it.first,
+ it.second,
+ it.third,
+ )
+ }
}
/**
- * Get the permission groups declared by the OS.
+ * Returns whether the provided [DiscreteAccessData] occurred close enough to those in the
+ * clustered list that it can be added to the cluster
+ */
+ private fun canAccessBeAddedToCluster(
+ accessData: DiscreteAccessData,
+ clusteredAccessDataList: List<DiscreteAccessData>
+ ): Boolean =
+ accessData.accessTimeMs / ONE_HOUR_MS ==
+ clusteredAccessDataList.first().accessTimeMs / ONE_HOUR_MS &&
+ clusteredAccessDataList.last().accessTimeMs / ONE_MINUTE_MS -
+ accessData.accessTimeMs / ONE_MINUTE_MS > CLUSTER_SPACING_MINUTES
+
+ /**
+ * Returns whether the provided [AppPermissionGroup] is considered a system group.
*
- * TODO: theianchen change the method name to make that clear,
- * and return a list of string group names, not AppPermissionGroups.
- * @return a list of the permission groups declared by the OS.
+ * For the purpose of Permissions Hub UI, non user-sensitive [AppPermissionGroup]s are
+ * considered "system" and should be hidden from the main page unless requested by the user
+ * through the "show/hide system" toggle.
*/
- private fun getOSPermissionGroups(
- appPermissionUsages: List<AppPermissionUsage>
- ): List<AppPermissionGroup> {
- val groups: MutableList<AppPermissionGroup> = mutableListOf()
- val seenGroups: MutableSet<String> = mutableSetOf()
- for (appUsage in appPermissionUsages) {
- val groupUsages = appUsage.groupUsages
- for (groupUsage in groupUsages) {
- if (PermissionMapping.isPlatformPermissionGroup(groupUsage.group.name)) {
- if (seenGroups.add(groupUsage.group.name)) {
- groups.add(groupUsage.group)
- }
- }
+ private fun AppPermissionGroup.isSystem() = !Utils.isGroupOrBgGroupUserSensitive(this)
+
+ /** Returns whether app subattribution should be shown. */
+ private fun shouldShowSubattributionForApp(appInfo: ApplicationInfo): Boolean {
+ return shouldShowSubattributionInPermissionsDashboard() &&
+ SubattributionUtils.isSubattributionSupported(application, appInfo)
+ }
+
+ /** Returns a summary of the duration the permission was accessed for. */
+ private fun getDurationSummary(
+ usage: DiscreteAccessClusterData,
+ accessTimeList: List<Long>,
+ context: Context
+ ): String? {
+ if (accessTimeList.isEmpty()) {
+ return null
+ }
+
+ var durationMs: Long
+
+ // Since Location accesses are atomic, we manually calculate the access duration
+ // by comparing the first and last access within the cluster.
+ if (permissionGroup == Manifest.permission_group.LOCATION) {
+ durationMs = accessTimeList[0] - accessTimeList[accessTimeList.size - 1]
+ } else {
+ durationMs =
+ usage.discreteAccessDataList.map { it.accessDurationMs }.filter { it > 0 }.sum()
+ }
+ // Only show the duration summary if it is at least (CLUSTER_SPACING_MINUTES + 1) minutes.
+ // Displaying a time that is shorter than the cluster granularity
+ // (CLUSTER_SPACING_MINUTES) will not convey useful information.
+ if (durationMs >= TimeUnit.MINUTES.toMillis(CLUSTER_SPACING_MINUTES + 1)) {
+ return getDurationUsedStr(context, durationMs)
+ }
+
+ return null
+ }
+
+ /** Returns the proxied package label if the permission access was proxied. */
+ private fun getProxyPackageLabel(usage: DiscreteAccessClusterData): String? =
+ usage.discreteAccessDataList
+ .firstOrNull { it.proxy?.packageName != null }
+ ?.let {
+ getPackageLabel(
+ PermissionControllerApplication.get(),
+ it.proxy!!.packageName!!,
+ UserHandle.getUserHandleForUid(it.proxy!!.uid))
}
+
+ /** Returns the attribution label for the permission access, if any. */
+ private fun getSubattributionLabel(usage: DiscreteAccessClusterData): String? =
+ if (usage.appPermissionTimelineUsages.label == Resources.ID_NULL) null
+ else
+ usage.appPermissionTimelineUsages.permissionApp.attributionLabels?.let {
+ it[usage.appPermissionTimelineUsages.label]
+ }
+
+ /** Builds a summary of the permission access. */
+ private fun buildUsageSummary(
+ subattributionLabel: String?,
+ proxyPackageLabel: String?,
+ durationSummary: String?,
+ context: Context
+ ): String? {
+ val subTextStrings: MutableList<String?> = mutableListOf()
+
+ subattributionLabel?.let { subTextStrings.add(subattributionLabel) }
+ proxyPackageLabel?.let { subTextStrings.add(it) }
+ durationSummary?.let { subTextStrings.add(it) }
+ return when (subTextStrings.size) {
+ 3 ->
+ context.getString(
+ R.string.history_preference_subtext_3,
+ subTextStrings[0],
+ subTextStrings[1],
+ subTextStrings[2])
+ 2 ->
+ context.getString(
+ R.string.history_preference_subtext_2, subTextStrings[0], subTextStrings[1])
+ 1 -> subTextStrings[0]
+ else -> null
}
- return groups
}
/**
- * Initialize the time filter to show the smallest entry greater than the time passed in as an
- * argument. If nothing is passed, this simply initializes the possible values.
+ * Builds a list of [AppPermissionTimelineUsages] from the provided
+ * [AppPermissionUsage.GroupUsage].
*/
- private fun initializeTimeFilter(context: Context) {
- filterTimes.add(
- TimeFilterItem(Long.MAX_VALUE,
- context.getString(R.string.permission_usage_any_time))
- )
- filterTimes.add(
- TimeFilterItem(DAYS.toMillis(7),
- context.getString(R.string.permission_usage_last_7_days))
- )
- filterTimes.add(
- TimeFilterItem(DAYS.toMillis(1),
- context.getString(R.string.permission_usage_last_day))
- )
- filterTimes.add(
- TimeFilterItem(TimeUnit.HOURS.toMillis(1),
- context.getString(R.string.permission_usage_last_hour))
- )
- filterTimes.add(
- TimeFilterItem(TimeUnit.MINUTES.toMillis(15),
- context.getString(R.string.permission_usage_last_15_minutes))
- )
- filterTimes.add(
- TimeFilterItem(TimeUnit.MINUTES.toMillis(1),
- context.getString(R.string.permission_usage_last_minute))
- )
+ private fun getAppPermissionTimelineUsages(
+ app: PermissionApp,
+ groupUsage: AppPermissionUsage.GroupUsage?
+ ): List<AppPermissionTimelineUsages> {
+ if (groupUsage == null) {
+ return listOf()
+ }
- // TODO: theianchen add code for filtering by time here.
+ if (shouldShowSubattributionForApp(app.appInfo)) {
+ return groupUsage.attributionLabelledGroupUsages.map {
+ AppPermissionTimelineUsages(
+ permissionGroup, app, listOf<TimelineUsage>(it), it.label)
+ }
+ }
+
+ return listOf(
+ AppPermissionTimelineUsages(
+ permissionGroup, app, listOf<TimelineUsage>(groupUsage), Resources.ID_NULL))
}
- /**
- * Factory for creating preferences to be added to the screen.
- */
- interface HistoryPreferenceFactory {
- /**
- * Returns a new [PreferenceCategory] representing a day of permission usage.
- */
- fun createDayCategoryPreference(): PreferenceCategory
-
- /**
- * Returns a preference representing an app's permission usage, including its timestamp and
- * usage details.
- */
- fun createPermissionHistoryPreference(
- historyPreferenceData: HistoryPreferenceData
- ): Preference
+ /** Extracts to a set all the permission groups declared by the platform. */
+ private fun List<AppPermissionUsage>.extractAllPlatformAppPermissionGroups():
+ Set<AppPermissionGroup> =
+ this.flatMap { it.groupUsages }
+ .map { it.group }
+ .filter { PermissionMapping.isPlatformPermissionGroup(it.name) }
+ .toSet()
+
+ /** Initialize all relevant [TimeFilterItemMs] values. */
+ private fun initializeTimeFilterItems(context: Context) {
+ mTimeFilterItemMs.add(
+ TimeFilterItemMs(Long.MAX_VALUE, context.getString(R.string.permission_usage_any_time)))
+ mTimeFilterItemMs.add(
+ TimeFilterItemMs(
+ DAYS.toMillis(7),
+ StringUtils.getIcuPluralsString(context, R.string.permission_usage_last_n_days, 7)))
+ mTimeFilterItemMs.add(
+ TimeFilterItemMs(
+ DAYS.toMillis(1),
+ StringUtils.getIcuPluralsString(context, R.string.permission_usage_last_n_days, 1)))
+
+ // TODO: theianchen add code for filtering by time here.
}
- /**
- * Data used to create a preference for an app's permission usage.
- */
+ /** Data used to create a preference for an app's permission usage. */
data class HistoryPreferenceData(
val userHandle: UserHandle,
val pkgName: String,
val appIcon: Drawable?,
val preferenceTitle: String,
val permissionGroup: String,
- val accessTime: String,
+ val accessEndTime: Long,
val summaryText: CharSequence?,
val showingAttribution: Boolean,
val accessTimeList: List<Long>,
val attributionTags: ArrayList<String>,
- val isLastUsage: Boolean,
val sessionId: Long
)
/**
* A class representing a given time, e.g., "in the last hour".
*
- * @param time the time represented by this object in milliseconds.
+ * @param timeMs the time represented by this object in milliseconds.
* @param label the label to describe the timeframe
*/
- data class TimeFilterItem(
- val time: Long,
- val label: String
+ data class TimeFilterItemMs(val timeMs: Long, val label: String)
+
+ /**
+ * Class containing all the information needed by the permission usage details fragments to
+ * render UI.
+ */
+ inner class PermissionUsageDetailsUiData(
+ /** List of [PermissionApp] instances */
+ // Note that these are used only to cache app data for the permission usage details
+ // fragment, and have no bearing on the UI on the main permission usage page.
+ val permissionApps: List<PermissionApp>,
+ /** Whether to show the "show/hide system" toggle. */
+ val shouldDisplayShowSystemToggle: Boolean,
+ /** [DiscreteAccessClusterData] instances ordered for display in UI */
+ private val discreteAccessClusterDataList: List<DiscreteAccessClusterData>,
+ ) {
+ // Note that the HistoryPreferenceData are not initialized within the
+ // PermissionUsageDetailsUiData instance as the need to be constructed only after the
+ // calling fragment loads the necessary PermissionApp instances. We will attempt to remove
+ // this dependency in b/240978905.
+ /** Builds a list of [HistoryPreferenceData] to be displayed in the UI. */
+ fun getHistoryPreferenceDataList(): List<HistoryPreferenceData> {
+ return discreteAccessClusterDataList.map {
+ this@PermissionUsageDetailsViewModel.getHistoryPreferenceData(it)
+ }
+ }
+ }
+
+ /**
+ * Data class representing a cluster of accesses, to be represented as a single entry in the UI.
+ */
+ data class DiscreteAccessClusterData(
+ val appPermissionTimelineUsages: AppPermissionTimelineUsages,
+ val endTime: Long,
+ val discreteAccessDataList: List<DiscreteAccessData>
)
- /** A class representing an app's usage for a group. */
- data class UsageData(
- val group: String,
+ /** Data class representing a discrete permission access. */
+ data class DiscreteAccessData(
+ val accessTimeMs: Long,
+ val accessDurationMs: Long,
+ val proxy: AppOpsManager.OpEventProxyInfo?
+ )
+
+ /** Data class representing an app's permissions usages for a particular permission group. */
+ data class AppPermissionTimelineUsages(
+ /** Permission group whose usage is being tracked. */
+ val permissionGroup: String,
// we need a PermissionApp because the loader takes the PermissionApp
// object and loads the icon and label information asynchronously
- val app: PermissionApp,
+ /** App whose permissions are being tracked. */
+ val permissionApp: PermissionApp,
+ /** Timeline usages for the given app and permission. */
val timelineUsages: List<TimelineUsage>,
val label: Int
) {
val attributionTags: java.util.ArrayList<String>
- get() = timelineUsages.stream()
- .map { obj: TimelineUsage -> obj.attributionTags }
- .filter { obj: List<String>? -> Objects.nonNull(obj) }
- .flatMap { obj: List<String> -> obj.stream() }
- .collect(Collectors.toCollection { ArrayList() })
+ get() = ArrayList(timelineUsages.mapNotNull { it.attributionTags }.flatten())
}
-
- /**
- * A class representing an app usage entry in Permission Usage.
- */
- data class AppPermissionUsageEntry(
- val usageData: UsageData,
- val endTime: Long,
- val clusteredAccessTimeList: MutableList<Triple<Long, Long, AppOpsManager.OpEventProxyInfo>>
- )
}
-/**
- * Factory for an [PermissionUsageDetailsViewModel]
- */
+/** Factory for an [PermissionUsageDetailsViewModel] */
@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageDetailsViewModelFactory(
private val application: Application,
@@ -576,7 +566,7 @@ class PermissionUsageDetailsViewModelFactory(
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
- return PermissionUsageDetailsViewModel(application, roleManager, filterGroup,
- sessionId) as T
+ return PermissionUsageDetailsViewModel(application, roleManager, filterGroup, sessionId)
+ as T
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
index 7aa6e1728..6287be2be 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
@@ -21,9 +21,6 @@ import android.app.LoaderManager
import android.app.role.RoleManager
import android.content.Context
import android.os.Build
-import android.util.ArrayMap
-import android.util.ArraySet
-import android.util.Log
import androidx.annotation.RequiresApi
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
@@ -31,7 +28,7 @@ import com.android.permissioncontroller.permission.model.AppPermissionGroup
import com.android.permissioncontroller.permission.model.legacy.PermissionApps.PermissionApp
import com.android.permissioncontroller.permission.model.v31.AppPermissionUsage
import com.android.permissioncontroller.permission.model.v31.PermissionUsages
-import com.android.permissioncontroller.permission.ui.handheld.v31.is7DayToggleEnabled
+import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
import com.android.permissioncontroller.permission.utils.PermissionMapping
import com.android.permissioncontroller.permission.utils.Utils
@@ -39,20 +36,22 @@ import java.time.Instant
import java.util.concurrent.TimeUnit
import kotlin.math.max
+/** [ViewModel] for Permission Usage fragments. */
@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageViewModel(val roleManager: RoleManager) : ViewModel() {
- companion object {
- private const val LOG_TAG = "PermissionUsageViewModel"
+ private val exemptedPackages: Set<String> = Utils.getExemptedPackages(roleManager)
+ /** Companion object for [PermissionUsageViewModel]. */
+ companion object {
/** TODO(ewol): Use the config setting to determine amount of time to show. */
private val TIME_FILTER_MILLIS = TimeUnit.DAYS.toMillis(7)
private val TIME_7_DAYS_DURATION = TimeUnit.DAYS.toMillis(7)
private val TIME_24_HOURS_DURATION = TimeUnit.DAYS.toMillis(1)
/** Permission groups that should be hidden from the permissions usage UI. */
private val EXEMPTED_PERMISSION_GROUPS = setOf(Manifest.permission_group.NOTIFICATIONS)
-
@JvmStatic
+ /** Map to represent ordering for permission groups in the permissions usage UI. */
val PERMISSION_GROUP_ORDER: Map<String, Int> =
mapOf(
Manifest.permission_group.LOCATION to 0,
@@ -61,6 +60,7 @@ class PermissionUsageViewModel(val roleManager: RoleManager) : ViewModel() {
private const val DEFAULT_ORDER = 3
}
+ /** Loads data from [PermissionUsages] using the [LoaderManager] pattern. */
fun loadPermissionUsages(
loaderManager: LoaderManager,
permissionUsages: PermissionUsages,
@@ -81,177 +81,157 @@ class PermissionUsageViewModel(val roleManager: RoleManager) : ViewModel() {
false /*sync*/)
}
- fun extractUsages(
- permissionUsages: List<AppPermissionUsage>,
+ /**
+ * Parses the provided list of [AppPermissionUsage] instances to build data for the UI to
+ * display.
+ */
+ fun buildPermissionUsagesUiData(
+ appPermissionUsages: List<AppPermissionUsage>,
show7Days: Boolean,
- showSystem: Boolean
- ): Triple<MutableMap<String, Int>, ArrayList<PermissionApp>, Boolean> {
+ showSystem: Boolean,
+ context: Context,
+ ): PermissionUsagesUiData {
val curTime = System.currentTimeMillis()
val showPermissionUsagesDuration =
- if (is7DayToggleEnabled() && show7Days) {
+ if (KotlinUtils.is7DayToggleEnabled() && show7Days) {
TIME_7_DAYS_DURATION
} else {
TIME_24_HOURS_DURATION
}
val startTime = max(curTime - showPermissionUsagesDuration, Instant.EPOCH.toEpochMilli())
- // Permission group to count mapping.
- val usages: MutableMap<String, Int> = HashMap()
- val permissionGroups: List<AppPermissionGroup> =
- getOSPermissionGroupsToDisplay(permissionUsages)
- for (i in permissionGroups.indices) {
- usages[permissionGroups[i].name] = 0
- }
- val permApps = ArrayList<PermissionApp>()
-
- val exemptedPackages = Utils.getExemptedPackages(roleManager)
-
- val seenSystemApp: Boolean =
- extractPermissionUsage(
- exemptedPackages, usages, permApps, startTime, permissionUsages, showSystem)
-
- return Triple(usages, permApps, seenSystemApp)
+ val filteredAppPermissionUsages =
+ appPermissionUsages.filter { !exemptedPackages.contains(it.packageName) }
+ val displayShowSystemToggle: Boolean =
+ filteredAppPermissionUsages.displayShowSystemToggle(startTime)
+ val permissionApps = filteredAppPermissionUsages.getRecentPermissionApps(startTime)
+ val orderedPermissionGroupsWithUsage =
+ filteredAppPermissionUsages.buildOrderedPermissionGroupsWithUsageCount(
+ context,
+ startTime,
+ showSystem
+ )
+
+ return PermissionUsagesUiData(
+ permissionApps,
+ displayShowSystemToggle,
+ orderedPermissionGroupsWithUsage
+ )
}
- fun createGroupUsagesList(
+ /**
+ * Creates an ordered list of [PermissionGroupWithUsageCount] instances to show in the UI,
+ * representing a mapping of permission groups to the number of apps that recently accessed
+ * them.
+ *
+ * The list is ordered as follows:
+ *
+ * 1. Location
+ * 2. Camera
+ * 3. Microphone
+ * 4. Remaining permission groups, ordered alphabetically
+ */
+ private fun List<AppPermissionUsage>.buildOrderedPermissionGroupsWithUsageCount(
context: Context,
- usages: Map<String, Int>
- ): List<Map.Entry<String, Int>> {
- val groupUsageNameToLabel: MutableMap<String, CharSequence> = HashMap()
- val groupUsagesList: MutableList<Map.Entry<String, Int>> = ArrayList(usages.entries)
- val usagesEntryCount = groupUsagesList.size
- for (usageEntryIndex in 0 until usagesEntryCount) {
- val (key) = groupUsagesList[usageEntryIndex]
- groupUsageNameToLabel[key] = getPermGroupLabel(context, key)
+ startTime: Long,
+ showSystem: Boolean
+ ): List<PermissionGroupWithUsageCount> {
+ val permissionGroupsUsageCountMap: MutableMap<String, Int> = HashMap()
+ extractPlatformAppPermissionGroupsToDisplay().forEach {
+ permissionGroupsUsageCountMap[it] = 0
}
- groupUsagesList.sortWith { e1: Map.Entry<String, Int>, e2: Map.Entry<String, Int> ->
- comparePermissionGroupUsage(e1, e2, groupUsageNameToLabel)
+ for (appUsage in this) {
+ appUsage.groupUsages
+ .filter { showSystem || !it.group.isSystem() }
+ .filter { !EXEMPTED_PERMISSION_GROUPS.contains(it.group.name) }
+ .filter { it.lastAccessTime >= startTime }
+ .forEach {
+ permissionGroupsUsageCountMap[it.group.name] =
+ permissionGroupsUsageCountMap.getOrDefault(it.group.name, 0) + 1
+ }
}
-
- return groupUsagesList
- }
-
- private fun comparePermissionGroupUsage(
- first: Map.Entry<String, Int>,
- second: Map.Entry<String, Int>,
- groupUsageNameToLabelMapping: Map<String, CharSequence>
- ): Int {
- val firstPermissionOrder = PERMISSION_GROUP_ORDER.getOrDefault(first.key, DEFAULT_ORDER)
- val secondPermissionOrder = PERMISSION_GROUP_ORDER.getOrDefault(second.key, DEFAULT_ORDER)
- return if (firstPermissionOrder != secondPermissionOrder) {
- firstPermissionOrder - secondPermissionOrder
- } else
- groupUsageNameToLabelMapping[first.key]
- .toString()
- .compareTo(groupUsageNameToLabelMapping[second.key].toString())
+ return permissionGroupsUsageCountMap.entries.map {
+ PermissionGroupWithUsageCount(
+ it.key,
+ it.value
+ )
+ }
+ .sortedWith(
+ compareBy(
+ { PERMISSION_GROUP_ORDER.getOrDefault(it.permGroup, DEFAULT_ORDER) },
+ { getPermGroupLabel(context, it.permGroup).toString() })
+ )
}
- /** Returns the permission groups declared by the OS that should be displayed in the UI. */
- private fun getOSPermissionGroupsToDisplay(
- permissionUsages: List<AppPermissionUsage>
- ): List<AppPermissionGroup> {
- val groups: MutableList<AppPermissionGroup> = java.util.ArrayList()
- val seenGroups: MutableSet<String> = ArraySet()
- val numGroups: Int = permissionUsages.size
- for (i in 0 until numGroups) {
- val appUsage: AppPermissionUsage = permissionUsages.get(i)
- val groupUsages = appUsage.groupUsages
- val groupUsageCount = groupUsages.size
- for (j in 0 until groupUsageCount) {
- val groupUsage = groupUsages[j]
- if (EXEMPTED_PERMISSION_GROUPS.contains(groupUsage.group.name)) {
- continue
- }
- if (PermissionMapping.isPlatformPermissionGroup(groupUsage.group.name)) {
- if (seenGroups.add(groupUsage.group.name)) {
- groups.add(groupUsage.group)
- }
- }
+ /** Extracts [PermissionApp] where there has been recent permission usage. */
+ private fun List<AppPermissionUsage>.getRecentPermissionApps(
+ startTime: Long,
+ ): java.util.ArrayList<PermissionApp> {
+ return ArrayList(
+ filter { appPermissionUsage ->
+ appPermissionUsage.groupUsages
+ .filter { !EXEMPTED_PERMISSION_GROUPS.contains(it.group.name) }
+ .any { it.lastAccessTime >= startTime || it.lastAccessTime == 0L }
}
- }
- return groups
+ .map { it.app })
}
/**
- * Extract the permission usages from mAppPermissionUsages and put the extracted usages into
- * usages and permApps. Returns whether we have seen a system app during the process.
- *
- * TODO: theianchen It's doing two things at the same method which is violating the SOLID
- * principle. We should fix this.
- *
- * @param exemptedPackages packages that are the role holders for exempted roles
- * @param usages an empty List that will be filled with permission usages.
- * @param permApps an empty List that will be filled with permission apps.
- * @return whether we have seen a system app.
+ * Returns whether there are any user-sensitive app permission groups with recent usage, and
+ * therefore if the "show/hide system" toggle needs to be displayed in the UI
*/
- private fun extractPermissionUsage(
- exemptedPackages: Set<String>,
- usages: MutableMap<String, Int>,
- permApps: java.util.ArrayList<PermissionApp>,
+ private fun List<AppPermissionUsage>.displayShowSystemToggle(
startTime: Long,
- permissionUsages: List<AppPermissionUsage>,
- showSystem: Boolean
): Boolean {
+ return flatMap { it.groupUsages }
+ .filter { !EXEMPTED_PERMISSION_GROUPS.contains(it.group.name) }
+ .filter { it.lastAccessTime > startTime && it.lastAccessTime > 0L }
+ .any { it.group.isSystem() }
+ }
- val mGroupAppCounts: ArrayMap<String?, Int> = ArrayMap()
- var seenSystemApp = false
- val numApps: Int = permissionUsages.size
- for (appNum in 0 until numApps) {
- val appUsage: AppPermissionUsage = permissionUsages.get(appNum)
- if (exemptedPackages.contains(appUsage.packageName)) {
- continue
- }
- var used = false
- val appGroups = appUsage.groupUsages
- val numGroups = appGroups.size
- for (groupNum in 0 until numGroups) {
- val groupUsage = appGroups[groupNum]
- val groupName = groupUsage.group.name
- if (EXEMPTED_PERMISSION_GROUPS.contains(groupName)) {
- continue
- }
- val lastAccessTime = groupUsage.lastAccessTime
- if (lastAccessTime == 0L) {
- Log.w(
- LOG_TAG,
- "Unexpected access time of 0 for ${appUsage.app.key} " +
- groupUsage.group.name)
- continue
- }
- if (lastAccessTime < startTime) {
- continue
- }
- val isSystemApp = !Utils.isGroupOrBgGroupUserSensitive(groupUsage.group)
- seenSystemApp = seenSystemApp || isSystemApp
+ /**
+ * Extracts to a set all the permission groups declared by the platform that should be displayed
+ * in the UI.
+ */
+ private fun List<AppPermissionUsage>.extractPlatformAppPermissionGroupsToDisplay():
+ Set<String> =
+ this.flatMap { it.groupUsages }
+ .map { it.group.name }
+ .filter { PermissionMapping.isPlatformPermissionGroup(it) }
+ .filter { !EXEMPTED_PERMISSION_GROUPS.contains(it) }
+ .toSet()
- // If not showing system apps, skip.
- if (!showSystem && isSystemApp) {
- continue
- }
- used = true
- addGroupUser(mGroupAppCounts, groupName)
- usages[groupName] = usages.getOrDefault(groupName, 0) + 1
- }
- if (used) {
- permApps.add(appUsage.app)
- addGroupUser(mGroupAppCounts, null)
- }
- }
- return seenSystemApp
- }
+ /**
+ * Returns whether the [AppPermissionGroup] is considered a system group.
+ *
+ * For the purpose of Permissions Hub UI, non user-sensitive [AppPermissionGroup]s are
+ * considered "system" and should be hidden from the main page unless requested by the user
+ * through the "show/hide system" toggle.
+ */
+ private fun AppPermissionGroup.isSystem() = !Utils.isGroupOrBgGroupUserSensitive(this)
+
+ /** Data class to hold all the information required to configure the UI. */
+ data class PermissionUsagesUiData(
+ /** List of [PermissionApp] instances */
+ // Note that these are used only to cache app data for the permission usage details
+ // fragment, and have no bearing on the UI on the main permission usage page.
+ val permissionApps: ArrayList<PermissionApp>,
+ /** Whether to show the "show/hide system" toggle. */
+ val displayShowSystemToggle: Boolean,
+ // TODO(b/243970988): Consider moving ordering logic to fragment.
+ /** [PermissionGroupWithUsageCount] instances ordered for display in UI */
+ val orderedPermissionGroupsWithUsageCount: List<PermissionGroupWithUsageCount>,
+ )
- private fun addGroupUser(groupAppCounts: ArrayMap<String?, Int>, app: String?) {
- val count: Int? = groupAppCounts[app]
- if (count == null) {
- groupAppCounts[app] = 1
- } else {
- groupAppCounts[app] = count + 1
- }
- }
+ /**
+ * Data class to associate permission groups with the number of apps that recently accessed
+ * them.
+ */
+ data class PermissionGroupWithUsageCount(val permGroup: String, val appCount: Int)
}
-/** Factory for a PermissionUsageViewModel */
+/** Factory for [PermissionUsageViewModel]. */
@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageViewModelFactory(private val roleManager: RoleManager) :
ViewModelProvider.Factory {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v33/SafetyCenterQsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v33/SafetyCenterQsViewModel.kt
index e263d310b..1d434fe7d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v33/SafetyCenterQsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v33/SafetyCenterQsViewModel.kt
@@ -235,7 +235,7 @@ class SafetyCenterQsViewModel(
}
/**
- * Factory for a SafetyCenterQsViewModel
+ * Factory for a SafetyCenterViewModel
*
* @param app The current application
* @param sessionId A session ID used in logs to identify this particular session
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt
index 5f385e064..b21b4cb88 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt
@@ -102,7 +102,7 @@ class TvUnusedAppsFragment : SettingsWithHeader(),
}
private fun createNoUnusedAppsPreference(): Preference {
- val preference = Preference(context)
+ val preference = Preference(requireContext())
preference.title = getString(R.string.zero_unused_apps)
preference.key = UNUSED_PREFERENCE_KEY
preference.isSelectable = false
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
index 82ad2494b..27e4b9701 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
@@ -35,6 +35,7 @@ import android.content.Intent
import android.content.Intent.ACTION_MAIN
import android.content.Intent.CATEGORY_INFO
import android.content.Intent.CATEGORY_LAUNCHER
+import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED
import android.content.pm.PackageManager.FLAG_PERMISSION_ONE_TIME
@@ -75,16 +76,16 @@ import com.android.permissioncontroller.permission.model.livedatatypes.LightPerm
import com.android.permissioncontroller.permission.model.livedatatypes.PermState
import com.android.permissioncontroller.permission.service.LocationAccessCheck
import com.android.permissioncontroller.permission.ui.handheld.SettingsWithLargeHeader
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.async
-import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicReference
import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
/**
* A set of util functions designed to work with kotlin, though they can work with java, as well.
*/
@@ -117,6 +118,116 @@ object KotlinUtils {
private val ONE_TIME_PACKAGE_IMPORTANCE_LEVEL_TO_KEEP_SESSION_ALIVE =
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE
+ /** Whether to show the Permissions Hub. */
+ private const val PROPERTY_PERMISSIONS_HUB_2_ENABLED = "permissions_hub_2_enabled"
+
+ /** Whether to show the mic and camera icons. */
+ private const val PROPERTY_CAMERA_MIC_ICONS_ENABLED = "camera_mic_icons_enabled"
+
+ /** Whether to show the location indicators. */
+ private const val PROPERTY_LOCATION_INDICATORS_ENABLED = "location_indicators_enabled"
+
+ /** Whether location accuracy feature is enabled */
+ private const val PROPERTY_LOCATION_ACCURACY_ENABLED = "location_accuracy_enabled"
+
+ /** Whether to show 7-day toggle in privacy hub. */
+ private const val PRIVACY_DASHBOARD_7_DAY_TOGGLE = "privacy_dashboard_7_day_toggle"
+
+ /** Default location precision */
+ private const val PROPERTY_LOCATION_PRECISION = "location_precision"
+
+ /**
+ * Whether the Permissions Hub 2 flag is enabled
+ *
+ * @return whether the flag is enabled
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun isPermissionsHub2FlagEnabled(): Boolean {
+ return SdkLevel.isAtLeastS() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_PERMISSIONS_HUB_2_ENABLED, false)
+ }
+ /**
+ * Whether to show the Permissions Dashboard
+ *
+ * @return whether to show the Permissions Dashboard.
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun shouldShowPermissionsDashboard(): Boolean {
+ return isPermissionsHub2FlagEnabled()
+ }
+
+ /**
+ * Whether the Camera and Mic Icons are enabled by flag.
+ *
+ * @return whether the Camera and Mic Icons are enabled.
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun isCameraMicIconsFlagEnabled(): Boolean {
+ return SdkLevel.isAtLeastS() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_CAMERA_MIC_ICONS_ENABLED, true)
+ }
+
+ /**
+ * Whether to show Camera and Mic Icons. They should be shown if the permission hub, or the icons
+ * specifically, are enabled.
+ *
+ * @return whether to show the icons.
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun shouldShowCameraMicIndicators(): Boolean {
+ return isCameraMicIconsFlagEnabled() || isPermissionsHub2FlagEnabled()
+ }
+
+ /**
+ * Whether the location indicators are enabled by flag.
+ *
+ * @return whether the location indicators are enabled by flag.
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun isLocationIndicatorsFlagEnabled(): Boolean {
+ return SdkLevel.isAtLeastS() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_LOCATION_INDICATORS_ENABLED, false)
+ }
+
+ /**
+ * Whether to show the location indicators. The location indicators are enable if the
+ * permission hub, or location indicator specifically are enabled.
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun shouldShowLocationIndicators(): Boolean {
+ return isLocationIndicatorsFlagEnabled() || isPermissionsHub2FlagEnabled()
+ }
+
+ /**
+ * Whether the location accuracy feature is enabled
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun isLocationAccuracyEnabled(): Boolean {
+ return SdkLevel.isAtLeastS() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_LOCATION_ACCURACY_ENABLED, true)
+ }
+
+ /**
+ * Default state of location precision
+ * true: default is FINE.
+ * false: default is COARSE.
+ */
+ fun getDefaultPrecision(): Boolean {
+ return !SdkLevel.isAtLeastS() || DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_LOCATION_PRECISION, true)
+ }
+
+ /**
+ * Whether we should enable the 7-day toggle in privacy dashboard
+ *
+ * @return whether the flag is enabled
+ */
+ @ChecksSdkIntAtLeast(Build.VERSION_CODES.S)
+ fun is7DayToggleEnabled(): Boolean {
+ return SdkLevel.isAtLeastS() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PRIVACY_DASHBOARD_7_DAY_TOGGLE, false)
+ }
+
/**
* Given a Map, and a List, determines which elements are in the list, but not the map, and
* vice versa. Used primarily for determining which liveDatas are already being watched, and
@@ -1196,6 +1307,69 @@ object KotlinUtils {
context.getDrawable(android.R.drawable.ic_safety_protection) != null &&
!context.getString(android.R.string.safety_protection_display_text).isNullOrEmpty()
}
+
+ // TODO(b/248124555): Make these filter only dangerous permissions.
+ fun addHealthPermissions(context: Context) {
+ val permissions = getDefinedHealthPerms(context.packageManager)
+ PermissionMapping.addHealthPermissionsToPlatform(permissions)
+ }
+
+ private fun getDefinedHealthPerms(packageManager: PackageManager): Set<String> {
+ val permissionInfos = getHealthPermissionControllerPermissionInfos(packageManager)
+ if (permissionInfos.isEmpty()) {
+ return emptySet()
+ }
+ val healthPermissionGroup = PermissionMapping.getHealthPermissionGroupString()
+ val definedHealthPerms: MutableSet<String> = hashSetOf()
+ for (permInfo in permissionInfos) {
+ if (healthPermissionGroup.equals(permInfo!!.group)) {
+ definedHealthPerms.add(permInfo.name)
+ }
+ }
+ return definedHealthPerms
+ }
+
+ /**
+ * Gets permission infos for all permissions defined by the health connect mainline module and
+ * part of the health connect modules' permission group.
+ */
+ private fun getHealthPermissionControllerPermissionInfos(packageManager: PackageManager):
+ List<PermissionInfo> {
+ val standardHealthPermissionInfo =
+ getPermissionInfoForStandardHealthPermission(packageManager)
+ if (standardHealthPermissionInfo?.packageName == null) {
+ return emptyList()
+ }
+
+ val standardHealthPermissionPackage = standardHealthPermissionInfo?.packageName!!
+ val healthPackageInfo: PackageInfo
+ try {
+ healthPackageInfo = packageManager.getPackageInfo(standardHealthPermissionPackage,
+ PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS.toLong()))
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.e(LOG_TAG, "HealthConnect permissions APK ($standardHealthPermissionPackage)" +
+ " not found")
+ return emptyList()
+ }
+
+ if (healthPackageInfo.permissions == null) {
+ Log.e(LOG_TAG, "No HealthConnect permissions defined in APK " +
+ "($standardHealthPermissionPackage)")
+ return emptyList()
+ }
+ return healthPackageInfo.permissions.toList()
+ }
+
+ private fun getPermissionInfoForStandardHealthPermission(packageManager: PackageManager):
+ PermissionInfo? {
+ return try {
+ packageManager.getPermissionInfo(PermissionMapping.getManageHealthPermissionsName(), 0)
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.e(LOG_TAG, "HealthConnect permission " +
+ "${PermissionMapping.getManageHealthPermissionsName()}) not found")
+ null
+ }
+ }
}
/**
@@ -1267,4 +1441,4 @@ fun NavController.navigateSafe(destResId: Int, args: Bundle? = null) {
navigate(destResId, args)
}
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/PermissionMapping.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/PermissionMapping.kt
index fa7cbec6d..79c61d463 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/PermissionMapping.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/PermissionMapping.kt
@@ -52,6 +52,15 @@ object PermissionMapping {
/** Set of groups that will be able to receive one-time grant */
private val ONE_TIME_PERMISSION_GROUPS: MutableSet<String> = mutableSetOf()
+ private val HEALTH_PERMISSIONS_SET: MutableSet<String> = mutableSetOf()
+
+ // TODO(b/248124555): Set this programmatically when we get an API for this.
+ private const val HEALTH_PERMISSION_GROUP_STRING: String = "android.permission-group.HEALTH"
+
+ // TODO(b/248124555): Set this programmatically when we get an API for this.
+ private const val MANAGE_HEALTH_PERMISSIONS_NAME: String =
+ "android.permission.MANAGE_HEALTH_PERMISSIONS"
+
init {
PLATFORM_PERMISSIONS[Manifest.permission.READ_CONTACTS] = Manifest.permission_group.CONTACTS
PLATFORM_PERMISSIONS[Manifest.permission.WRITE_CONTACTS] =
@@ -274,4 +283,48 @@ object PermissionMapping {
fun supportsOneTimeGrant(permissionGroup: String?): Boolean {
return ONE_TIME_PERMISSION_GROUPS.contains(permissionGroup)
}
+
+ /**
+ * Returns the string representing the health permission group is defined.
+ */
+ @JvmStatic
+ fun getHealthPermissionGroupString(): String {
+ return HEALTH_PERMISSION_GROUP_STRING
+ }
+
+ /**
+ * Gets the name of the health permission, that is guaranteed to be defined in
+ * the health connect module. Will be used to infer the package name of the health connect
+ * module.
+ */
+ @JvmStatic
+ fun getManageHealthPermissionsName(): String {
+ return MANAGE_HEALTH_PERMISSIONS_NAME
+ }
+
+ /**
+ * Adds health permissions as platform permissions.
+ */
+ @JvmStatic
+ fun addHealthPermissionsToPlatform(permissions: Set<String>) {
+ if (permissions.isEmpty()) {
+ return
+ }
+
+ PLATFORM_PERMISSION_GROUPS[HEALTH_PERMISSION_GROUP_STRING] = mutableListOf()
+
+ for (permission in permissions) {
+ PLATFORM_PERMISSIONS[permission] = HEALTH_PERMISSION_GROUP_STRING
+ PLATFORM_PERMISSION_GROUPS[HEALTH_PERMISSION_GROUP_STRING]?.add(permission)
+ HEALTH_PERMISSIONS_SET.add(permission)
+ }
+ }
+
+ /**
+ * Returns true if the given permission is a health platform permission.
+ */
+ @JvmStatic
+ fun isHealthPermission(permissionName: String): Boolean {
+ return HEALTH_PERMISSIONS_SET.contains(permissionName)
+ }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
index 8f5a70ca0..e5041bfbb 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
@@ -87,6 +87,7 @@ import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
+import androidx.annotation.ChecksSdkIntAtLeast;
import androidx.annotation.ColorRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
@@ -168,6 +169,11 @@ public final class Utils {
private static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED =
"location_access_check_enabled";
+ /** Whether to show health permission in various permission controller UIs. */
+ private static final String PROPERTY_HEALTH_PERMISSION_UI_ENABLED =
+ "health_permission_ui_enabled";
+
+
/** How frequently to check permission event store to scrub old data */
public static final String PROPERTY_PERMISSION_EVENTS_CHECK_OLD_FREQUENCY_MILLIS =
"permission_events_check_old_frequency_millis";
@@ -923,6 +929,16 @@ public final class Utils {
}
/**
+ * Whether we should show health permissions as platform permissions in the various
+ * permission controller UI.
+ */
+ @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codename = "UpsideDownCake")
+ public static boolean isHealthPermissionUiEnabled() {
+ return SdkLevel.isAtLeastU() && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ PROPERTY_HEALTH_PERMISSION_UI_ENABLED, false);
+ }
+
+ /**
* Get a device protected storage based shared preferences. Avoid storing sensitive data in it.
*
* @param context the context to get the shared preferences
diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
index e8d98cd53..a1a4873a3 100644
--- a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
@@ -903,13 +903,12 @@ class AccessibilityJobService : JobService() {
override fun onCreate() {
super.onCreate()
- if (DEBUG) {
- Log.v(LOG_TAG, "accessibility privacy source job created.")
- }
+ Log.v(LOG_TAG, "accessibility privacy source job created.")
mSourceService = AccessibilitySourceService(this)
}
override fun onStartJob(params: JobParameters?): Boolean {
+ Log.v(LOG_TAG, "accessibility privacy source job started.")
synchronized(mLock) {
if (mCurrentJob != null) {
Log.v(LOG_TAG, "Accessibility privacy source job already running")
diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt b/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt
index c5e92eed7..4e2228da2 100644
--- a/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt
+++ b/PermissionController/src/com/android/permissioncontroller/privacysources/NotificationListenerCheck.kt
@@ -90,8 +90,7 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
private val TAG = "NotificationListenerCheck"
-private const val DEBUG = false
-
+private const val DEBUG = true
const val SC_NLS_SOURCE_ID = "AndroidNotificationListener"
@VisibleForTesting const val SC_NLS_DISABLE_ACTION_ID = "disable_nls_component"
@@ -545,7 +544,7 @@ internal class NotificationListenerCheckInternal(
.setDeleteIntent(deletePendingIntent)
.setContentIntent(clickPendingIntent)
- if (appLabel.isNotEmpty()) {
+ if (appLabel != null && appLabel.isNotEmpty()) {
val appNameExtras = Bundle()
appNameExtras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME, appLabel.toString())
b.addExtras(appNameExtras)
@@ -840,7 +839,7 @@ class NotificationListenerCheckJobService : JobService() {
override fun onCreate() {
super.onCreate()
-
+ if (DEBUG) Log.d(TAG, "Nls privacy job created")
if (!checkNotificationListenerCheckEnabled(this)) {
// NotificationListenerCheck not enabled. End job.
return
@@ -865,6 +864,7 @@ class NotificationListenerCheckJobService : JobService() {
* @return `false` if another check is already running, or if SDK Check fails (below T)
*/
override fun onStartJob(params: JobParameters): Boolean {
+ if (DEBUG) Log.d(TAG, "Nls privacy job started")
if (!checkNotificationListenerCheckEnabled(this)) {
// NotificationListenerCheck not enabled. End job.
return false
diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/TEST_MAPPING b/PermissionController/src/com/android/permissioncontroller/privacysources/TEST_MAPPING
index 66466488f..921ef7d6a 100644
--- a/PermissionController/src/com/android/permissioncontroller/privacysources/TEST_MAPPING
+++ b/PermissionController/src/com/android/permissioncontroller/privacysources/TEST_MAPPING
@@ -40,6 +40,16 @@
]
}
],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
+ ],
"postsubmit": [
{
"name": "CtsPermissionTestCases",
diff --git a/PermissionController/src/com/android/permissioncontroller/role/Role.md b/PermissionController/src/com/android/permissioncontroller/role/Role.md
index 9e867e341..fa9188a1e 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/Role.md
+++ b/PermissionController/src/com/android/permissioncontroller/role/Role.md
@@ -61,8 +61,10 @@ is optional and defaults to `false`.
- `label`: The string resource for the label of the role, e.g. `@string/role_sms_label`, which says
"Default SMS app". For default apps, this string will appear in the default app detail page as the
title. This attribute is required if the role is `visible`.
-- `minSdkVersion`: The minimum SDK version for the role to be available, e.g. `31` for Android S.
-This attribute is optional and defaults to `Build.VERSION_CODES.BASE`.
+- `maxSdkVersion`: The maximum SDK version for the role to be available (inclusive), e.g. `31` for
+Android S. This attribute is optional and defaults to `Build.VERSION_CODES.CUR_DEVELOPMENT`.
+- `minSdkVersion`: The minimum SDK version for the role to be available (inclusive), e.g. `31` for
+Android S. This attribute is optional and defaults to `Build.VERSION_CODES.BASE`.
- `requestDescription`: The string resource for the description in the request role dialog, e.g.
`@string/role_sms_request_description`, which says "Gets access to contacts, SMS, phone". This
description should describe to the user the privileges that are going to be granted, and should not
@@ -86,7 +88,7 @@ defaults to `false`.
- `static`: Whether this role is static, i.e. the role will always be assigned to its default
holders. This attribute is optional and defaults to `false`.
- `systemOnly`: Whether this role only allows system apps to hold it. This attribute is optional and
-defaults to `false.
+defaults to `false`.
- `visible`: Whether this role is visible to users. If a role is invisible (a.k.a. hidden) to users,
users won't be able to find it in Settings, and apps won't be able to request it. The role can still
be managed by system APIs and shell command.
@@ -172,6 +174,7 @@ dumpsys role
You can also manage the role holders with `cmd role`:
```bash
+cmd role get-role-holders [--user USER_ID] ROLE
cmd role add-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]
cmd role remove-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]
cmd role clear-role-holders [--user USER_ID] ROLE [FLAGS]
diff --git a/PermissionController/src/com/android/permissioncontroller/role/TEST_MAPPING b/PermissionController/src/com/android/permissioncontroller/role/TEST_MAPPING
index 43d15a49e..d7718a2f2 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/TEST_MAPPING
+++ b/PermissionController/src/com/android/permissioncontroller/role/TEST_MAPPING
@@ -8,5 +8,22 @@
}
]
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsRoleTestCases[com.google.android.permission.apex]",
+ "options": [
+ // TODO(b/238677748): These two tests currently fails on R base image
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList"
+ },
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#removeSmsRoleHolderThenPermissionIsRevoked"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/BrowserRoleBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/model/BrowserRoleBehavior.java
index 9d4d9e08b..109983539 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/BrowserRoleBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/BrowserRoleBehavior.java
@@ -136,8 +136,8 @@ public class BrowserRoleBehavior implements RoleBehavior {
// #grantDefaultPermissionsToDefaultBrowser(java.lang.String, int)
if (SdkLevel.isAtLeastS()) {
if (PackageUtils.isSystemPackage(packageName, context)) {
- Permissions.grant(packageName, SYSTEM_BROWSER_PERMISSIONS, false, false, false,
- true, false, context);
+ Permissions.grant(packageName, SYSTEM_BROWSER_PERMISSIONS, false, false, true,
+ false, false, context);
}
}
}
@@ -146,7 +146,7 @@ public class BrowserRoleBehavior implements RoleBehavior {
public void revoke(@NonNull Role role, @NonNull String packageName, @NonNull Context context) {
if (SdkLevel.isAtLeastT()) {
if (PackageUtils.isSystemPackage(packageName, context)) {
- Permissions.revoke(packageName, SYSTEM_BROWSER_PERMISSIONS, false, true, false,
+ Permissions.revoke(packageName, SYSTEM_BROWSER_PERMISSIONS, true, false, false,
context);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/Permission.java b/PermissionController/src/com/android/permissioncontroller/role/model/Permission.java
index ae1b6d0e9..98c023be1 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/Permission.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/Permission.java
@@ -60,9 +60,9 @@ public class Permission {
* @return whether this permission is available
*/
public boolean isAvailable() {
- // Workaround to match the value 33+ for T+ in roles.xml before SDK finalization.
- if (mMinSdkVersion >= 33) {
- return SdkLevel.isAtLeastT();
+ // Workaround to match the value 34+ for U+ in roles.xml before SDK finalization.
+ if (mMinSdkVersion >= 34) {
+ return SdkLevel.isAtLeastU();
} else {
return Build.VERSION.SDK_INT >= mMinSdkVersion;
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/RequiredComponent.java b/PermissionController/src/com/android/permissioncontroller/role/model/RequiredComponent.java
index 361727d59..65c8276e5 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/RequiredComponent.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/RequiredComponent.java
@@ -101,9 +101,9 @@ public abstract class RequiredComponent {
* @return whether this required component is available
*/
public boolean isAvailable() {
- // Workaround to match the value 33+ for T+ in roles.xml before SDK finalization.
- if (mMinTargetSdkVersion >= 33) {
- return SdkLevel.isAtLeastT();
+ // Workaround to match the value 34+ for U+ in roles.xml before SDK finalization.
+ if (mMinTargetSdkVersion >= 34) {
+ return SdkLevel.isAtLeastU();
} else {
return Build.VERSION.SDK_INT >= mMinTargetSdkVersion;
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/Role.java b/PermissionController/src/com/android/permissioncontroller/role/model/Role.java
index de6112e5e..ddd7ff6b5 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/Role.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/Role.java
@@ -124,6 +124,11 @@ public class Role {
private final int mLabelResource;
/**
+ * The maximum SDK version for this role to be available.
+ */
+ private final int mMaxSdkVersion;
+
+ /**
* The minimum SDK version for this role to be available.
*/
private final int mMinSdkVersion;
@@ -221,11 +226,12 @@ public class Role {
public Role(@NonNull String name, boolean allowBypassingQualification,
@Nullable RoleBehavior behavior, @Nullable String defaultHoldersResourceName,
@StringRes int descriptionResource, boolean exclusive, boolean fallBackToDefaultHolder,
- @StringRes int labelResource, int minSdkVersion, boolean overrideUserWhenGranting,
- @StringRes int requestDescriptionResource, @StringRes int requestTitleResource,
- boolean requestable, @StringRes int searchKeywordsResource,
- @StringRes int shortLabelResource, boolean showNone, boolean statik, boolean systemOnly,
- boolean visible, @NonNull List<RequiredComponent> requiredComponents,
+ @StringRes int labelResource, int maxSdkVersion, int minSdkVersion,
+ boolean overrideUserWhenGranting, @StringRes int requestDescriptionResource,
+ @StringRes int requestTitleResource, boolean requestable,
+ @StringRes int searchKeywordsResource, @StringRes int shortLabelResource,
+ boolean showNone, boolean statik, boolean systemOnly, boolean visible,
+ @NonNull List<RequiredComponent> requiredComponents,
@NonNull List<Permission> permissions, @NonNull List<String> appOpPermissions,
@NonNull List<AppOp> appOps, @NonNull List<PreferredActivity> preferredActivities) {
mName = name;
@@ -236,6 +242,7 @@ public class Role {
mExclusive = exclusive;
mFallBackToDefaultHolder = fallBackToDefaultHolder;
mLabelResource = labelResource;
+ mMaxSdkVersion = maxSdkVersion;
mMinSdkVersion = minSdkVersion;
mOverrideUserWhenGranting = overrideUserWhenGranting;
mRequestDescriptionResource = requestDescriptionResource;
@@ -380,11 +387,12 @@ public class Role {
* @return whether this role is available based on SDK version
*/
boolean isAvailableBySdkVersion() {
- // Workaround to match the value 33+ for T+ in roles.xml before SDK finalization.
- if (mMinSdkVersion >= 33) {
- return SdkLevel.isAtLeastT();
+ // Workaround to match the value 34+ for U+ in roles.xml before SDK finalization.
+ if (mMinSdkVersion >= 34) {
+ return SdkLevel.isAtLeastU();
} else {
- return Build.VERSION.SDK_INT >= mMinSdkVersion;
+ return Build.VERSION.SDK_INT >= mMinSdkVersion
+ && Build.VERSION.SDK_INT <= mMaxSdkVersion;
}
}
@@ -1060,6 +1068,7 @@ public class Role {
+ ", mExclusive=" + mExclusive
+ ", mFallBackToDefaultHolder=" + mFallBackToDefaultHolder
+ ", mLabelResource=" + mLabelResource
+ + ", mMaxSdkVersion=" + mMaxSdkVersion
+ ", mMinSdkVersion=" + mMinSdkVersion
+ ", mOverrideUserWhenGranting=" + mOverrideUserWhenGranting
+ ", mRequestDescriptionResource=" + mRequestDescriptionResource
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/RoleParser.java b/PermissionController/src/com/android/permissioncontroller/role/model/RoleParser.java
index 3d5e2e89c..3fac0b578 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/RoleParser.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/RoleParser.java
@@ -80,6 +80,7 @@ public class RoleParser {
private static final String ATTRIBUTE_EXCLUSIVE = "exclusive";
private static final String ATTRIBUTE_FALL_BACK_TO_DEFAULT_HOLDER = "fallBackToDefaultHolder";
private static final String ATTRIBUTE_LABEL = "label";
+ private static final String ATTRIBUTE_MAX_SDK_VERSION = "maxSdkVersion";
private static final String ATTRIBUTE_MIN_SDK_VERSION = "minSdkVersion";
private static final String ATTRIBUTE_OVERRIDE_USER_WHEN_GRANTING = "overrideUserWhenGranting";
private static final String ATTRIBUTE_QUERY_FLAGS = "queryFlags";
@@ -350,8 +351,17 @@ public class RoleParser {
boolean fallBackToDefaultHolder = getAttributeBooleanValue(parser,
ATTRIBUTE_FALL_BACK_TO_DEFAULT_HOLDER, false);
+ int maxSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_MAX_SDK_VERSION,
+ Build.VERSION_CODES.CUR_DEVELOPMENT);
int minSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_MIN_SDK_VERSION,
Build.VERSION_CODES.BASE);
+ if (minSdkVersion > maxSdkVersion) {
+ throwOrLogMessage("minSdkVersion " + minSdkVersion
+ + " cannot be greater than maxSdkVersion " + maxSdkVersion + " for role: "
+ + name);
+ skipCurrentTag(parser);
+ return null;
+ }
boolean overrideUserWhenGranting = getAttributeBooleanValue(parser,
ATTRIBUTE_OVERRIDE_USER_WHEN_GRANTING, false);
@@ -478,7 +488,7 @@ public class RoleParser {
}
return new Role(name, allowBypassingQualification, behavior, defaultHoldersResourceName,
descriptionResource, exclusive, fallBackToDefaultHolder, labelResource,
- minSdkVersion, overrideUserWhenGranting, requestDescriptionResource,
+ maxSdkVersion, minSdkVersion, overrideUserWhenGranting, requestDescriptionResource,
requestTitleResource, requestable, searchKeywordsResource, shortLabelResource,
showNone, statik, systemOnly, visible, requiredComponents, permissions,
appOpPermissions, appOps, preferredActivities);
diff --git a/PermissionController/src/com/android/permissioncontroller/role/model/SmsRoleBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/model/SmsRoleBehavior.java
index 1515945c1..341c2d032 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/model/SmsRoleBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/model/SmsRoleBehavior.java
@@ -54,9 +54,16 @@ public class SmsRoleBehavior implements RoleBehavior {
@Override
public boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
@NonNull Context context) {
- if (UserUtils.isProfile(user, context)) {
- return false;
+ if (SdkLevel.isAtLeastU()) {
+ if (UserUtils.isCloneProfile(user, context)) {
+ return false;
+ }
+ } else {
+ if (UserUtils.isProfile(user, context)) {
+ return false;
+ }
}
+
UserManager userManager = context.getSystemService(UserManager.class);
if (userManager.isRestrictedProfile(user)) {
return false;
diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
index cd7a6b8a5..e89470ff6 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java
@@ -39,16 +39,41 @@ public class UserUtils {
/**
* Check whether a user is a profile.
*
- * @param user the user to check
+ * @param user the user to check
* @param context the {@code Context} to retrieve system services
- *
* @return whether the user is a profile
*/
public static boolean isProfile(@NonNull UserHandle user, @NonNull Context context) {
+ return isManagedProfile(user, context) || isCloneProfile(user, context);
+ }
+
+ /**
+ * Check whether a user is a managed profile.
+ *
+ * @param user the user to check
+ * @param context the {@code Context} to retrieve system services
+ * @return whether the user is a managed profile
+ */
+ public static boolean isManagedProfile(@NonNull UserHandle user, @NonNull Context context) {
Context userContext = getUserContext(context, user);
UserManager userUserManager = userContext.getSystemService(UserManager.class);
- return userUserManager.isManagedProfile(user.getIdentifier()) || (
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && userUserManager.isCloneProfile());
+ return userUserManager.isManagedProfile(user.getIdentifier());
+ }
+
+ /**
+ * Check whether a user is a clone profile.
+ *
+ * @param user the user to check
+ * @param context the {@code Context} to retrieve system services
+ * @return whether the user is a clone profile
+ */
+ public static boolean isCloneProfile(@NonNull UserHandle user, @NonNull Context context) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ return false;
+ }
+ Context userContext = getUserContext(context, user);
+ UserManager userUserManager = userContext.getSystemService(UserManager.class);
+ return userUserManager.isCloneProfile();
}
/**
@@ -92,11 +117,7 @@ public class UserUtils {
if (Process.myUserHandle().equals(user)) {
return context;
} else {
- try {
- return context.createPackageContextAsUser(context.getPackageName(), 0, user);
- } catch (PackageManager.NameNotFoundException doesNotHappen) {
- throw new IllegalStateException(doesNotHappen);
- }
+ return context.createContextAsUser(user, 0);
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/TEST_MAPPING b/PermissionController/src/com/android/permissioncontroller/safetycenter/TEST_MAPPING
index 5a26efe66..5feb2e901 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/TEST_MAPPING
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/TEST_MAPPING
@@ -13,5 +13,15 @@
{
"name": "CtsSafetyCenterTestCases"
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
index c9024cd30..cd3e3639d 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java
@@ -15,8 +15,10 @@
*/
package com.android.permissioncontroller.safetycenter.ui;
+import static android.content.Intent.ACTION_SAFETY_CENTER;
import static android.content.Intent.FLAG_ACTIVITY_FORWARD_RESULT;
import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID;
import static com.android.permissioncontroller.PermissionControllerStatsLog.PRIVACY_SIGNAL_NOTIFICATION_INTERACTION;
import static com.android.permissioncontroller.PermissionControllerStatsLog.PRIVACY_SIGNAL_NOTIFICATION_INTERACTION__ACTION__NOTIFICATION_CLICKED;
@@ -65,7 +67,13 @@ public final class SafetyCenterActivity extends CollapsingToolbarBaseActivity {
}
Fragment frag;
- if (getIntent().getAction().equals(PRIVACY_CONTROLS_ACTION)) {
+ if (SafetyCenterUiFlags.getShowSubpages()
+ && getIntent().getAction().equals(ACTION_SAFETY_CENTER)
+ && getIntent().hasExtra(EXTRA_SAFETY_SOURCES_GROUP_ID)) {
+ frag =
+ new SafetyCenterSubpageFragment(
+ getIntent().getStringExtra(EXTRA_SAFETY_SOURCES_GROUP_ID));
+ } else if (getIntent().getAction().equals(PRIVACY_CONTROLS_ACTION)) {
setTitle(R.string.privacy_controls_title);
frag = PrivacyControlsFragment.newInstance();
} else {
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
index 92001b5fb..eac35a9ba 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java
@@ -38,7 +38,6 @@ import android.safetycenter.SafetyCenterErrorDetails;
import android.safetycenter.SafetyCenterIssue;
import android.safetycenter.SafetyCenterStaticEntry;
import android.safetycenter.SafetyCenterStaticEntryGroup;
-import android.safetycenter.SafetyCenterStatus;
import android.util.Log;
import android.widget.Toast;
@@ -58,6 +57,7 @@ import com.android.permissioncontroller.R;
import com.android.permissioncontroller.safetycenter.ui.model.LiveSafetyCenterViewModelFactory;
import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterUiData;
import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterViewModel;
+import com.android.permissioncontroller.safetycenter.ui.model.StatusUiData;
import com.android.safetycenter.internaldata.SafetyCenterIds;
import com.android.safetycenter.resources.SafetyCenterResourcesContext;
@@ -174,11 +174,6 @@ public final class SafetyCenterDashboardFragment extends PreferenceFragmentCompa
mSafetyStatusPreference =
requireNonNull(getPreferenceScreen().findPreference(SAFETY_STATUS_KEY));
- // TODO: Use real strings here, or set more sensible defaults in the layout
- mSafetyStatusPreference.setSafetyStatus(
- new SafetyCenterStatus.Builder("Looks good", "")
- .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN)
- .build());
mSafetyStatusPreference.setViewModel(mViewModel);
mIssuesGroup = getPreferenceScreen().findPreference(ISSUES_GROUP_KEY);
@@ -191,6 +186,7 @@ public final class SafetyCenterDashboardFragment extends PreferenceFragmentCompa
mStaticEntriesGroup = null;
}
+ mViewModel.getStatusUiLiveData().observe(this, this::updateStatus);
mViewModel.getSafetyCenterUiLiveData().observe(this, this::renderSafetyCenterData);
mViewModel.getErrorLiveData().observe(this, this::displayErrorDetails);
@@ -256,6 +252,21 @@ public final class SafetyCenterDashboardFragment extends PreferenceFragmentCompa
return mViewModel;
}
+ private void updateStatus(StatusUiData statusUiData) {
+ if (mIsQuickSettingsFragment) {
+ SafetyCenterResourcesContext safetyCenterResourcesContext =
+ new SafetyCenterResourcesContext(requireContext());
+ boolean hasPendingActions =
+ safetyCenterResourcesContext
+ .getStringByName("overall_severity_level_ok_review_summary")
+ .equals(statusUiData.getOriginalSummary().toString());
+
+ statusUiData = statusUiData.copyForPendingActions(hasPendingActions);
+ }
+
+ mSafetyStatusPreference.setData(statusUiData);
+ }
+
private void renderSafetyCenterData(@Nullable SafetyCenterUiData uiData) {
if (uiData == null) return;
SafetyCenterData data = uiData.getSafetyCenterData();
@@ -267,37 +278,13 @@ public final class SafetyCenterDashboardFragment extends PreferenceFragmentCompa
return;
}
- mSafetyStatusPreference.setSafetyData(data);
-
// TODO(b/208212820): Only update entries that have changed since last
// update, rather than deleting and re-adding all.
updateIssues(context, data.getIssues(), uiData.getResolvedIssues());
+
if (!mIsQuickSettingsFragment) {
updateSafetyEntries(context, data.getEntriesOrGroups());
updateStaticSafetyEntries(context, data.getStaticEntryGroups());
- } else {
- SafetyCenterResourcesContext safetyCenterResourcesContext =
- new SafetyCenterResourcesContext(context);
- boolean hasSettingsToReview =
- safetyCenterResourcesContext
- .getStringByName("overall_severity_level_ok_review_summary")
- .equals(data.getStatus().getSummary().toString());
- setPendingActionState(hasSettingsToReview);
- }
- }
-
- /** Determine if there are pending actions and set pending actions state */
- private void setPendingActionState(boolean hasSettingsToReview) {
- if (hasSettingsToReview) {
- mSafetyStatusPreference.setHasPendingActions(
- true,
- l -> {
- mViewModel.navigateToSafetyCenter(
- this, NavigationSource.QUICK_SETTINGS_TILE);
- mViewModel.getInteractionLogger().record(Action.REVIEW_SETTINGS_CLICKED);
- });
- } else {
- mSafetyStatusPreference.setHasPendingActions(false, null);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterQsFragment.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterQsFragment.java
index 265845aec..d6015ffae 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterQsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterQsFragment.java
@@ -174,22 +174,24 @@ public class SafetyCenterQsFragment extends Fragment {
securitySettings.setOnClickListener(
(v) ->
mSafetyCenterViewModel.navigateToSafetyCenter(
- this, NavigationSource.QUICK_SETTINGS_TILE));
- TextView securitySettingsText =
- securitySettings.findViewById(R.id.toggle_sensor_name);
+ mContext, NavigationSource.QUICK_SETTINGS_TILE));
+ TextView securitySettingsText = securitySettings.findViewById(R.id.toggle_sensor_name);
securitySettingsText.setText(R.string.settings);
securitySettingsText.setSelected(true);
securitySettings.findViewById(R.id.toggle_sensor_status).setVisibility(View.GONE);
- ImageView securitySettingsIcon =
- securitySettings.findViewById(R.id.toggle_sensor_icon);
- securitySettingsIcon.setImageDrawable(Utils.applyTint(mContext,
- mContext.getDrawable(R.drawable.ic_safety_center_shield),
- android.R.attr.textColorPrimaryInverse));
+ ImageView securitySettingsIcon = securitySettings.findViewById(R.id.toggle_sensor_icon);
+ securitySettingsIcon.setImageDrawable(
+ Utils.applyTint(
+ mContext,
+ mContext.getDrawable(R.drawable.ic_safety_center_shield),
+ android.R.attr.textColorPrimaryInverse));
securitySettings.findViewById(R.id.arrow_icon).setVisibility(View.VISIBLE);
((ImageView) securitySettings.findViewById(R.id.arrow_icon))
- .setImageDrawable(Utils.applyTint(mContext,
- mContext.getDrawable(R.drawable.ic_chevron_right),
- android.R.attr.textColorSecondaryInverse));
+ .setImageDrawable(
+ Utils.applyTint(
+ mContext,
+ mContext.getDrawable(R.drawable.ic_chevron_right),
+ android.R.attr.textColorSecondaryInverse));
ViewCompat.replaceAccessibilityAction(
securitySettings,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK,
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt
new file mode 100644
index 000000000..22c31aebb
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterSubpageFragment.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.safetycenter.ui
+
+import android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE
+import android.os.Bundle
+import android.safetycenter.SafetyCenterEntryGroup
+import android.safetycenter.SafetyCenterEntryOrGroup
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProvider
+import androidx.preference.PreferenceFragmentCompat
+import com.android.permissioncontroller.R
+import com.android.permissioncontroller.safetycenter.ui.model.LiveSafetyCenterViewModelFactory
+import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterUiData
+import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterViewModel
+import com.android.safetycenter.internaldata.SafetyCenterIds
+
+/** A fragment that represents a generic subpage in Safety Center. */
+@RequiresApi(UPSIDE_DOWN_CAKE)
+class SafetyCenterSubpageFragment(private val sourceGroupId: String) : PreferenceFragmentCompat() {
+
+ private lateinit var viewModel: SafetyCenterViewModel
+
+ override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+ setPreferencesFromResource(R.xml.safety_center_subpage, rootKey)
+
+ viewModel =
+ ViewModelProvider(
+ requireActivity(),
+ LiveSafetyCenterViewModelFactory(requireActivity().getApplication()))
+ .get(SafetyCenterViewModel::class.java)
+ viewModel.safetyCenterUiLiveData.observe(
+ this,
+ Observer { uiData: SafetyCenterUiData? -> this.renderSafetyCenterEntryGroup(uiData) })
+ }
+
+ private fun renderSafetyCenterEntryGroup(uiData: SafetyCenterUiData?) {
+ val entryGroup = getMatchingGroup(uiData, sourceGroupId)
+ if (entryGroup == null) {
+ Log.w(TAG, "$sourceGroupId doesn't match any of the existing SafetySourcesGroup IDs")
+ requireActivity().getFragmentManager().popBackStack()
+ }
+ requireActivity().setTitle(entryGroup!!.title)
+ }
+
+ private fun getMatchingGroup(
+ uiData: SafetyCenterUiData?,
+ sourceGroupId: String
+ ): SafetyCenterEntryGroup? {
+ val entryOrGroups: List<SafetyCenterEntryOrGroup>? =
+ uiData?.safetyCenterData?.entriesOrGroups
+ val entryGroups = entryOrGroups?.mapNotNull { it.entryGroup }
+ return entryGroups?.find {
+ SafetyCenterIds.entryGroupIdFromString(it.id).getSafetySourcesGroupId() == sourceGroupId
+ }
+ }
+
+ companion object {
+ private const val TAG: String = "SafetyCenterSubpageFragment"
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterUiFlags.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterUiFlags.kt
new file mode 100644
index 000000000..053a77787
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterUiFlags.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.safetycenter.ui
+
+import android.provider.DeviceConfig
+import androidx.core.os.BuildCompat
+
+/** A class to access the Safety Center UI related {@link DeviceConfig} flags. */
+object SafetyCenterUiFlags {
+ private const val PROPERTY_SHOW_SUBPAGES = "safety_center_show_subpages"
+
+ /**
+ * Returns whether to show subpages in the Safety Center UI for Android-U instead of the
+ * expand-and-collapse list implementation.
+ */
+ @JvmStatic
+ fun getShowSubpages(): Boolean {
+ return BuildCompat.isAtLeastU() &&
+ DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, PROPERTY_SHOW_SUBPAGES, false)
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyGroupPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyGroupPreference.kt
index 78837dd07..75e8800c1 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyGroupPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyGroupPreference.kt
@@ -27,9 +27,7 @@ import com.android.permissioncontroller.R
import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterViewModel
import com.android.permissioncontroller.safetycenter.ui.view.SafetyEntryGroupView
-/**
- * A preference that displays a visual representation of a {@link SafetyCenterEntryGroup}.
- */
+/** A preference that displays a visual representation of a {@link SafetyCenterEntryGroup}. */
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
class SafetyGroupPreference(
context: Context,
@@ -43,8 +41,6 @@ class SafetyGroupPreference(
private val onCollapsedListener: (String) -> Unit
) : Preference(context), ComparablePreference {
- val groupId = group.id
-
init {
layoutResource = R.layout.preference_group
}
@@ -53,24 +49,22 @@ class SafetyGroupPreference(
super.onBindViewHolder(holder)
(holder?.itemView as? SafetyEntryGroupView)?.showGroup(
- group,
- isExpanded,
- isFirstCard,
- isLastCard,
- getTaskIdForEntry,
- viewModel,
- onExpandedListener,
- onCollapsedListener
- )
+ group,
+ isExpanded,
+ isFirstCard,
+ isLastCard,
+ getTaskIdForEntry,
+ viewModel,
+ onExpandedListener,
+ onCollapsedListener)
}
override fun isSameItem(other: Preference): Boolean =
- other is SafetyGroupPreference &&
- TextUtils.equals(group.id, other.group.id)
+ other is SafetyGroupPreference && TextUtils.equals(group.id, other.group.id)
override fun hasSameContents(other: Preference): Boolean =
- other is SafetyGroupPreference &&
- group == other.group &&
- isFirstCard == other.isFirstCard &&
- isLastCard == other.isLastCard
-} \ No newline at end of file
+ other is SafetyGroupPreference &&
+ group == other.group &&
+ isFirstCard == other.isFirstCard &&
+ isLastCard == other.isLastCard
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyStatusPreference.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyStatusPreference.java
index f081017b4..ee2e7c73d 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyStatusPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyStatusPreference.java
@@ -17,9 +17,6 @@
package com.android.permissioncontroller.safetycenter.ui;
import static android.os.Build.VERSION_CODES.TIRAMISU;
-import static android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING;
-import static android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK;
-import static android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_RECOMMENDATION;
import static android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN;
import android.content.Context;
@@ -28,11 +25,9 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
-import android.safetycenter.SafetyCenterData;
import android.safetycenter.SafetyCenterStatus;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@@ -46,6 +41,7 @@ import androidx.preference.PreferenceViewHolder;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.utils.KotlinUtils;
import com.android.permissioncontroller.safetycenter.ui.model.SafetyCenterViewModel;
+import com.android.permissioncontroller.safetycenter.ui.model.StatusUiData;
import com.google.android.material.button.MaterialButton;
@@ -57,10 +53,8 @@ import kotlin.Pair;
/** Preference which displays a visual representation of {@link SafetyCenterStatus}. */
@RequiresApi(TIRAMISU)
public class SafetyStatusPreference extends Preference implements ComparablePreference {
- private static final String TAG = "SafetyStatusPreference";
- @Nullable private SafetyCenterStatus mStatus;
- @Nullable private View.OnClickListener mReviewSettingsOnClickListener;
+ @Nullable private StatusUiData mStatus;
@Nullable private SafetyCenterViewModel mViewModel;
@NonNull
@@ -74,8 +68,6 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
new TextFadeAnimator(List.of(R.id.status_title, R.id.status_summary));
private boolean mFirstBind = true;
- private boolean mHasPendingActions;
- private boolean mHasIssues;
public SafetyStatusPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -103,8 +95,16 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
MaterialButton pendingActionsRescanButton =
(MaterialButton) holder.findViewById(R.id.pending_actions_rescan_button);
View reviewSettingsButton = holder.findViewById(R.id.review_settings_button);
- if (mHasPendingActions) {
- reviewSettingsButton.setOnClickListener(mReviewSettingsOnClickListener);
+ if (mStatus.hasPendingActions()) {
+ reviewSettingsButton.setOnClickListener(
+ l -> {
+ requireViewModel()
+ .navigateToSafetyCenter(
+ context, NavigationSource.QUICK_SETTINGS_TILE);
+ requireViewModel()
+ .getInteractionLogger()
+ .record(Action.REVIEW_SETTINGS_CLICKED);
+ });
reviewSettingsButton.setVisibility(View.VISIBLE);
} else {
reviewSettingsButton.setVisibility(View.GONE);
@@ -112,15 +112,8 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
rescanButton = updateRescanButtonUi(rescanButton, pendingActionsRescanButton);
setRescanButtonState(rescanButton);
- int contentDescriptionResId =
- R.string.safety_status_preference_title_and_summary_content_description;
holder.findViewById(R.id.status_title_and_summary)
- .setContentDescription(
- getContext()
- .getString(
- contentDescriptionResId,
- mStatus.getTitle(),
- mStatus.getSummary()));
+ .setContentDescription(mStatus.getContentDescription(context));
rescanButton.setOnClickListener(
unused -> {
@@ -143,7 +136,8 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
View safetyProtectionSectionView = holder.findViewById(R.id.safety_protection_section_view);
if (KotlinUtils.INSTANCE.shouldShowSafetyProtectionResources(context)) {
// Hide the Safety Protection branding if there are any issue cards
- safetyProtectionSectionView.setVisibility(mHasIssues ? View.GONE : View.VISIBLE);
+ safetyProtectionSectionView.setVisibility(
+ mStatus.hasIssues() ? View.GONE : View.VISIBLE);
}
if (safetyProtectionSectionView.getVisibility() == View.GONE) {
holder.itemView.setPaddingRelative(
@@ -165,7 +159,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
private void updateStatusText(TextView title, TextView summary) {
if (mFirstBind) {
title.setText(mStatus.getTitle());
- summary.setText(getSummaryText());
+ summary.setText(mStatus.getSummary(getContext()));
}
runTextAnimationIfNeeded(title, summary);
}
@@ -173,7 +167,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
private void updateStatusIcon(ImageView statusImage, View rescanButton) {
int severityLevel = mStatus.getSeverityLevel();
- boolean isRefreshing = isRefreshInProgress();
+ boolean isRefreshing = mStatus.isRefreshInProgress();
boolean shouldStartScanAnimation = isRefreshing && !mIsScanAnimationRunning;
boolean shouldEndScanAnimation = !isRefreshing && mIsScanAnimationRunning;
boolean shouldChangeIcon = mSettledSeverityLevel != severityLevel;
@@ -202,13 +196,14 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
return;
}
String titleText = mStatus.getTitle().toString();
- String summaryText = getSummaryText().toString();
+ String summaryText = mStatus.getSummary(getContext()).toString();
boolean titleEquals = titleView.getText().toString().equals(titleText);
boolean summaryEquals = summaryView.getText().toString().equals(summaryText);
- Runnable onFinish = () -> {
- mIsTextChangeAnimationRunning = false;
- runTextAnimationIfNeeded(titleView, summaryView);
- };
+ Runnable onFinish =
+ () -> {
+ mIsTextChangeAnimationRunning = false;
+ runTextAnimationIfNeeded(titleView, summaryView);
+ };
mIsTextChangeAnimationRunning = !titleEquals || !summaryEquals;
if (!titleEquals && !summaryEquals) {
Pair<TextView, String> titleChange = new Pair<>(titleView, titleText);
@@ -221,20 +216,6 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
}
}
- private CharSequence getSummaryText() {
- if (mHasPendingActions) {
- return getContext().getString(R.string.safety_center_qs_status_summary);
- } else {
- return mStatus.getSummary().toString();
- }
- }
-
- private boolean isRefreshInProgress() {
- int refreshStatus = mStatus.getRefreshStatus();
- return refreshStatus == SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS
- || refreshStatus == SafetyCenterStatus.REFRESH_STATUS_DATA_FETCH_IN_PROGRESS;
- }
-
private void startScanningAnimation(ImageView statusImage) {
mIsScanAnimationRunning = true;
statusImage.setImageResource(
@@ -264,7 +245,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
new Animatable2.AnimationCallback() {
@Override
public void onAnimationEnd(Drawable drawable) {
- if (mIsScanAnimationRunning && isRefreshInProgress()) {
+ if (mIsScanAnimationRunning && mStatus.isRefreshInProgress()) {
scanningAnim.start();
} else {
scanningAnim.clearAnimationCallbacks();
@@ -303,8 +284,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
@Override
public void onAnimationEnd(Drawable drawable) {
super.onAnimationEnd(drawable);
- finishScanAnimation(
- statusImage, rescanButton);
+ finishScanAnimation(statusImage, rescanButton);
}
});
animatedDrawable.start();
@@ -350,7 +330,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
}
mSettledSeverityLevel = mStatus.getSeverityLevel();
- statusImage.setImageResource(toStatusImageResId(mSettledSeverityLevel));
+ statusImage.setImageResource(mStatus.getStatusImageResId());
}
private void handleQueuedAction(ImageView statusImage) {
@@ -369,7 +349,7 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
*/
private MaterialButton updateRescanButtonUi(
MaterialButton rescanButton, MaterialButton pendingActionsRescanButton) {
- if (mHasPendingActions) {
+ if (mStatus.hasPendingActions()) {
rescanButton.setVisibility(View.GONE);
pendingActionsRescanButton.setVisibility(View.VISIBLE);
return pendingActionsRescanButton;
@@ -379,14 +359,8 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
return rescanButton;
}
- void setSafetyStatus(SafetyCenterStatus status) {
- mStatus = status;
- safeNotifyChanged();
- }
-
- void setSafetyData(SafetyCenterData data) {
- mHasIssues = data.getIssues().size() > 0;
- mStatus = data.getStatus();
+ void setData(StatusUiData statusUiData) {
+ mStatus = statusUiData;
safeNotifyChanged();
}
@@ -398,50 +372,15 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
return Objects.requireNonNull(mViewModel);
}
- /**
- * System has pending actions when the user security and privacy signals are deemed to be safe,
- * but the user has previously dismissed some warnings that may need their review
- */
- void setHasPendingActions(boolean hasPendingActions, View.OnClickListener listener) {
- mHasPendingActions = hasPendingActions;
- mReviewSettingsOnClickListener = listener;
- safeNotifyChanged();
- }
-
private void setRescanButtonState(View rescanButton) {
- rescanButton.setVisibility(shouldShowRescanButton() ? View.VISIBLE : View.GONE);
- rescanButton.setEnabled(!isRefreshInProgress());
- }
-
- private boolean shouldShowRescanButton() {
- int severityLevel = mStatus.getSeverityLevel();
- return !mHasIssues
- && !mHasPendingActions // hides the second button in QS to keep the UI clean
- && (severityLevel == OVERALL_SEVERITY_LEVEL_OK
- || severityLevel == OVERALL_SEVERITY_LEVEL_UNKNOWN);
+ rescanButton.setVisibility(mStatus.shouldShowRescanButton() ? View.VISIBLE : View.GONE);
+ rescanButton.setEnabled(!mStatus.isRefreshInProgress());
}
// Calling notifyChanged while recyclerview is scrolling or computing layout will result in an
// IllegalStateException. Post to handler to wait for UI to settle.
private void safeNotifyChanged() {
- new Handler(Looper.getMainLooper()).post(() -> notifyChanged());
- }
-
- private static int toStatusImageResId(int overallSeverityLevel) {
- switch (overallSeverityLevel) {
- case OVERALL_SEVERITY_LEVEL_UNKNOWN:
- case OVERALL_SEVERITY_LEVEL_OK:
- return R.drawable.safety_status_info;
- case OVERALL_SEVERITY_LEVEL_RECOMMENDATION:
- return R.drawable.safety_status_recommendation;
- case OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING:
- return R.drawable.safety_status_warn;
- default:
- Log.w(
- TAG,
- String.format("Unexpected OverallSeverityLevel: %s", overallSeverityLevel));
- return R.drawable.safety_status_info;
- }
+ new Handler(Looper.getMainLooper()).post(this::notifyChanged);
}
@Override
@@ -456,6 +395,6 @@ public class SafetyStatusPreference extends Preference implements ComparablePref
return false;
}
SafetyStatusPreference other = (SafetyStatusPreference) preference;
- return Objects.equals(mStatus, other.mStatus) && mHasIssues == other.mHasIssues;
+ return Objects.equals(mStatus, other.mStatus);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt
index c0d4e8f41..9d2b808b4 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt
@@ -17,6 +17,7 @@
package com.android.permissioncontroller.safetycenter.ui.model
import android.app.Application
+import android.content.Context
import android.content.Intent
import android.content.Intent.ACTION_SAFETY_CENTER
import android.os.Build
@@ -30,9 +31,9 @@ import android.util.Log
import androidx.annotation.MainThread
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat.getMainExecutor
-import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.android.permissioncontroller.safetycenter.ui.InteractionLogger
@@ -44,6 +45,8 @@ import com.android.safetycenter.internaldata.SafetyCenterIds
class LiveSafetyCenterViewModel(app: Application) : SafetyCenterViewModel(app) {
private val TAG: String = LiveSafetyCenterViewModel::class.java.simpleName
+ override val statusUiLiveData: LiveData<StatusUiData>
+ get() = Transformations.map(safetyCenterUiLiveData) { StatusUiData(it.safetyCenterData) }
override val safetyCenterUiLiveData: LiveData<SafetyCenterUiData> by this::_safetyCenterLiveData
override val errorLiveData: LiveData<SafetyCenterErrorDetails> by this::_errorLiveData
@@ -117,14 +120,14 @@ class LiveSafetyCenterViewModel(app: Application) : SafetyCenterViewModel(app) {
_errorLiveData.value = null
}
- override fun navigateToSafetyCenter(fragment: Fragment, navigationSource: NavigationSource?) {
+ override fun navigateToSafetyCenter(context: Context, navigationSource: NavigationSource?) {
val intent = Intent(ACTION_SAFETY_CENTER)
if (navigationSource != null) {
navigationSource.addToIntent(intent)
}
- fragment.startActivity(intent)
+ context.startActivity(intent)
}
override fun pageOpen() {
@@ -219,9 +222,7 @@ class LiveSafetyCenterViewModel(app: Application) : SafetyCenterViewModel(app) {
private fun determineResolvedIssues(nextIssueIds: Set<IssueId>): Map<IssueId, ActionId> {
// Any previously in-flight issue that does not appear in the incoming SafetyCenterData
// is considered resolved.
- return issuesPendingResolution.filterNot { issue ->
- nextIssueIds.contains(issue.key)
- }
+ return issuesPendingResolution.filterNot { issue -> nextIssueIds.contains(issue.key) }
}
private fun shouldEndScan(nextData: SafetyCenterData): Boolean =
@@ -260,9 +261,7 @@ class LiveSafetyCenterViewModel(app: Application) : SafetyCenterViewModel(app) {
}
}
-/**
- * Returns inflight issues pending resolution
- */
+/** Returns inflight issues pending resolution */
private fun SafetyCenterData.getInFlightIssues(): Map<IssueId, ActionId> =
issues
.map { issue ->
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterViewModel.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterViewModel.kt
index 291079ce9..d59c2b5a3 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterViewModel.kt
@@ -17,12 +17,12 @@
package com.android.permissioncontroller.safetycenter.ui.model
import android.app.Application
+import android.content.Context
import android.os.Build
import android.safetycenter.SafetyCenterData
import android.safetycenter.SafetyCenterErrorDetails
import android.safetycenter.SafetyCenterIssue
import androidx.annotation.RequiresApi
-import androidx.fragment.app.Fragment
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import com.android.permissioncontroller.safetycenter.ui.InteractionLogger
@@ -31,6 +31,7 @@ import com.android.permissioncontroller.safetycenter.ui.NavigationSource
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
abstract class SafetyCenterViewModel(protected val app: Application) : AndroidViewModel(app) {
+ abstract val statusUiLiveData: LiveData<StatusUiData>
abstract val safetyCenterUiLiveData: LiveData<SafetyCenterUiData>
abstract val errorLiveData: LiveData<SafetyCenterErrorDetails>
abstract val interactionLogger: InteractionLogger
@@ -56,7 +57,7 @@ abstract class SafetyCenterViewModel(protected val app: Application) : AndroidVi
abstract fun clearError()
abstract fun navigateToSafetyCenter(
- fragment: Fragment,
+ context: Context,
navigationSource: NavigationSource? = null
)
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/StatusUiData.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/StatusUiData.kt
new file mode 100644
index 000000000..beeda213c
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/StatusUiData.kt
@@ -0,0 +1,80 @@
+package com.android.permissioncontroller.safetycenter.ui.model
+
+import android.content.Context
+import android.safetycenter.SafetyCenterData
+import android.safetycenter.SafetyCenterStatus
+import android.util.Log
+import com.android.permissioncontroller.R
+
+/** UI model representation of a Status Card. */
+data class StatusUiData(
+ private val status: SafetyCenterStatus,
+ @get:JvmName("hasIssues") val hasIssues: Boolean = false,
+ @get:JvmName("hasPendingActions") val hasPendingActions: Boolean = false
+) {
+
+ constructor(
+ safetyCenterData: SafetyCenterData
+ ) : this(safetyCenterData.status, hasIssues = safetyCenterData.issues.size > 0)
+
+ // For convenience use in Java.
+ fun copyForPendingActions(hasPendingActions: Boolean) =
+ copy(hasPendingActions = hasPendingActions)
+
+ private companion object {
+ val TAG: String = StatusUiData::class.java.simpleName
+ }
+
+ val title: CharSequence by status::title
+ val originalSummary: CharSequence by status::summary
+ val severityLevel: Int by status::severityLevel
+
+ val statusImageResId: Int
+ get() =
+ when (severityLevel) {
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN,
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK -> R.drawable.safety_status_info
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_RECOMMENDATION ->
+ R.drawable.safety_status_recommendation
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING ->
+ R.drawable.safety_status_warn
+ else -> {
+ Log.w(TAG, "Unexpected OverallSeverityLevel: $severityLevel")
+ R.drawable.safety_status_info
+ }
+ }
+
+ fun getSummary(context: Context): CharSequence {
+ return if (hasPendingActions) {
+ // Use a different string for the special quick-settings-only hasPendingActions state.
+ context.getString(R.string.safety_center_qs_status_summary)
+ } else {
+ originalSummary
+ }
+ }
+
+ fun getContentDescription(context: Context): CharSequence {
+ return context.getString(
+ R.string.safety_status_preference_title_and_summary_content_description,
+ title,
+ getSummary(context))
+ }
+
+ val isRefreshInProgress: Boolean
+ get() =
+ when (status.refreshStatus) {
+ SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS,
+ SafetyCenterStatus.REFRESH_STATUS_DATA_FETCH_IN_PROGRESS -> true
+ else -> false
+ }
+
+ fun shouldShowRescanButton(): Boolean {
+ return !hasIssues &&
+ !hasPendingActions &&
+ when (severityLevel) {
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK,
+ SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN -> true
+ else -> false
+ }
+ }
+}
diff --git a/PermissionController/tests/inprocess/Android.bp b/PermissionController/tests/inprocess/Android.bp
index 873e0704a..0cc355daa 100644
--- a/PermissionController/tests/inprocess/Android.bp
+++ b/PermissionController/tests/inprocess/Android.bp
@@ -44,11 +44,16 @@ android_test {
"androidx.test.rules",
"androidx.test.ext.truth",
"androidx.test.ext.junit",
- "androidx.test.uiautomator",
+ "androidx.test.uiautomator_uiautomator",
"compatibility-device-util-axt",
"permission-test-util-lib",
],
+ data: [
+ ":AppThatUsesCameraPermission",
+ ],
+ per_testcase_directory: true,
+
certificate: "platform",
instrumentation_for: "PermissionController",
diff --git a/PermissionController/tests/mocking/Android.bp b/PermissionController/tests/mocking/Android.bp
index 55e75401c..2d4e6803e 100644
--- a/PermissionController/tests/mocking/Android.bp
+++ b/PermissionController/tests/mocking/Android.bp
@@ -108,6 +108,7 @@ android_test {
"modules-utils-build_system",
"safety-center-resources-lib",
"safety-center-internal-data",
+ "lottie",
"androidx.test.rules",
"androidx.test.ext.truth",
@@ -116,6 +117,11 @@ android_test {
"mockito-target-extended-minus-junit4",
],
+ proto: {
+ type: "lite",
+ include_dirs: ["packages/modules/Permission/PermissionController/src/com/android/permissioncontroller"],
+ },
+
jni_libs: [
"libdexmakerjvmtiagent",
"libstaticjvmtiagent",
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/ReviewPermissionsViewModelTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/ReviewPermissionsViewModelTest.kt
index df6e92154..0f4216066 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/ReviewPermissionsViewModelTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/ReviewPermissionsViewModelTest.kt
@@ -26,11 +26,11 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.permissioncontroller.PermissionControllerApplication
import com.android.permissioncontroller.permission.model.livedatatypes.LightAppPermGroup
import com.android.permissioncontroller.permission.model.livedatatypes.LightPermission
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_BACKGROUND
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_BOTH
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_FOREGROUND
-import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionsViewModel.SummaryMessage
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_BACKGROUND
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_BOTH
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.PermissionTarget.PERMISSION_FOREGROUND
+import com.android.permissioncontroller.permission.ui.model.ReviewPermissionsViewModel.SummaryMessage
import com.android.permissioncontroller.permission.utils.Utils
import com.android.settingslib.RestrictedLockUtils
import org.junit.After
@@ -42,10 +42,10 @@ import org.mockito.Mock
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import org.mockito.Mockito.spy
+import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
import org.mockito.MockitoSession
import org.mockito.quality.Strictness
-import org.mockito.Mockito.`when` as whenever
/**
* Unit tests for [ReviewPermissionsViewModel]
@@ -247,4 +247,4 @@ class ReviewPermissionsViewModelTest {
requestedPermissionsFlags = listOf<Int>().toIntArray()
}
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
index 72c8716ec..b4b1abd96 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt
@@ -38,14 +38,17 @@ import com.android.permissioncontroller.privacysources.PrivacySource
import com.android.permissioncontroller.privacysources.SafetyCenterReceiver
import com.android.permissioncontroller.privacysources.SafetyCenterReceiver.RefreshEvent.EVENT_DEVICE_REBOOTED
import com.android.permissioncontroller.privacysources.SafetyCenterReceiver.RefreshEvent.EVENT_REFRESH_REQUESTED
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestCoroutineDispatcher
+import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
+import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
@@ -75,7 +78,7 @@ class SafetyCenterReceiverTest {
val application = Mockito.mock(PermissionControllerApplication::class.java)
}
- private val testCoroutineDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
+ private val testCoroutineDispatcher = TestCoroutineDispatcher()
@Mock
lateinit var mockSafetyCenterManager: SafetyCenterManager
@@ -226,4 +229,4 @@ class SafetyCenterReceiverTest {
verifyZeroInteractions(mockPrivacySource)
verifyZeroInteractions(mockPrivacySource2)
}
-} \ No newline at end of file
+}
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/OWNERS b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/OWNERS
new file mode 100644
index 000000000..5d8b8161b
--- /dev/null
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 1026964
+
+include /SafetyCenter/OWNERS
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/ui/model/StatusUiDataTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/ui/model/StatusUiDataTest.kt
new file mode 100644
index 000000000..96fc5ee74
--- /dev/null
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetycenter/ui/model/StatusUiDataTest.kt
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.tests.mocking.safetycenter.ui.model
+
+import android.content.Context
+import android.os.Build
+import android.safetycenter.SafetyCenterData
+import android.safetycenter.SafetyCenterIssue
+import android.safetycenter.SafetyCenterStatus
+import android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING
+import android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK
+import android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_RECOMMENDATION
+import android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN
+import android.safetycenter.SafetyCenterStatus.REFRESH_STATUS_DATA_FETCH_IN_PROGRESS
+import android.safetycenter.SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS
+import android.safetycenter.SafetyCenterStatus.REFRESH_STATUS_NONE
+import androidx.test.filters.SdkSuppress
+import com.android.permissioncontroller.R
+import com.android.permissioncontroller.safetycenter.ui.model.StatusUiData
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.mockito.Mock
+import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
+
+@SdkSuppress(maxSdkVersion = Build.VERSION_CODES.TIRAMISU)
+class StatusUiDataTest {
+
+ @Mock private lateinit var mockContext: Context
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @Test
+ fun copyForPendingActions_setsCorrectPendingActionsValue() {
+ val copiedWithPendingActions =
+ StatusUiData(STATUS, hasPendingActions = false).copyForPendingActions(true)
+ val copiedWithoutPendingActions =
+ StatusUiData(STATUS, hasPendingActions = true).copyForPendingActions(false)
+
+ assertThat(copiedWithPendingActions.hasPendingActions).isTrue()
+ assertThat(copiedWithoutPendingActions.hasPendingActions).isFalse()
+ }
+
+ @Test
+ fun getTitle_returnsTitle() {
+ assertThat(StatusUiData(STATUS).title).isEqualTo(STATUS.title)
+ assertThat(StatusUiData(ANOTHER_STATUS).title).isEqualTo(ANOTHER_STATUS.title)
+ assertThat(StatusUiData(SafetyCenterData(STATUS, listOf(), listOf(), listOf())).title)
+ .isEqualTo(STATUS.title)
+ }
+
+ @Test
+ fun getOriginalSummary_returnsOriginalSummary() {
+ assertThat(StatusUiData(STATUS).originalSummary).isEqualTo(STATUS.summary)
+ assertThat(StatusUiData(ANOTHER_STATUS).originalSummary).isEqualTo(ANOTHER_STATUS.summary)
+ assertThat(
+ StatusUiData(SafetyCenterData(STATUS, listOf(), listOf(), listOf()))
+ .originalSummary)
+ .isEqualTo(STATUS.summary)
+ }
+
+ @Test
+ fun getSeverityLevel_returnsSeverityLevel() {
+ assertThat(StatusUiData(STATUS).severityLevel).isEqualTo(STATUS.severityLevel)
+ assertThat(StatusUiData(ANOTHER_STATUS).severityLevel)
+ .isEqualTo(ANOTHER_STATUS.severityLevel)
+ assertThat(
+ StatusUiData(SafetyCenterData(STATUS, listOf(), listOf(), listOf())).severityLevel)
+ .isEqualTo(STATUS.severityLevel)
+ }
+
+ @Test
+ fun getSummary_withoutPendingActions_returnsOriginalSummary() {
+ val dataWithoutPendingActions = StatusUiData(STATUS, hasPendingActions = false)
+
+ val actualSummary = dataWithoutPendingActions.getSummary(mockContext)
+
+ assertThat(actualSummary).isEqualTo(dataWithoutPendingActions.originalSummary)
+ }
+
+ @Test
+ fun getSummary_withPendingActions_returnsQsSummary() {
+ val expectedSummary = "a quick settings summary"
+ whenever(mockContext.getString(R.string.safety_center_qs_status_summary))
+ .thenReturn(expectedSummary)
+
+ val actualSummary = StatusUiData(STATUS, hasPendingActions = true).getSummary(mockContext)
+
+ assertThat(actualSummary).isEqualTo(expectedSummary)
+ }
+
+ @Test
+ fun getContentDescription_returnsContentDescription() {
+ val expectedContentDescription = "a content description"
+ whenever(
+ mockContext.getString(
+ R.string.safety_status_preference_title_and_summary_content_description,
+ STATUS.title,
+ STATUS.summary))
+ .thenReturn(expectedContentDescription)
+
+ val actualContentDescription = StatusUiData(STATUS).getContentDescription(mockContext)
+
+ assertThat(actualContentDescription).isEqualTo(expectedContentDescription)
+ }
+
+ @Test
+ fun fromSafetyCenterData_withIssues_hasIssuesIsTrue() {
+ assertThat(StatusUiData(DATA_WITH_ISSUES).hasIssues).isTrue()
+ }
+
+ @Test
+ fun fromSafetyCenterData_withoutIssues_hasIssuesIsFalse() {
+ assertThat(StatusUiData(DATA_WITHOUT_ISSUES).hasIssues).isFalse()
+ }
+
+ @Test
+ fun hasPendingActions_defaultsFalse() {
+ assertThat(StatusUiData(STATUS).hasPendingActions).isFalse()
+ assertThat(StatusUiData(DATA_WITH_ISSUES).hasPendingActions).isFalse()
+ }
+
+ @Test
+ fun getStatusImageResId_severityOk() {
+ assertThat(uiDataForSeverity(OVERALL_SEVERITY_LEVEL_OK).statusImageResId)
+ .isEqualTo(R.drawable.safety_status_info)
+ }
+
+ @Test
+ fun getStatusImageResId_severityUnknown() {
+ assertThat(uiDataForSeverity(OVERALL_SEVERITY_LEVEL_UNKNOWN).statusImageResId)
+ .isEqualTo(R.drawable.safety_status_info)
+ }
+ @Test
+ fun getStatusImageResId_severityRecommendation() {
+ assertThat(uiDataForSeverity(OVERALL_SEVERITY_LEVEL_RECOMMENDATION).statusImageResId)
+ .isEqualTo(R.drawable.safety_status_recommendation)
+ }
+ @Test
+ fun getStatusImageResId_severityWarning() {
+ assertThat(uiDataForSeverity(OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING).statusImageResId)
+ .isEqualTo(R.drawable.safety_status_warn)
+ }
+
+ @Test
+ fun isRefreshInProgress_dataFetch_isTrue() {
+ assertThat(
+ uiDataForRefreshStatus(REFRESH_STATUS_DATA_FETCH_IN_PROGRESS).isRefreshInProgress)
+ .isTrue()
+ }
+
+ @Test
+ fun isRefreshInProgress_fullRescan_isTrue() {
+ assertThat(
+ uiDataForRefreshStatus(REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS).isRefreshInProgress)
+ .isTrue()
+ }
+
+ @Test
+ fun isRefreshInProgress_none_isFalse() {
+ assertThat(uiDataForRefreshStatus(REFRESH_STATUS_NONE).isRefreshInProgress).isFalse()
+ }
+
+ @Test
+ fun shouldShowRescanButton_severityOk_noIssues_noPendingActions_isTrue() {
+ assertThat(
+ StatusUiData(
+ statusForSeverity(OVERALL_SEVERITY_LEVEL_OK),
+ hasIssues = false,
+ hasPendingActions = false)
+ .shouldShowRescanButton())
+ .isTrue()
+ }
+
+ @Test
+ fun shouldShowRescanButton_severityUnknown_noIssues_noPendingActions_isTrue() {
+ assertThat(
+ StatusUiData(
+ statusForSeverity(OVERALL_SEVERITY_LEVEL_UNKNOWN),
+ hasIssues = false,
+ hasPendingActions = false)
+ .shouldShowRescanButton())
+ .isTrue()
+ }
+
+ @Test
+ fun shouldShowRescanButton_hasIssues_isFalse() {
+ assertThat(
+ StatusUiData(
+ statusForSeverity(OVERALL_SEVERITY_LEVEL_OK),
+ hasIssues = true,
+ hasPendingActions = false)
+ .shouldShowRescanButton())
+ .isFalse()
+ }
+
+ @Test
+ fun shouldShowRescanButton_hasPendingActions_isFalse() {
+ assertThat(
+ StatusUiData(
+ statusForSeverity(OVERALL_SEVERITY_LEVEL_OK),
+ hasIssues = false,
+ hasPendingActions = true)
+ .shouldShowRescanButton())
+ .isFalse()
+ }
+
+ @Test
+ fun shouldShowRescanButton_severityNotOkOrUnknown_isFalse() {
+ for (severity in
+ listOf(
+ OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING, OVERALL_SEVERITY_LEVEL_RECOMMENDATION)) {
+ assertThat(
+ StatusUiData(
+ statusForSeverity(severity),
+ hasIssues = false,
+ hasPendingActions = false)
+ .shouldShowRescanButton())
+ .isFalse()
+ }
+ }
+
+ private companion object {
+ val STATUS =
+ SafetyCenterStatus.Builder("a title", "a summary")
+ .setSeverityLevel(OVERALL_SEVERITY_LEVEL_OK)
+ .setRefreshStatus(REFRESH_STATUS_NONE)
+ .build()
+
+ val ANOTHER_STATUS =
+ SafetyCenterStatus.Builder("another title", "another summary")
+ .setSeverityLevel(OVERALL_SEVERITY_LEVEL_RECOMMENDATION)
+ .setRefreshStatus(REFRESH_STATUS_DATA_FETCH_IN_PROGRESS)
+ .build()
+
+ val ISSUE = SafetyCenterIssue.Builder("iSsUe_Id", "issue title", "issue summary").build()
+
+ val DATA_WITH_ISSUES = SafetyCenterData(STATUS, listOf(ISSUE), listOf(), listOf())
+ val DATA_WITHOUT_ISSUES = SafetyCenterData(STATUS, listOf(), listOf(), listOf())
+
+ fun statusForSeverity(severityLevel: Int) =
+ SafetyCenterStatus.Builder(STATUS).setSeverityLevel(severityLevel).build()
+
+ fun uiDataForSeverity(severityLevel: Int) = StatusUiData(statusForSeverity(severityLevel))
+
+ fun uiDataForRefreshStatus(refreshStatus: Int) =
+ StatusUiData(SafetyCenterStatus.Builder(STATUS).setRefreshStatus(refreshStatus).build())
+ }
+}
diff --git a/PermissionController/tests/outofprocess/Android.bp b/PermissionController/tests/outofprocess/Android.bp
index 806c8ecd7..e646def28 100644
--- a/PermissionController/tests/outofprocess/Android.bp
+++ b/PermissionController/tests/outofprocess/Android.bp
@@ -51,6 +51,7 @@ android_test {
proto: {
type: "lite",
+ include_dirs: ["packages/modules/Permission/PermissionController/src/com/android/permissioncontroller"],
},
test_suites: [
diff --git a/PermissionController/tests/permissionui/Android.bp b/PermissionController/tests/permissionui/Android.bp
index 6d5c91043..704307c1f 100644
--- a/PermissionController/tests/permissionui/Android.bp
+++ b/PermissionController/tests/permissionui/Android.bp
@@ -45,25 +45,24 @@ android_test {
"androidx.test.rules",
"androidx.test.ext.truth",
"androidx.test.ext.junit",
- "androidx.test.uiautomator",
+ "androidx.test.uiautomator_uiautomator",
"compatibility-device-util-axt",
"permission-test-util-lib",
],
test_suites: [
"device-tests",
+ "general-tests",
"mts-permission",
],
- required: [
- "CtsAppThatRequestsLocationPermission29",
- ],
-
data: [
+ ":CtsAppThatRequestsLocationPermission29",
":PermissionUiUseStoragePermissionApp",
":PermissionUiUseCameraPermissionApp",
":PermissionUiDefineAdditionalPermissionApp",
":PermissionUiUseAdditionalPermissionApp",
":PermissionUiUseTwoAdditionalPermissionsApp",
- ]
+ ],
+ per_testcase_directory: true,
}
diff --git a/PermissionController/tests/permissionui/AndroidTest.xml b/PermissionController/tests/permissionui/AndroidTest.xml
index 34a56286e..946f97e30 100644
--- a/PermissionController/tests/permissionui/AndroidTest.xml
+++ b/PermissionController/tests/permissionui/AndroidTest.xml
@@ -21,6 +21,7 @@
<option name="test-suite-tag" value="apct-instrumentation" />
<option name="test-tag" value="PermissionUiTestCases" />
<object type="module_controller" class="com.android.tradefed.testtype.suite.module.Sdk30ModuleController" />
+ <option name="config-descriptor:metadata" key="mainline-param" value="com.google.android.permission.apex" />
<!-- Install test -->
<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
diff --git a/SafetyCenter/Config/tests/Android.bp b/SafetyCenter/Config/tests/Android.bp
index cca539f6c..9d9975980 100644
--- a/SafetyCenter/Config/tests/Android.bp
+++ b/SafetyCenter/Config/tests/Android.bp
@@ -25,9 +25,10 @@ android_test {
srcs: [
"java/**/*.kt",
],
- required: [
- "SafetyCenterConfigTestsOverlay",
+ data: [
+ ":SafetyCenterConfigTestsOverlay",
],
+ per_testcase_directory: true,
static_libs: [
"compatibility-device-util-axt",
"kotlinx-coroutines-android",
diff --git a/SafetyCenter/ConfigLintChecker/Android.bp b/SafetyCenter/ConfigLintChecker/Android.bp
index fb2e7ce3e..4a8db0fbd 100644
--- a/SafetyCenter/ConfigLintChecker/Android.bp
+++ b/SafetyCenter/ConfigLintChecker/Android.bp
@@ -35,6 +35,7 @@ java_library_host {
],
java_resources: [":safetycenter-config-schema"],
jarjar_rules: "jarjar-rules.txt",
+ kotlincflags: ["-Xjvm-default=all"],
visibility: [
"//packages/modules/Permission:__subpackages__",
"//vendor:__subpackages__",
@@ -43,6 +44,12 @@ java_library_host {
java_test_host {
name: "ConfigLintCheckerTest",
+ // TODO(b/239881504): Since this test was written, Android
+ // Lint was updated, and now includes classes that were
+ // compiled for java 15. The soong build doesn't support
+ // java 15 yet, so we can't compile against "lint". Disable
+ // the test until java 15 is supported.
+ enabled: false,
srcs: [
"tests/java/**/*.kt",
],
diff --git a/SafetyCenter/TEST_MAPPING b/SafetyCenter/TEST_MAPPING
index 5a26efe66..5feb2e901 100644
--- a/SafetyCenter/TEST_MAPPING
+++ b/SafetyCenter/TEST_MAPPING
@@ -13,5 +13,15 @@
{
"name": "CtsSafetyCenterTestCases"
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/framework-s/Android.bp b/framework-s/Android.bp
index ec33f13ee..37160b4b5 100644
--- a/framework-s/Android.bp
+++ b/framework-s/Android.bp
@@ -47,6 +47,9 @@ java_library {
"framework-annotations-lib",
"unsupportedappusage",
],
+ static_libs: [
+ "modules-utils-build",
+ ],
apex_available: [
"com.android.permission",
"test_com.android.permission",
@@ -84,7 +87,7 @@ java_sdk_library {
lint: {
strict_updatability_linting: true,
},
- min_sdk_version: "30",
+ min_sdk_version: "31",
permitted_packages: [
"android.permission",
"android.app.role",
diff --git a/framework-s/api/system-current.txt b/framework-s/api/system-current.txt
index db2d140ca..7f27520de 100644
--- a/framework-s/api/system-current.txt
+++ b/framework-s/api/system-current.txt
@@ -36,6 +36,7 @@ package android.app.role {
method @Deprecated @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>);
field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1
field public static final String ROLE_DEVICE_POLICY_MANAGEMENT = "android.app.role.DEVICE_POLICY_MANAGEMENT";
+ field public static final String ROLE_FINANCED_DEVICE_KIOSK = "android.app.role.FINANCED_DEVICE_KIOSK";
field public static final String ROLE_SYSTEM_ACTIVITY_RECOGNIZER = "android.app.role.SYSTEM_ACTIVITY_RECOGNIZER";
field public static final String ROLE_SYSTEM_SUPERVISION = "android.app.role.SYSTEM_SUPERVISION";
field public static final String ROLE_SYSTEM_WELLBEING = "android.app.role.SYSTEM_WELLBEING";
@@ -222,6 +223,7 @@ package android.safetycenter {
field public static final String EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID = "android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID";
field public static final String EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE = "android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE";
field public static final String EXTRA_REFRESH_SAFETY_SOURCE_IDS = "android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS";
+ field public static final String EXTRA_SAFETY_SOURCES_GROUP_ID = "android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID";
field public static final String EXTRA_SAFETY_SOURCE_ID = "android.safetycenter.extra.SAFETY_SOURCE_ID";
field public static final String EXTRA_SAFETY_SOURCE_ISSUE_ID = "android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID";
field public static final String EXTRA_SAFETY_SOURCE_USER_HANDLE = "android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE";
@@ -347,9 +349,11 @@ package android.safetycenter {
public final class SafetySourceIssue implements android.os.Parcelable {
method public int describeContents();
method @NonNull public java.util.List<android.safetycenter.SafetySourceIssue.Action> getActions();
+ method @Nullable public android.safetycenter.SafetySourceIssue.Notification getCustomNotification();
method @NonNull public String getId();
method public int getIssueCategory();
method @NonNull public String getIssueTypeId();
+ method public int getNotificationBehavior();
method @Nullable public android.app.PendingIntent getOnDismissPendingIntent();
method public int getSeverityLevel();
method @Nullable public CharSequence getSubtitle();
@@ -360,6 +364,10 @@ package android.safetycenter {
field public static final int ISSUE_CATEGORY_ACCOUNT = 200; // 0xc8
field public static final int ISSUE_CATEGORY_DEVICE = 100; // 0x64
field public static final int ISSUE_CATEGORY_GENERAL = 300; // 0x12c
+ field public static final int NOTIFICATION_BEHAVIOR_DELAYED = 200; // 0xc8
+ field public static final int NOTIFICATION_BEHAVIOR_IMMEDIATELY = 300; // 0x12c
+ field public static final int NOTIFICATION_BEHAVIOR_NEVER = 100; // 0x64
+ field public static final int NOTIFICATION_BEHAVIOR_UNSPECIFIED = 0; // 0x0
}
public static final class SafetySourceIssue.Action implements android.os.Parcelable {
@@ -385,11 +393,30 @@ package android.safetycenter {
method @NonNull public android.safetycenter.SafetySourceIssue.Builder addAction(@NonNull android.safetycenter.SafetySourceIssue.Action);
method @NonNull public android.safetycenter.SafetySourceIssue build();
method @NonNull public android.safetycenter.SafetySourceIssue.Builder clearActions();
+ method @NonNull public android.safetycenter.SafetySourceIssue.Builder setCustomNotification(@Nullable android.safetycenter.SafetySourceIssue.Notification);
method @NonNull public android.safetycenter.SafetySourceIssue.Builder setIssueCategory(int);
+ method @NonNull public android.safetycenter.SafetySourceIssue.Builder setNotificationBehavior(int);
method @NonNull public android.safetycenter.SafetySourceIssue.Builder setOnDismissPendingIntent(@Nullable android.app.PendingIntent);
method @NonNull public android.safetycenter.SafetySourceIssue.Builder setSubtitle(@Nullable CharSequence);
}
+ public static final class SafetySourceIssue.Notification implements android.os.Parcelable {
+ method public int describeContents();
+ method @NonNull public java.util.List<android.safetycenter.SafetySourceIssue.Action> getActions();
+ method @NonNull public CharSequence getText();
+ method @NonNull public CharSequence getTitle();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.safetycenter.SafetySourceIssue.Notification> CREATOR;
+ }
+
+ public static final class SafetySourceIssue.Notification.Builder {
+ ctor public SafetySourceIssue.Notification.Builder(@NonNull CharSequence, @NonNull CharSequence);
+ method @NonNull public android.safetycenter.SafetySourceIssue.Notification.Builder addAction(@NonNull android.safetycenter.SafetySourceIssue.Action);
+ method @NonNull public android.safetycenter.SafetySourceIssue.Notification build();
+ method @NonNull public android.safetycenter.SafetySourceIssue.Notification.Builder clearActions();
+ method @NonNull public android.safetycenter.SafetySourceIssue.Notification.Builder setActions(@NonNull java.util.List<android.safetycenter.SafetySourceIssue.Action>);
+ }
+
public final class SafetySourceStatus implements android.os.Parcelable {
method public int describeContents();
method @Nullable public android.safetycenter.SafetySourceStatus.IconAction getIconAction();
diff --git a/framework-s/java/android/app/role/RoleManager.java b/framework-s/java/android/app/role/RoleManager.java
index bd8831070..1b72073e0 100644
--- a/framework-s/java/android/app/role/RoleManager.java
+++ b/framework-s/java/android/app/role/RoleManager.java
@@ -163,6 +163,15 @@ public final class RoleManager {
"android.app.role.DEVICE_POLICY_MANAGEMENT";
/**
+ * The name of the financed device kiosk role.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String ROLE_FINANCED_DEVICE_KIOSK =
+ "android.app.role.FINANCED_DEVICE_KIOSK";
+
+ /**
* @hide
*/
@IntDef(flag = true, value = { MANAGE_HOLDERS_FLAG_DONT_KILL_APP })
diff --git a/framework-s/java/android/app/role/TEST_MAPPING b/framework-s/java/android/app/role/TEST_MAPPING
index f8f140dd7..ce53dca05 100644
--- a/framework-s/java/android/app/role/TEST_MAPPING
+++ b/framework-s/java/android/app/role/TEST_MAPPING
@@ -4,7 +4,24 @@
"name": "CtsRoleTestCases",
"options": [
{
- "include-filter": "android.app.role.cts.RoleManagerTest"
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsRoleTestCases[com.google.android.permission.apex]",
+ "options": [
+ // TODO(b/238677748): These two tests currently fails on R base image
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList"
+ },
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#removeSmsRoleHolderThenPermissionIsRevoked"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
}
diff --git a/framework-s/java/android/safetycenter/SafetyCenterManager.java b/framework-s/java/android/safetycenter/SafetyCenterManager.java
index acee6112e..0f1609dda 100644
--- a/framework-s/java/android/safetycenter/SafetyCenterManager.java
+++ b/framework-s/java/android/safetycenter/SafetyCenterManager.java
@@ -21,6 +21,7 @@ import static android.Manifest.permission.READ_SAFETY_CENTER_STATUS;
import static android.Manifest.permission.SEND_SAFETY_CENTER_UPDATE;
import static android.annotation.SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION;
import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static java.util.Objects.requireNonNull;
@@ -195,12 +196,21 @@ public final class SafetyCenterManager {
* disambiguate personal profile vs. managed profiles issues).
*
* <p>This extra can be used in conjunction with {@link #EXTRA_SAFETY_SOURCE_ISSUE_ID} and
- * {@link #EXTRA_SAFETY_SOURCE_ID}. Otherwise, no redirection will occur.
+ * {@link #EXTRA_SAFETY_SOURCE_ID}. Otherwise, the device's primary user will be used.
*/
public static final String EXTRA_SAFETY_SOURCE_USER_HANDLE =
"android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE";
/**
+ * Used as a {@code String} extra field in {@link Intent#ACTION_SAFETY_CENTER} intents to
+ * specify the ID for a group of safety sources. If applicable, this will redirect to the
+ * group's corresponding subpage in the UI.
+ */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final String EXTRA_SAFETY_SOURCES_GROUP_ID =
+ "android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID";
+
+ /**
* Used as an int value for {@link #EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE} to indicate that
* the safety source should fetch fresh data relating to their safety state upon receiving a
* broadcast with intent action {@link #ACTION_REFRESH_SAFETY_SOURCES} and provide it to Safety
diff --git a/framework-s/java/android/safetycenter/SafetySourceIssue.java b/framework-s/java/android/safetycenter/SafetySourceIssue.java
index cf64818b9..e5a03e1e4 100644
--- a/framework-s/java/android/safetycenter/SafetySourceIssue.java
+++ b/framework-s/java/android/safetycenter/SafetySourceIssue.java
@@ -17,6 +17,7 @@
package android.safetycenter;
import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static com.android.internal.util.Preconditions.checkArgument;
@@ -28,6 +29,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
+import android.annotation.TargetApi;
import android.app.PendingIntent;
import android.os.Parcel;
import android.os.Parcelable;
@@ -35,6 +37,8 @@ import android.text.TextUtils;
import androidx.annotation.RequiresApi;
+import com.android.modules.utils.build.SdkLevel;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -88,6 +92,46 @@ public final class SafetySourceIssue implements Parcelable {
@Retention(RetentionPolicy.SOURCE)
public @interface IssueCategory {}
+ /** Value signifying that the source has not specified a particular notification behavior. */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final int NOTIFICATION_BEHAVIOR_UNSPECIFIED = 0;
+
+ /** An issue which Safety Center should never notify the user about. */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final int NOTIFICATION_BEHAVIOR_NEVER = 100;
+
+ /**
+ * An issue which Safety Center may notify the user about after a delay if it has not been
+ * resolved. Safety Center does not provide any guarantee about the duration of the delay.
+ */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final int NOTIFICATION_BEHAVIOR_DELAYED = 200;
+
+ /** An issue which Safety Center may notify the user about immediately. */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final int NOTIFICATION_BEHAVIOR_IMMEDIATELY = 300;
+
+ /**
+ * All possible notification behaviors.
+ *
+ * <p>The notification behavior of a {@link SafetySourceIssue} determines if and when Safety
+ * Center should notify the user about it.
+ *
+ * @hide
+ * @see Builder#setNotificationBehavior(int)
+ */
+ @IntDef(
+ prefix = {"NOTIFICATION_BEHAVIOR_"},
+ value = {
+ NOTIFICATION_BEHAVIOR_UNSPECIFIED,
+ NOTIFICATION_BEHAVIOR_NEVER,
+ NOTIFICATION_BEHAVIOR_DELAYED,
+ NOTIFICATION_BEHAVIOR_IMMEDIATELY
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @TargetApi(UPSIDE_DOWN_CAKE)
+ public @interface NotificationBehavior {}
+
@NonNull
public static final Creator<SafetySourceIssue> CREATOR =
new Creator<SafetySourceIssue>() {
@@ -111,6 +155,10 @@ public final class SafetySourceIssue implements Parcelable {
for (int i = 0; i < actions.size(); i++) {
builder.addAction(actions.get(i));
}
+ if (SdkLevel.isAtLeastU()) {
+ builder.setCustomNotification(in.readTypedObject(Notification.CREATOR));
+ builder.setNotificationBehavior(in.readInt());
+ }
return builder.build();
}
@@ -129,6 +177,8 @@ public final class SafetySourceIssue implements Parcelable {
@Nullable private final PendingIntent mOnDismissPendingIntent;
@IssueCategory private final int mIssueCategory;
@NonNull private final String mIssueTypeId;
+ @Nullable private final Notification mCustomNotification;
+ @NotificationBehavior private final int mNotificationBehavior;
private SafetySourceIssue(
@NonNull String id,
@@ -139,7 +189,9 @@ public final class SafetySourceIssue implements Parcelable {
@IssueCategory int issueCategory,
@NonNull List<Action> actions,
@Nullable PendingIntent onDismissPendingIntent,
- @NonNull String issueTypeId) {
+ @NonNull String issueTypeId,
+ @Nullable Notification customNotification,
+ @NotificationBehavior int notificationBehavior) {
this.mId = id;
this.mTitle = title;
this.mSubtitle = subtitle;
@@ -149,6 +201,8 @@ public final class SafetySourceIssue implements Parcelable {
this.mActions = actions;
this.mOnDismissPendingIntent = onDismissPendingIntent;
this.mIssueTypeId = issueTypeId;
+ this.mCustomNotification = customNotification;
+ this.mNotificationBehavior = notificationBehavior;
}
/**
@@ -243,6 +297,58 @@ public final class SafetySourceIssue implements Parcelable {
return mIssueTypeId;
}
+ /**
+ * Returns the optional custom {@link Notification} for this issue which overrides the title,
+ * text and actions for any {@link android.app.Notification} generated for this {@link
+ * SafetySourceIssue}.
+ *
+ * <p>Safety Center may still generate a default notification from the other details of this
+ * issue when no custom notification has been set. See {@link #getNotificationBehavior()} for
+ * details
+ *
+ * @see Builder#setCustomNotification(android.safetycenter.SafetySourceIssue.Notification
+ * @see #getNotificationBehavior()
+ */
+ @Nullable
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public Notification getCustomNotification() {
+ if (!SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException();
+ }
+ return mCustomNotification;
+ }
+
+ /**
+ * Returns the {@link NotificationBehavior} for this issue which determines if and when Safety
+ * Center will post a notification for this issue.
+ *
+ * <p>Any notification will be based on the {@link #getCustomNotification()} if set, or the
+ * other properties of this issue otherwise.
+ *
+ * <ul>
+ * <li>If {@link #NOTIFICATION_BEHAVIOR_IMMEDIATELY} then Safety Center will immediately
+ * create and post a notification
+ * <li>If {@link #NOTIFICATION_BEHAVIOR_DELAYED} then a notification will only be posted after
+ * a delay, if this issue has not been resolved.
+ * <li>If {@link #NOTIFICATION_BEHAVIOR_UNSPECIFIED} then a notification may or may not be
+ * posted, the exact behavior is defined by Safety Center.
+ * <li>If {@link #NOTIFICATION_BEHAVIOR_NEVER} Safety Center will never post a notification
+ * about this issue. Sources should specify this behavior when they wish to handle their
+ * own notifications. When this behavior is set sources should not set a custom
+ * notification.
+ * </ul>
+ *
+ * @see Builder#setNotificationBehavior(int)
+ */
+ @NotificationBehavior
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public int getNotificationBehavior() {
+ if (!SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException();
+ }
+ return mNotificationBehavior;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -259,6 +365,10 @@ public final class SafetySourceIssue implements Parcelable {
dest.writeTypedList(mActions);
dest.writeTypedObject(mOnDismissPendingIntent, flags);
dest.writeString(mIssueTypeId);
+ if (SdkLevel.isAtLeastU()) {
+ dest.writeTypedObject(mCustomNotification, flags);
+ dest.writeInt(mNotificationBehavior);
+ }
}
@Override
@@ -274,7 +384,9 @@ public final class SafetySourceIssue implements Parcelable {
&& mIssueCategory == that.mIssueCategory
&& mActions.equals(that.mActions)
&& Objects.equals(mOnDismissPendingIntent, that.mOnDismissPendingIntent)
- && TextUtils.equals(mIssueTypeId, that.mIssueTypeId);
+ && TextUtils.equals(mIssueTypeId, that.mIssueTypeId)
+ && Objects.equals(mCustomNotification, that.mCustomNotification)
+ && mNotificationBehavior == that.mNotificationBehavior;
}
@Override
@@ -288,7 +400,9 @@ public final class SafetySourceIssue implements Parcelable {
mIssueCategory,
mActions,
mOnDismissPendingIntent,
- mIssueTypeId);
+ mIssueTypeId,
+ mCustomNotification,
+ mNotificationBehavior);
}
@Override
@@ -312,6 +426,10 @@ public final class SafetySourceIssue implements Parcelable {
+ mOnDismissPendingIntent
+ ", mIssueTypeId="
+ mIssueTypeId
+ + ", mCustomNotification="
+ + mCustomNotification
+ + ", mNotificationBehavior="
+ + mNotificationBehavior
+ '}';
}
@@ -349,6 +467,18 @@ public final class SafetySourceIssue implements Parcelable {
}
};
+ private static void enforceUniqueActionIds(
+ @NonNull List<SafetySourceIssue.Action> actions, @NonNull String message) {
+ Set<String> actionIds = new HashSet<>();
+ for (int i = 0; i < actions.size(); i++) {
+ SafetySourceIssue.Action action = actions.get(i);
+
+ String actionId = action.getId();
+ checkArgument(!actionIds.contains(actionId), message);
+ actionIds.add(actionId);
+ }
+ }
+
@NonNull private final String mId;
@NonNull private final CharSequence mLabel;
@NonNull private final PendingIntent mPendingIntent;
@@ -511,6 +641,176 @@ public final class SafetySourceIssue implements Parcelable {
}
}
+ /**
+ * Data for Safety Center to use when constructing a system {@link android.app.Notification}
+ * about a related {@link SafetySourceIssue}.
+ *
+ * <p>Safety Center can construct a default notification for any issue, but sources may use
+ * {@link Builder#setCustomNotification(android.safetycenter.SafetySourceIssue.Notification)} if
+ * they want to override the title, text or actions.
+ *
+ * @see #getCustomNotification()
+ * @see Builder#setCustomNotification(android.safetycenter.SafetySourceIssue.Notification)
+ * @see #getNotificationBehavior()
+ */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public static final class Notification implements Parcelable {
+
+ @NonNull
+ public static final Creator<Notification> CREATOR =
+ new Creator<Notification>() {
+ @Override
+ public Notification createFromParcel(Parcel in) {
+ return new Builder(
+ TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in),
+ TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in))
+ .setActions(in.createTypedArrayList(Action.CREATOR))
+ .build();
+ }
+
+ @Override
+ public Notification[] newArray(int size) {
+ return new Notification[size];
+ }
+ };
+
+ @NonNull private final CharSequence mTitle;
+ @NonNull private final CharSequence mText;
+ @NonNull private final List<Action> mActions;
+
+ private Notification(
+ @NonNull CharSequence title,
+ @NonNull CharSequence text,
+ @NonNull List<Action> actions) {
+ mTitle = title;
+ mText = text;
+ mActions = actions;
+ }
+
+ /**
+ * Custom title which will be used instead of {@link SafetySourceIssue#getTitle()} when
+ * building a {@link android.app.Notification} for this issue.
+ */
+ @NonNull
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ /**
+ * Custom text which will be used instead of {@link SafetySourceIssue#getSummary()} when
+ * building a {@link android.app.Notification} for this issue.
+ */
+ @NonNull
+ public CharSequence getText() {
+ return mText;
+ }
+
+ /**
+ * Custom list of {@link Action} instances which will be used instead of {@link
+ * SafetySourceIssue#getActions()} when building a {@link android.app.Notification} for this
+ * issue.
+ *
+ * <p>If this list is empty then the resulting {@link android.app.Notification} will have
+ * zero action buttons.
+ */
+ @NonNull
+ public List<Action> getActions() {
+ return mActions;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ TextUtils.writeToParcel(mTitle, dest, flags);
+ TextUtils.writeToParcel(mText, dest, flags);
+ dest.writeTypedList(mActions);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Notification)) return false;
+ Notification that = (Notification) o;
+ return TextUtils.equals(mTitle, that.mTitle)
+ && TextUtils.equals(mText, that.mText)
+ && mActions.equals(that.mActions);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mTitle, mText, mActions);
+ }
+
+ @Override
+ public String toString() {
+ return "Notification{"
+ + "mTitle="
+ + mTitle
+ + ", mText="
+ + mText
+ + ", mActions="
+ + mActions
+ + '}';
+ }
+
+ /** Builder for {@link SafetySourceIssue.Notification}. */
+ public static final class Builder {
+
+ @NonNull private final CharSequence mTitle;
+ @NonNull private final CharSequence mText;
+ @NonNull private final List<Action> mActions = new ArrayList<>();
+
+ public Builder(@NonNull CharSequence title, @NonNull CharSequence text) {
+ mTitle = requireNonNull(title);
+ mText = requireNonNull(text);
+ }
+
+ /** Adds an {@link Action} to be show on the custom {@link Notification}. */
+ @NonNull
+ public Builder addAction(@NonNull Action action) {
+ mActions.add(requireNonNull(action));
+ return this;
+ }
+
+ /**
+ * Sets the list of {@link Action}s to be show on the custom {@link Notification},
+ * removing any which were previously added.
+ */
+ @NonNull
+ public Builder setActions(@NonNull List<Action> actions) {
+ mActions.clear();
+ mActions.addAll(requireNonNull(actions));
+ return this;
+ }
+
+ /**
+ * Clears all the {@link Action}s that were added to this custom {@link
+ * Notification.Builder}.
+ */
+ @NonNull
+ public Builder clearActions() {
+ mActions.clear();
+ return this;
+ }
+
+ /** Builds a {@link Notification} instance. */
+ @NonNull
+ public Notification build() {
+ List<Action> actions = unmodifiableList(new ArrayList<>(mActions));
+ Action.enforceUniqueActionIds(
+ actions, "Custom notification cannot have duplicate action ids");
+ checkArgument(
+ actions.size() <= 2,
+ "Custom notification must not contain more than 2 actions");
+ return new Notification(mTitle, mText, actions);
+ }
+ }
+ }
+
/** Builder class for {@link SafetySourceIssue}. */
public static final class Builder {
@@ -525,6 +825,12 @@ public final class SafetySourceIssue implements Parcelable {
@IssueCategory private int mIssueCategory = ISSUE_CATEGORY_GENERAL;
@Nullable private PendingIntent mOnDismissPendingIntent;
+ @Nullable private Notification mCustomNotification = null;
+
+ @SuppressLint("NewApi")
+ @NotificationBehavior
+ private int mNotificationBehavior = NOTIFICATION_BEHAVIOR_UNSPECIFIED;
+
/** Creates a {@link Builder} for a {@link SafetySourceIssue}. */
public Builder(
@NonNull String id,
@@ -590,11 +896,57 @@ public final class SafetySourceIssue implements Parcelable {
return this;
}
+ /**
+ * Sets a custom {@link Notification} for this issue.
+ *
+ * <p>Using a custom {@link Notification} a source may specify a different {@link
+ * Notification#getTitle()}, {@link Notification#getText()} and {@link
+ * Notification#getActions()} for Safety Center to use when constructing a notification for
+ * this issue.
+ *
+ * <p>Safety Center may still generate a default notification from the other details of this
+ * issue when no custom notification has been set, depending on the issue's {@link
+ * #getNotificationBehavior()}.
+ *
+ * @see #getCustomNotification()
+ * @see #setNotificationBehavior(int)
+ */
+ @NonNull
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public Builder setCustomNotification(@Nullable Notification customNotification) {
+ if (!SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException();
+ }
+ mCustomNotification = customNotification;
+ return this;
+ }
+
+ /**
+ * Sets the notification behavior of the issue.
+ *
+ * <p>Must be one of {@link #NOTIFICATION_BEHAVIOR_UNSPECIFIED}, {@link
+ * #NOTIFICATION_BEHAVIOR_NEVER}, {@link #NOTIFICATION_BEHAVIOR_DELAYED} or {@link
+ * #NOTIFICATION_BEHAVIOR_IMMEDIATELY}. See {@link #getNotificationBehavior()} for details
+ * of how Safety Center will interpret each of these.
+ *
+ * @see #getNotificationBehavior()
+ */
+ @NonNull
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ public Builder setNotificationBehavior(@NotificationBehavior int notificationBehavior) {
+ if (!SdkLevel.isAtLeastU()) {
+ throw new UnsupportedOperationException();
+ }
+ mNotificationBehavior = validateNotificationBehavior(notificationBehavior);
+ return this;
+ }
+
/** Creates the {@link SafetySourceIssue} defined by this {@link Builder}. */
@NonNull
public SafetySourceIssue build() {
List<SafetySourceIssue.Action> actions = unmodifiableList(new ArrayList<>(mActions));
- enforceUniqueActionIds(actions);
+ Action.enforceUniqueActionIds(
+ actions, "Safety source issue cannot have duplicate action ids");
checkArgument(!actions.isEmpty(), "Safety source issue must contain at least 1 action");
checkArgument(
actions.size() <= 2,
@@ -608,21 +960,9 @@ public final class SafetySourceIssue implements Parcelable {
mIssueCategory,
actions,
mOnDismissPendingIntent,
- mIssueTypeId);
- }
-
- private static void enforceUniqueActionIds(
- @NonNull List<SafetySourceIssue.Action> actions) {
- Set<String> actionIds = new HashSet<>();
- for (int i = 0; i < actions.size(); i++) {
- SafetySourceIssue.Action action = actions.get(i);
-
- String actionId = action.getId();
- checkArgument(
- !actionIds.contains(actionId),
- "Safety source issue cannot have duplicate action ids");
- actionIds.add(actionId);
- }
+ mIssueTypeId,
+ mCustomNotification,
+ mNotificationBehavior);
}
}
@@ -655,4 +995,18 @@ public final class SafetySourceIssue implements Parcelable {
throw new IllegalArgumentException(
"Unexpected IssueCategory for SafetySourceIssue: " + value);
}
+
+ @NotificationBehavior
+ private static int validateNotificationBehavior(int value) {
+ switch (value) {
+ case NOTIFICATION_BEHAVIOR_UNSPECIFIED:
+ case NOTIFICATION_BEHAVIOR_NEVER:
+ case NOTIFICATION_BEHAVIOR_DELAYED:
+ case NOTIFICATION_BEHAVIOR_IMMEDIATELY:
+ return value;
+ default:
+ }
+ throw new IllegalArgumentException(
+ "Unexpected NotificationBehavior for SafetySourceIssue: " + value);
+ }
}
diff --git a/framework-s/java/android/safetycenter/TEST_MAPPING b/framework-s/java/android/safetycenter/TEST_MAPPING
index 5a26efe66..5feb2e901 100644
--- a/framework-s/java/android/safetycenter/TEST_MAPPING
+++ b/framework-s/java/android/safetycenter/TEST_MAPPING
@@ -13,5 +13,15 @@
{
"name": "CtsSafetyCenterTestCases"
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/service/Android.bp b/service/Android.bp
index 9846e7e31..39e87a82d 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -20,30 +20,23 @@ filegroup {
name: "service-permission-java-sources",
srcs: [
"java/**/*.java",
- // Exclude Kotlin sources for T.
- //"java/**/*.kt",
+ "java/**/*.kt",
],
path: "java",
visibility: ["//visibility:private"],
}
-filegroup {
- name: "service-permission-streaming-proto-sources",
- srcs: [
- "proto/role_service.proto",
- ],
- visibility: ["//frameworks/base"],
-}
-
java_library {
- name: "service-permission-streaming-proto-java-gen",
+ name: "service-permission-proto-stream",
proto: {
type: "stream",
include_dirs: [
"external/protobuf/src",
],
},
- srcs: [":service-permission-streaming-proto-sources"],
+ srcs: [
+ "proto/role_service.proto",
+ ],
installable: false,
min_sdk_version: "30",
sdk_version: "system_server_current",
@@ -96,12 +89,10 @@ java_sdk_library {
// Soong fails to automatically add this dependency because all the
// *.kt sources are inside a filegroup.
- // Exclude Kotlin sources for T.
- //"kotlin-annotations",
+ "kotlin-annotations",
],
static_libs: [
- // Exclude Kotlin sources for T.
- //"kotlin-stdlib",
+ "kotlin-stdlib",
"modules-utils-backgroundthread",
"modules-utils-os",
"safety-center-config",
@@ -110,7 +101,7 @@ java_sdk_library {
"safety-center-resources-lib",
"service-permission-shared",
"service-permission-statsd",
- "service-permission-streaming-proto-java-gen",
+ "service-permission-proto-stream",
],
errorprone: {
javacflags: ["-Xep:GuardedBy:ERROR"],
diff --git a/service/java/com/android/permission/access/AccessCheckingService.kt b/service/java/com/android/permission/access/AccessCheckingService.kt
new file mode 100644
index 000000000..718752601
--- /dev/null
+++ b/service/java/com/android/permission/access/AccessCheckingService.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access
+
+import androidx.annotation.Keep
+import com.android.permission.access.external.PackageState
+
+@Keep
+class AccessCheckingService {
+ @Volatile
+ private lateinit var state: AccessState
+ private val stateLock = Any()
+
+ private val policy = AccessPolicy()
+
+ private val persistence = AccessPersistence()
+
+ fun init() {
+ val state = AccessState()
+ state.systemState.userIds.apply {
+ // TODO: Get and add all user IDs.
+ // TODO: Maybe get and add all packages?
+ }
+ persistence.read(state)
+ this.state = state
+ }
+
+ fun getDecision(subject: AccessUri, `object`: AccessUri): Int =
+ policy.getDecision(subject, `object`, state)
+
+ fun setDecision(subject: AccessUri, `object`: AccessUri, decision: Int) {
+ mutateState { oldState, newState ->
+ policy.setDecision(subject, `object`, decision, oldState, newState)
+ }
+ }
+
+ fun onUserAdded(userId: Int) {
+ mutateState { oldState, newState ->
+ policy.onUserAdded(userId, oldState, newState)
+ }
+ }
+
+ fun onUserRemoved(userId: Int) {
+ mutateState { oldState, newState ->
+ policy.onUserRemoved(userId, oldState, newState)
+ }
+ }
+
+ fun onPackageAdded(packageState: PackageState) {
+ mutateState { oldState, newState ->
+ policy.onPackageAdded(packageState, oldState, newState)
+ }
+ }
+
+ fun onPackageRemoved(packageState: PackageState) {
+ mutateState { oldState, newState ->
+ policy.onPackageRemoved(packageState, oldState, newState)
+ }
+ }
+
+ // TODO: Replace (oldState, newState) with Kotlin context receiver once it's stabilized.
+ private inline fun mutateState(action: (oldState: AccessState, newState: AccessState) -> Unit) {
+ synchronized(stateLock) {
+ val oldState = state
+ val newState = oldState.copy()
+ action(oldState, newState)
+ persistence.write(newState)
+ state = newState
+ }
+ }
+}
diff --git a/service/java/com/android/permission/access/AccessPersistence.kt b/service/java/com/android/permission/access/AccessPersistence.kt
new file mode 100644
index 000000000..4c2c09d6b
--- /dev/null
+++ b/service/java/com/android/permission/access/AccessPersistence.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access
+
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+class AccessPersistence {
+ fun read(state: AccessState) {
+ readSystemState(state.systemState)
+ val userStates = state.userStates
+ state.systemState.userIds.forEachIndexed { _, userId ->
+ readUserState(userId, userStates.getOrPut(userId) { UserState() })
+ }
+ }
+
+ private fun readSystemState(systemState: SystemState) {
+ TODO()
+ }
+
+ private fun readUserState(userId: Int, userState: UserState) {
+ TODO()
+ }
+
+ fun write(state: AccessState) {
+ writeState(state.systemState, ::writeSystemState)
+ state.userStates.forEachIndexed { _, userId, userState ->
+ writeState(userState) { writeUserState(userId, it) }
+ }
+ }
+
+ private inline fun <T : WritableState> writeState(state: T, write: (T) -> Unit) {
+ when (val writeMode = state.writeMode) {
+ WriteMode.NONE -> {}
+ WriteMode.SYNC -> write(state)
+ WriteMode.ASYNC -> TODO()
+ else -> error(writeMode)
+ }
+ }
+
+ private fun writeSystemState(systemState: SystemState) {
+ TODO()
+ }
+
+ private fun writeUserState(userId: Int, userState: UserState) {
+ TODO()
+ }
+}
diff --git a/service/java/com/android/permission/access/AccessPolicy.kt b/service/java/com/android/permission/access/AccessPolicy.kt
new file mode 100644
index 000000000..87d2cb6cd
--- /dev/null
+++ b/service/java/com/android/permission/access/AccessPolicy.kt
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access
+
+import com.android.permission.access.appop.PackageAppOpPolicy
+import com.android.permission.access.appop.UidAppOpPolicy
+import com.android.permission.access.external.PackageState
+import com.android.permission.access.permission.UidPermissionPolicy
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+class AccessPolicy private constructor(
+ private val schemePolicies: IndexedMap<String, IndexedMap<String, SchemePolicy>>
+) {
+ constructor() : this(
+ IndexedMap<String, IndexedMap<String, SchemePolicy>>().apply {
+ fun addPolicy(policy: SchemePolicy) =
+ getOrPut(policy.subjectScheme) { IndexedMap() }.put(policy.objectScheme, policy)
+
+ addPolicy(UidPermissionPolicy())
+ addPolicy(UidAppOpPolicy())
+ addPolicy(PackageAppOpPolicy())
+ }
+ )
+
+ fun getDecision(subject: AccessUri, `object`: AccessUri, state: AccessState): Int {
+ val schemePolicy = checkNotNull(getSchemePolicy(subject, `object`)) { "Scheme policy for " +
+ "subject=$subject object=$`object` does not exist."}
+ return schemePolicy.getDecision(subject, `object`, state)
+ }
+
+ fun setDecision(
+ subject: AccessUri,
+ `object`: AccessUri,
+ decision: Int,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ val schemePolicy = checkNotNull(getSchemePolicy(subject, `object`)) { "Scheme policy for " +
+ "subject=$subject object=$`object` does not exist."}
+ return schemePolicy.setDecision(subject, `object`, decision, oldState, newState)
+ }
+
+ private fun getSchemePolicy(subject: AccessUri, `object`: AccessUri): SchemePolicy? =
+ schemePolicies[subject.scheme]?.get(`object`.scheme)
+
+ fun onUserAdded(userId: Int, oldState: AccessState, newState: AccessState) {
+ newState.systemState.userIds += userId
+ newState.userStates[userId] = UserState()
+ forEachSchemePolicy { it.onUserAdded(userId, oldState, newState) }
+ }
+
+ fun onUserRemoved(userId: Int, oldState: AccessState, newState: AccessState) {
+ newState.systemState.userIds -= userId
+ newState.userStates -= userId
+ forEachSchemePolicy { it.onUserRemoved(userId, oldState, newState) }
+ }
+
+ fun onPackageAdded(packageState: PackageState, oldState: AccessState, newState: AccessState) {
+ var isAppIdAdded = false
+ newState.systemState.apply {
+ packageStates[packageState.packageName] = packageState
+ appIds.getOrPut(packageState.appId) {
+ isAppIdAdded = true
+ IndexedListSet()
+ }.add(packageState.packageName)
+ }
+ if (isAppIdAdded) {
+ forEachSchemePolicy { it.onAppIdAdded(packageState.appId, oldState, newState) }
+ }
+ forEachSchemePolicy { it.onPackageAdded(packageState, oldState, newState) }
+ }
+
+ fun onPackageRemoved(packageState: PackageState, oldState: AccessState, newState: AccessState) {
+ var isAppIdRemoved = false
+ newState.systemState.apply {
+ packageStates -= packageState.packageName
+ appIds.apply appIds@{
+ this[packageState.appId]?.apply {
+ this -= packageState.packageName
+ if (isEmpty()) {
+ this@appIds -= packageState.appId
+ isAppIdRemoved = true
+ }
+ }
+ }
+ }
+ forEachSchemePolicy { it.onPackageRemoved(packageState, oldState, newState) }
+ if (isAppIdRemoved) {
+ forEachSchemePolicy { it.onAppIdRemoved(packageState.appId, oldState, newState) }
+ }
+ }
+
+ private inline fun forEachSchemePolicy(action: (SchemePolicy) -> Unit) {
+ schemePolicies.forEachValueIndexed { _, it ->
+ it.forEachValueIndexed { _, it ->
+ action(it)
+ }
+ }
+ }
+}
+
+abstract class SchemePolicy {
+ abstract val subjectScheme: String
+
+ abstract val objectScheme: String
+
+ abstract fun getDecision(subject: AccessUri, `object`: AccessUri, state: AccessState): Int
+
+ abstract fun setDecision(
+ subject: AccessUri,
+ `object`: AccessUri,
+ decision: Int,
+ oldState: AccessState,
+ newState: AccessState
+ )
+
+ open fun onUserAdded(userId: Int, oldState: AccessState, newState: AccessState) {}
+
+ open fun onUserRemoved(userId: Int, oldState: AccessState, newState: AccessState) {}
+
+ open fun onAppIdAdded(appId: Int, oldState: AccessState, newState: AccessState) {}
+
+ open fun onAppIdRemoved(appId: Int, oldState: AccessState, newState: AccessState) {}
+
+ open fun onPackageAdded(
+ packageState: PackageState,
+ oldState: AccessState,
+ newState: AccessState
+ ) {}
+
+ open fun onPackageRemoved(
+ packageState: PackageState,
+ oldState: AccessState,
+ newState: AccessState
+ ) {}
+}
diff --git a/service/java/com/android/permission/access/AccessState.kt b/service/java/com/android/permission/access/AccessState.kt
new file mode 100644
index 000000000..231d78ee6
--- /dev/null
+++ b/service/java/com/android/permission/access/AccessState.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access
+
+import android.content.pm.PermissionGroupInfo
+import com.android.permission.access.data.Permission
+import com.android.permission.access.external.PackageState
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+class AccessState private constructor(
+ val systemState: SystemState,
+ val userStates: IntMap<UserState>
+) {
+ constructor() : this(SystemState(), IntMap())
+
+ fun copy(): AccessState = AccessState(systemState.copy(), userStates.copy { it.copy() })
+}
+
+class SystemState private constructor(
+ val userIds: IntSet,
+ val packageStates: IndexedMap<String, PackageState>,
+ val appIds: IntMap<IndexedListSet<String>>,
+ val permissionGroups: IndexedMap<String, PermissionGroupInfo>,
+ val permissionTrees: IndexedMap<String, Permission>,
+ val permissions: IndexedMap<String, Permission>
+) : WritableState() {
+ constructor() : this(IntSet(), IndexedMap(), IntMap(), IndexedMap(), IndexedMap(), IndexedMap())
+
+ fun copy(): SystemState =
+ SystemState(
+ userIds.copy(), packageStates.copy { it }, appIds.copy { it.copy() },
+ permissionGroups.copy { it }, permissionTrees.copy { it }, permissions.copy { it }
+ )
+}
+
+class UserState private constructor(
+ val permissionFlags: IntMap<IndexedMap<String, Int>>,
+ val uidAppOpModes: IntMap<IndexedMap<String, Int>>,
+ val packageAppOpModes: IndexedMap<String, IndexedMap<String, Int>>,
+) : WritableState() {
+ constructor() : this(IntMap(), IntMap(), IndexedMap())
+
+ fun copy(): UserState = UserState(permissionFlags.copy { it.copy { it } },
+ uidAppOpModes.copy { it.copy { it } }, packageAppOpModes.copy { it.copy { it } })
+}
+
+object WriteMode {
+ const val NONE = 0
+ const val SYNC = 1
+ const val ASYNC = 2
+}
+
+abstract class WritableState {
+ var writeMode: Int = WriteMode.NONE
+ private set
+
+ fun requestWrite(sync: Boolean = false) {
+ if (sync) {
+ writeMode = WriteMode.SYNC
+ } else {
+ if (writeMode != WriteMode.SYNC) {
+ writeMode = WriteMode.ASYNC
+ }
+ }
+ }
+}
diff --git a/service/java/com/android/permission/access/AccessUri.kt b/service/java/com/android/permission/access/AccessUri.kt
new file mode 100644
index 000000000..e7a05baeb
--- /dev/null
+++ b/service/java/com/android/permission/access/AccessUri.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access
+
+import com.android.permission.access.external.UserHandle
+import com.android.permission.access.external.UserHandleCompat
+
+sealed class AccessUri(
+ val scheme: String
+) {
+ override fun equals(other: Any?): Boolean {
+ throw NotImplementedError()
+ }
+
+ override fun hashCode(): Int {
+ throw NotImplementedError()
+ }
+
+ override fun toString(): String {
+ throw NotImplementedError()
+ }
+}
+
+data class AppOpUri(
+ val appOpName: String
+) : AccessUri(SCHEME) {
+ override fun toString(): String = "$scheme:///$appOpName"
+
+ companion object {
+ const val SCHEME = "app-op"
+ }
+}
+
+data class PackageUri(
+ val packageName: String,
+ val userId: Int
+) : AccessUri(SCHEME) {
+ override fun toString(): String = "$scheme:///$packageName/$userId"
+
+ companion object {
+ const val SCHEME = "package"
+ }
+}
+
+data class PermissionUri(
+ val permissionName: String
+) : AccessUri(SCHEME) {
+ override fun toString(): String = "$scheme:///$permissionName"
+
+ companion object {
+ const val SCHEME = "permission"
+ }
+}
+
+data class UidUri(
+ val uid: Int
+) : AccessUri(SCHEME) {
+ val userId: Int
+ get() = UserHandleCompat.getUserId(uid)
+
+ val appId: Int
+ get() = UserHandle.getAppId(uid)
+
+ override fun toString(): String = "$scheme:///$uid"
+
+ companion object {
+ const val SCHEME = "uid"
+ }
+}
diff --git a/service/java/com/android/permission/access/appop/AppOpModes.kt b/service/java/com/android/permission/access/appop/AppOpModes.kt
new file mode 100644
index 000000000..12f888eac
--- /dev/null
+++ b/service/java/com/android/permission/access/appop/AppOpModes.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.appop
+
+import android.app.AppOpsManager
+
+object AppOpModes {
+ const val MODE_ALLOWED = AppOpsManager.MODE_ALLOWED
+ const val MODE_IGNORED = AppOpsManager.MODE_IGNORED
+ const val MODE_ERRORED = AppOpsManager.MODE_ERRORED
+ const val MODE_DEFAULT = AppOpsManager.MODE_DEFAULT
+ const val MODE_FOREGROUND = AppOpsManager.MODE_FOREGROUND
+}
diff --git a/service/java/com/android/permission/access/appop/BaseAppOpPolicy.kt b/service/java/com/android/permission/access/appop/BaseAppOpPolicy.kt
new file mode 100644
index 000000000..76f0b41af
--- /dev/null
+++ b/service/java/com/android/permission/access/appop/BaseAppOpPolicy.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.appop
+
+import android.app.AppOpsManager
+import com.android.permission.access.SchemePolicy
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+abstract class BaseAppOpPolicy : SchemePolicy() {
+ protected fun getAppOpMode(modes: IndexedMap<String, Int>?, appOpName: String): Int =
+ modes?.get(appOpName) ?: opToDefaultMode(appOpName)
+
+ protected fun setAppOpMode(
+ modes: IndexedMap<String, Int>,
+ appOpName: String,
+ decision: Int
+ ) {
+ if (decision == opToDefaultMode(appOpName)) {
+ modes -= appOpName
+ } else {
+ modes[appOpName] = decision
+ }
+ }
+
+ // TODO need to check that [AppOpsManager.getSystemAlertWindowDefault] works; likely no issue
+ // since running in system process.
+ private fun opToDefaultMode(appOpName: String) = AppOpsManager.opToDefaultMode(appOpName)
+}
diff --git a/service/java/com/android/permission/access/appop/PackageAppOpPolicy.kt b/service/java/com/android/permission/access/appop/PackageAppOpPolicy.kt
new file mode 100644
index 000000000..4bf50948b
--- /dev/null
+++ b/service/java/com/android/permission/access/appop/PackageAppOpPolicy.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.appop
+
+import com.android.permission.access.AccessState
+import com.android.permission.access.AccessUri
+import com.android.permission.access.AppOpUri
+import com.android.permission.access.PackageUri
+import com.android.permission.access.UserState
+import com.android.permission.access.external.PackageState
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+class PackageAppOpPolicy : BaseAppOpPolicy() {
+ override val subjectScheme: String
+ get() = PackageUri.SCHEME
+
+ override val objectScheme: String
+ get() = AppOpUri.SCHEME
+
+ override fun getDecision(subject: AccessUri, `object`: AccessUri, state: AccessState): Int {
+ subject as PackageUri
+ `object` as AppOpUri
+ return getAppOpMode(state.userStates[subject.userId]
+ ?.packageAppOpModes?.get(subject.packageName), `object`.appOpName)
+ }
+
+ override fun setDecision(
+ subject: AccessUri,
+ `object`: AccessUri,
+ decision: Int,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ subject as PackageUri
+ `object` as AppOpUri
+ val modes = newState.userStates.getOrPut(subject.userId) { UserState() }
+ .packageAppOpModes.getOrPut(subject.packageName) { IndexedMap() }
+ setAppOpMode(modes, `object`.appOpName, decision)
+ }
+
+ override fun onPackageRemoved(
+ packageState: PackageState,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ newState.userStates.forEachIndexed { _, _, userState ->
+ userState.packageAppOpModes -= packageState.packageName
+ }
+ }
+}
diff --git a/service/java/com/android/permission/access/appop/UidAppOpPolicy.kt b/service/java/com/android/permission/access/appop/UidAppOpPolicy.kt
new file mode 100644
index 000000000..cbc1a3200
--- /dev/null
+++ b/service/java/com/android/permission/access/appop/UidAppOpPolicy.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.appop
+
+import com.android.permission.access.AccessState
+import com.android.permission.access.AccessUri
+import com.android.permission.access.AppOpUri
+import com.android.permission.access.UidUri
+import com.android.permission.access.UserState
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+class UidAppOpPolicy : BaseAppOpPolicy() {
+ override val subjectScheme: String
+ get() = UidUri.SCHEME
+
+ override val objectScheme: String
+ get() = AppOpUri.SCHEME
+
+ override fun getDecision(subject: AccessUri, `object`: AccessUri, state: AccessState): Int {
+ subject as UidUri
+ `object` as AppOpUri
+ return getAppOpMode(state.userStates[subject.userId]?.uidAppOpModes
+ ?.get(subject.appId), `object`.appOpName)
+ }
+
+ override fun setDecision(
+ subject: AccessUri,
+ `object`: AccessUri,
+ decision: Int,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ subject as UidUri
+ `object` as AppOpUri
+ val modes = newState.userStates.getOrPut(subject.userId) { UserState() }
+ .uidAppOpModes.getOrPut(subject.appId) { IndexedMap() }
+ setAppOpMode(modes, `object`.appOpName, decision)
+ }
+
+ override fun onAppIdRemoved(appId: Int, oldState: AccessState, newState: AccessState) {
+ newState.userStates.forEachIndexed { _, _, userState ->
+ userState.uidAppOpModes -= appId
+ }
+ }
+}
diff --git a/service/java/com/android/permission/access/data/Package.kt b/service/java/com/android/permission/access/data/Package.kt
new file mode 100644
index 000000000..6c340551b
--- /dev/null
+++ b/service/java/com/android/permission/access/data/Package.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.data
+
+import com.android.permission.access.external.AndroidPackage
+
+class Package(
+ private val androidPackage: AndroidPackage
+) {
+ val name: String
+ get() = androidPackage.packageName
+
+ val adoptPermissions: List<String>
+ get() = androidPackage.adoptPermissions
+
+ val appId: Int
+ get() = androidPackage.appId
+
+ val requestedPermissions: List<String>
+ get() = androidPackage.requestedPermissions
+
+ override fun equals(other: Any?): Boolean {
+ throw NotImplementedError()
+ }
+
+ override fun hashCode(): Int {
+ throw NotImplementedError()
+ }
+}
diff --git a/service/java/com/android/permission/access/data/Permission.kt b/service/java/com/android/permission/access/data/Permission.kt
new file mode 100644
index 000000000..8ca268c85
--- /dev/null
+++ b/service/java/com/android/permission/access/data/Permission.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.data
+
+import android.content.pm.PermissionInfo
+
+class Permission(
+ val permissionInfo: PermissionInfo,
+ val type: Int,
+ val isReconciled: Boolean
+) {
+ val name: String
+ get() = permissionInfo.name
+
+ val packageName: String
+ get() = permissionInfo.packageName
+
+ companion object {
+ // The permission is defined in an application manifest.
+ const val TYPE_MANIFEST = 0
+ // The permission is defined in a system config.
+ const val TYPE_CONFIG = 1
+ // The permission is defined dynamically.
+ const val TYPE_DYNAMIC = 2
+ }
+}
diff --git a/service/java/com/android/permission/access/external/PackageInfoUtils.kt b/service/java/com/android/permission/access/external/PackageInfoUtils.kt
new file mode 100644
index 000000000..1ee4bfad0
--- /dev/null
+++ b/service/java/com/android/permission/access/external/PackageInfoUtils.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.external
+
+import android.content.pm.PermissionGroupInfo
+import android.content.pm.PermissionInfo
+
+object PackageInfoUtils {
+ fun generatePermissionInfo(parsedPermission: ParsedPermission, flags: Long): PermissionInfo {
+ throw NotImplementedError()
+ }
+
+ fun generatePermissionGroupInfo(
+ parsedPermissionGroup: ParsedPermissionGroup,
+ flags: Long
+ ): PermissionGroupInfo {
+ throw NotImplementedError()
+ }
+}
diff --git a/service/java/com/android/permission/access/external/PackageState.kt b/service/java/com/android/permission/access/external/PackageState.kt
new file mode 100644
index 000000000..c88ef1605
--- /dev/null
+++ b/service/java/com/android/permission/access/external/PackageState.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.external
+
+import android.util.SparseArray
+
+interface PackageState {
+ val androidPackage: AndroidPackage?
+ val appId: Int
+ val isSystem: Boolean
+ val packageName: String
+ val userStates: SparseArray<PackageUserState>
+}
+
+interface AndroidPackage {
+ val packageName: String
+ val appId: Int
+ val adoptPermissions: List<String>
+ val permissions: List<ParsedPermission>
+ val permissionGroups: List<ParsedPermissionGroup>
+ val requestedPermissions: List<String>
+}
+
+interface ParsedPermission {
+ val name: String
+ val isTree: Boolean
+ val packageName: String
+}
+
+interface ParsedPermissionGroup {
+ val name: String
+ val packageName: String
+}
+
+interface PackageUserState {
+ val isInstantApp: Boolean
+}
diff --git a/service/java/com/android/permission/access/external/UserHandle.kt b/service/java/com/android/permission/access/external/UserHandle.kt
new file mode 100644
index 000000000..2c30dd9aa
--- /dev/null
+++ b/service/java/com/android/permission/access/external/UserHandle.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.external
+
+interface UserHandle {
+ companion object {
+ fun getAppId(uid: Int): Int {
+ throw NotImplementedError()
+ }
+ }
+}
+
+object UserHandleCompat {
+ fun getUserId(uid: Int): Int {
+ throw NotImplementedError()
+ }
+}
diff --git a/service/java/com/android/access/package-info.java b/service/java/com/android/permission/access/package-info.java
index 18fcfc69d..af115bead 100644
--- a/service/java/com/android/access/package-info.java
+++ b/service/java/com/android/permission/access/package-info.java
@@ -19,4 +19,4 @@
* TODO(b/146466118) remove this javadoc tag
*/
@android.annotation.Hide
-package com.android.access;
+package com.android.permission.access;
diff --git a/service/java/com/android/access/AccessCheckingService.kt b/service/java/com/android/permission/access/permission/PermissionFlags.kt
index e61a245fd..c6b9eb210 100644
--- a/service/java/com/android/access/AccessCheckingService.kt
+++ b/service/java/com/android/permission/access/permission/PermissionFlags.kt
@@ -14,11 +14,8 @@
* limitations under the License.
*/
-package com.android.access
+package com.android.permission.access.permission
-import androidx.annotation.Keep
-
-@Keep
-class AccessCheckingService {
- var list = mutableListOf<Any>()
+object PermissionFlags {
+ const val DENIED = 0
}
diff --git a/service/java/com/android/permission/access/permission/UidPermissionPolicy.kt b/service/java/com/android/permission/access/permission/UidPermissionPolicy.kt
new file mode 100644
index 000000000..080ce0c22
--- /dev/null
+++ b/service/java/com/android/permission/access/permission/UidPermissionPolicy.kt
@@ -0,0 +1,287 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.permission
+
+import android.content.pm.PackageManager
+import android.content.pm.PermissionInfo
+import android.util.Log
+import com.android.permission.access.AccessState
+import com.android.permission.access.AccessUri
+import com.android.permission.access.PermissionUri
+import com.android.permission.access.SchemePolicy
+import com.android.permission.access.UidUri
+import com.android.permission.access.UserState
+import com.android.permission.access.data.Permission
+import com.android.permission.access.external.PackageInfoUtils
+import com.android.permission.access.external.PackageState
+import com.android.permission.access.util.* // ktlint-disable no-wildcard-imports
+
+private val LOG_TAG = UidPermissionPolicy::class.java.simpleName
+
+class UidPermissionPolicy : SchemePolicy() {
+ override val subjectScheme: String
+ get() = UidUri.SCHEME
+
+ override val objectScheme: String
+ get() = PermissionUri.SCHEME
+
+ override fun getDecision(subject: AccessUri, `object`: AccessUri, state: AccessState): Int {
+ subject as UidUri
+ `object` as PermissionUri
+ val flags = state.userStates[subject.userId]?.permissionFlags?.get(subject.appId)
+ ?.get(`object`.permissionName) ?: return PermissionFlags.DENIED
+ return when (flags) {
+ // TODO
+ 0 -> PermissionFlags.DENIED
+ else -> error(flags)
+ }
+ }
+
+ override fun setDecision(
+ subject: AccessUri,
+ `object`: AccessUri,
+ decision: Int,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ subject as UidUri
+ `object` as PermissionUri
+ val uidFlags = newState.userStates.getOrPut(subject.userId) { UserState() }
+ .permissionFlags.getOrPut(subject.appId) { IndexedMap() }
+ val flags = when (decision) {
+ // TODO
+ PermissionFlags.DENIED -> 0
+ else -> error(decision)
+ }
+ uidFlags[`object`.permissionName] = flags
+ }
+
+ override fun onUserAdded(userId: Int, oldState: AccessState, newState: AccessState) {
+ // NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG
+ // updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, true)
+ }
+
+ override fun onUserRemoved(userId: Int, oldState: AccessState, newState: AccessState) {}
+
+ override fun onAppIdAdded(appId: Int, oldState: AccessState, newState: AccessState) {
+ // TODO
+ }
+
+ override fun onAppIdRemoved(appId: Int, oldState: AccessState, newState: AccessState) {
+ // TODO
+ }
+
+ override fun onPackageAdded(
+ packageState: PackageState,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ adoptPermissions(packageState, newState)
+ addPermissionGroups(packageState, newState)
+ addPermissions(packageState, newState)
+ // TODO: revokeStoragePermissionsIfScopeExpandedInternal()
+ // TODO: Changed: updatePermissions() equivalent here to create permission state
+ // immediately.
+ }
+
+ private fun adoptPermissions(packageState: PackageState, newState: AccessState) {
+ val `package` = packageState.androidPackage!!
+ `package`.adoptPermissions.forEachIndexed { _, originalPackageName ->
+ val packageName = `package`.packageName
+ if (!canAdoptPermissions(packageName, originalPackageName, newState)) {
+ return@forEachIndexed
+ }
+ newState.systemState.permissions.let { permissions ->
+ permissions.forEachIndexed { i, permissionName, oldPermission ->
+ if (oldPermission.packageName != originalPackageName) {
+ return@forEachIndexed
+ }
+ @Suppress("DEPRECATION")
+ val newPermissionInfo = PermissionInfo().apply {
+ name = oldPermission.permissionInfo.name
+ this.packageName = packageName
+ protectionLevel = oldPermission.permissionInfo.protectionLevel
+ }
+ val newPermission = Permission(newPermissionInfo, oldPermission.type, false)
+ permissions.setValueAt(i, newPermission)
+ }
+ }
+ }
+ }
+
+ private fun canAdoptPermissions(
+ packageName: String,
+ originalPackageName: String,
+ newState: AccessState
+ ): Boolean {
+ val originalPackageState = newState.systemState.packageStates[originalPackageName]
+ ?: return false
+ if (!originalPackageState.isSystem) {
+ Log.w(
+ LOG_TAG, "Unable to adopt permissions from $originalPackageName to $packageName:" +
+ " original package not in system partition"
+ )
+ return false
+ }
+ if (originalPackageState.androidPackage != null) {
+ Log.w(
+ LOG_TAG, "Unable to adopt permissions from $originalPackageName to $packageName:" +
+ " original package still exists"
+ )
+ return false
+ }
+ return true
+ }
+
+ private fun addPermissionGroups(packageState: PackageState, newState: AccessState) {
+ // Different from the old implementation, which decides whether the app is an instant app by
+ // the install flags, now for consistent behavior we allow adding permission groups if the
+ // app is non-instant in at least one user.
+ val isInstantApp = packageState.userStates.allIndexed { _, _, it -> it.isInstantApp }
+ if (isInstantApp) {
+ Log.w(
+ LOG_TAG, "Ignoring permission groups declared in package" +
+ " ${packageState.packageName}: instant apps cannot declare permission groups"
+ )
+ return
+ }
+ packageState.androidPackage!!.permissionGroups.forEachIndexed { _, parsedPermissionGroup ->
+ val newPermissionGroup = PackageInfoUtils.generatePermissionGroupInfo(
+ parsedPermissionGroup, PackageManager.GET_META_DATA.toLong()
+ )
+ // TODO: Clear permission state on group take-over?
+ val permissionGroupName = newPermissionGroup.name
+ val oldPermissionGroup = newState.systemState.permissionGroups[permissionGroupName]
+ if (oldPermissionGroup != null &&
+ newPermissionGroup.packageName != oldPermissionGroup.packageName) {
+ Log.w(
+ LOG_TAG, "Ignoring permission group $permissionGroupName declared in package" +
+ " ${newPermissionGroup.packageName}: already declared in another package" +
+ " ${oldPermissionGroup.packageName}"
+ )
+ return@forEachIndexed
+ }
+ newState.systemState.permissionGroups[permissionGroupName] = newPermissionGroup
+ }
+ }
+
+ private fun addPermissions(packageState: PackageState, newState: AccessState) {
+ packageState.androidPackage!!.permissions.forEachIndexed { _, parsedPermission ->
+ // TODO:
+ // parsedPermission.flags = parsedPermission.flags andInv PermissionInfo.FLAG_INSTALLED
+ // TODO: This seems actually unused.
+ // if (packageState.androidPackage.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
+ // parsedPermission.setParsedPermissionGroup(
+ // newState.systemState.permissionGroup[parsedPermission.group]
+ // )
+ // }
+ val newPermissionInfo = PackageInfoUtils.generatePermissionInfo(
+ parsedPermission, PackageManager.GET_META_DATA.toLong()
+ )
+ // TODO: newPermissionInfo.flags |= PermissionInfo.FLAG_INSTALLED
+ val permissionName = newPermissionInfo.name
+ val oldPermission = if (parsedPermission.isTree) {
+ newState.systemState.permissionTrees[permissionName]
+ } else {
+ newState.systemState.permissions[permissionName]
+ }
+ // Different from the old implementation, which may add an (incomplete) signature
+ // permission inside another package's permission tree, we now consistently ignore such
+ // permissions.
+ val permissionTree = getPermissionTree(permissionName, newState)
+ val newPackageName = newPermissionInfo.packageName
+ if (permissionTree != null && newPackageName != permissionTree.packageName) {
+ Log.w(
+ LOG_TAG, "Ignoring permission $permissionName declared in package" +
+ " $newPackageName: base permission tree ${permissionTree.name} is" +
+ " declared in another package ${permissionTree.packageName}"
+ )
+ return@forEachIndexed
+ }
+ val newPermission = if (oldPermission != null &&
+ newPackageName != oldPermission.packageName) {
+ val oldPackageName = oldPermission.packageName
+ // Only allow system apps to redefine non-system permissions.
+ if (!packageState.isSystem) {
+ Log.w(
+ LOG_TAG, "Ignoring permission $permissionName declared in package" +
+ " $newPackageName: already declared in another package" +
+ " $oldPackageName"
+ )
+ return@forEachIndexed
+ }
+ if (oldPermission.type == Permission.TYPE_CONFIG &&
+ !oldPermission.isReconciled) {
+ // It's a config permission and has no owner, take ownership now.
+ Permission(newPermissionInfo, Permission.TYPE_CONFIG, true)
+ } else if (newState.systemState.packageStates[oldPackageName]?.isSystem != true) {
+ Log.w(
+ LOG_TAG, "Overriding permission $permissionName with new declaration in" +
+ " system package $newPackageName: originally declared in another" +
+ " package $oldPackageName"
+ )
+ // Remove permission state on owner change.
+ newState.userStates.forEachValueIndexed { _, userState ->
+ userState.permissionFlags.forEachValueIndexed { _, permissionFlags ->
+ permissionFlags -= newPermissionInfo.name
+ }
+ }
+ // TODO: Notify re-evaluation of this permission.
+ Permission(newPermissionInfo, Permission.TYPE_MANIFEST, true)
+ } else {
+ Log.w(
+ LOG_TAG, "Ignoring permission $permissionName declared in system package" +
+ " $newPackageName: already declared in another system package" +
+ " $oldPackageName")
+ return@forEachIndexed
+ }
+ } else {
+ // TODO: STOPSHIP: Clear permission state on type or group change.
+ // Different from the old implementation, which doesn't update the permission
+ // definition upon app update, but does update it on the next boot, we now
+ // consistently update the permission definition upon app update.
+ Permission(newPermissionInfo, Permission.TYPE_MANIFEST, true)
+ }
+
+ if (parsedPermission.isTree) {
+ newState.systemState.permissionTrees[permissionName] = newPermission
+ } else {
+ newState.systemState.permissions[permissionName] = newPermission
+ }
+ }
+ }
+
+ private fun getPermissionTree(permissionName: String, newState: AccessState): Permission? =
+ newState.systemState.permissionTrees.firstNotNullOfOrNullIndexed {
+ _, permissionTreeName, permissionTree ->
+ if (permissionName.startsWith(permissionTreeName) &&
+ permissionName.length > permissionTreeName.length &&
+ permissionName[permissionTreeName.length] == '.') {
+ permissionTree
+ } else {
+ null
+ }
+ }
+
+ override fun onPackageRemoved(
+ packageState: PackageState,
+ oldState: AccessState,
+ newState: AccessState
+ ) {
+ // TODO
+ }
+}
diff --git a/service/java/com/android/permission/access/util/IndexedList.kt b/service/java/com/android/permission/access/util/IndexedList.kt
new file mode 100644
index 000000000..94c0ac63c
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IndexedList.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+typealias IndexedList<T> = ArrayList<T>
+
+inline fun <T> IndexedList<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, this[index])) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun <T> IndexedList<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, this[index])) {
+ return true
+ }
+ }
+ return false
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun <T> IndexedList<T>.copy(): IndexedList<T> = IndexedList(this)
+
+inline fun <T> IndexedList<T>.forEachIndexed(action: (Int, T) -> Unit) {
+ for (index in indices) {
+ action(index, this[index])
+ }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedList<T>.minusAssign(element: T) {
+ remove(element)
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedList<T>.plusAssign(element: T) {
+ add(element)
+}
diff --git a/service/java/com/android/permission/access/util/IndexedListSet.kt b/service/java/com/android/permission/access/util/IndexedListSet.kt
new file mode 100644
index 000000000..4e50e5810
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IndexedListSet.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+class IndexedListSet<T> private constructor(
+ private val list: ArrayList<T>
+) : MutableSet<T> {
+ constructor() : this(ArrayList())
+
+ override val size: Int
+ get() = list.size
+
+ override fun contains(element: T): Boolean = list.contains(element)
+
+ override fun isEmpty(): Boolean = list.isEmpty()
+
+ override fun iterator(): MutableIterator<T> = list.iterator()
+
+ override fun containsAll(elements: Collection<T>): Boolean {
+ throw NotImplementedError()
+ }
+
+ fun elementAt(index: Int): T = list[index]
+
+ fun indexOf(element: T): Int = list.indexOf(element)
+
+ override fun add(element: T): Boolean =
+ if (list.contains(element)) {
+ false
+ } else {
+ list.add(element)
+ true
+ }
+
+ override fun remove(element: T): Boolean = list.remove(element)
+
+ override fun clear() {
+ list.clear()
+ }
+
+ override fun addAll(elements: Collection<T>): Boolean {
+ throw NotImplementedError()
+ }
+
+ override fun removeAll(elements: Collection<T>): Boolean {
+ throw NotImplementedError()
+ }
+
+ override fun retainAll(elements: Collection<T>): Boolean {
+ throw NotImplementedError()
+ }
+
+ fun removeAt(index: Int): T? = list.removeAt(index)
+
+ fun copy(): IndexedListSet<T> = IndexedListSet(ArrayList(list))
+}
+
+inline fun <T> IndexedListSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, elementAt(index))) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun <T> IndexedListSet<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, elementAt(index))) {
+ return true
+ }
+ }
+ return false
+}
+
+inline fun <T> IndexedListSet<T>.forEachIndexed(action: (Int, T) -> Unit) {
+ for (index in indices) {
+ action(index, elementAt(index))
+ }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedListSet<T>.minusAssign(element: T) {
+ remove(element)
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedListSet<T>.plusAssign(element: T) {
+ add(element)
+}
diff --git a/service/java/com/android/permission/access/util/IndexedMap.kt b/service/java/com/android/permission/access/util/IndexedMap.kt
new file mode 100644
index 000000000..33843b1d4
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IndexedMap.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+import android.util.ArrayMap
+
+typealias IndexedMap<K, V> = ArrayMap<K, V>
+
+inline fun <K, V> IndexedMap<K, V>.allIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, keyAt(index), valueAt(index))) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun <K, V> IndexedMap<K, V>.anyIndexed(predicate: (Int, K, V) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, keyAt(index), valueAt(index))) {
+ return true
+ }
+ }
+ return false
+}
+
+inline fun <K, V> IndexedMap<K, V>.copy(copyValue: (V) -> V): IndexedMap<K, V> =
+ IndexedMap(this).apply {
+ forEachValueIndexed { index, value ->
+ setValueAt(index, copyValue(value))
+ }
+ }
+
+inline fun <K, V, R> IndexedMap<K, V>.firstNotNullOfOrNullIndexed(transform: (Int, K, V) -> R): R? {
+ for (index in 0 until size) {
+ transform(index, keyAt(index), valueAt(index))?.let { return it }
+ }
+ return null
+}
+
+inline fun <K, V> IndexedMap<K, V>.forEachIndexed(action: (Int, K, V) -> Unit) {
+ for (index in 0 until size) {
+ action(index, keyAt(index), valueAt(index))
+ }
+}
+
+inline fun <K, V> IndexedMap<K, V>.forEachKeyIndexed(action: (Int, K) -> Unit) {
+ for (index in 0 until size) {
+ action(index, keyAt(index))
+ }
+}
+
+inline fun <K, V> IndexedMap<K, V>.forEachValueIndexed(action: (Int, V) -> Unit) {
+ for (index in 0 until size) {
+ action(index, valueAt(index))
+ }
+}
+
+inline fun <K, V> IndexedMap<K, V>.getOrPut(key: K, defaultValue: () -> V): V {
+ get(key)?.let { return it }
+ return defaultValue().also { put(key, it) }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <K, V> IndexedMap<K, V>.minusAssign(key: K) {
+ remove(key)
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <K, V> IndexedMap<K, V>.set(key: K, value: V) {
+ put(key, value)
+}
diff --git a/service/java/com/android/permission/access/util/IndexedSet.kt b/service/java/com/android/permission/access/util/IndexedSet.kt
new file mode 100644
index 000000000..17e413cfc
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IndexedSet.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+import android.util.ArraySet
+
+typealias IndexedSet<T> = ArraySet<T>
+
+inline fun <T> IndexedSet<T>.allIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, elementAt(index))) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun <T> IndexedSet<T>.anyIndexed(predicate: (Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, elementAt(index))) {
+ return true
+ }
+ }
+ return false
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun <T> IndexedSet<T>.copy(): IndexedSet<T> = IndexedSet(this)
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun <T> IndexedSet<T>.elementAt(index: Int): T = valueAt(index)
+
+inline fun <T> IndexedSet<T>.forEachIndexed(action: (Int, T) -> Unit) {
+ for (index in indices) {
+ action(index, elementAt(index))
+ }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedSet<T>.minusAssign(element: T) {
+ remove(element)
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IndexedSet<T>.plusAssign(element: T) {
+ add(element)
+}
diff --git a/service/java/com/android/permission/access/util/IntMap.kt b/service/java/com/android/permission/access/util/IntMap.kt
new file mode 100644
index 000000000..bdff43d0d
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IntMap.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+import android.util.SparseArray
+
+typealias IntMap<T> = SparseArray<T>
+
+inline fun <T> IntMap<T>.allIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, keyAt(index), valueAt(index))) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun <T> IntMap<T>.anyIndexed(predicate: (Int, Int, T) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, keyAt(index), valueAt(index))) {
+ return true
+ }
+ }
+ return false
+}
+
+inline fun <T> IntMap<T>.copy(copyValue: (T) -> T): IntMap<T> =
+ this.clone().apply {
+ forEachValueIndexed { index, value ->
+ setValueAt(index, copyValue(value))
+ }
+ }
+
+inline fun <T> IntMap<T>.forEachIndexed(action: (Int, Int, T) -> Unit) {
+ for (index in 0 until size) {
+ action(index, keyAt(index), valueAt(index))
+ }
+}
+
+inline fun <T> IntMap<T>.forEachKeyIndexed(action: (Int, Int) -> Unit) {
+ for (index in 0 until size) {
+ action(index, keyAt(index))
+ }
+}
+
+inline fun <T> IntMap<T>.forEachValueIndexed(action: (Int, T) -> Unit) {
+ for (index in 0 until size) {
+ action(index, valueAt(index))
+ }
+}
+
+inline fun <T> IntMap<T>.getOrPut(key: Int, defaultValue: () -> T): T {
+ get(key)?.let { return it }
+ return defaultValue().also { put(key, it) }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun <T> IntMap<T>.minusAssign(key: Int) {
+ remove(key)
+}
+
+inline val <T> IntMap<T>.size: Int
+ get() = size()
diff --git a/service/java/com/android/permission/access/util/IntSet.kt b/service/java/com/android/permission/access/util/IntSet.kt
new file mode 100644
index 000000000..81eb294f5
--- /dev/null
+++ b/service/java/com/android/permission/access/util/IntSet.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permission.access.util
+
+import android.util.SparseBooleanArray
+
+class IntSet private constructor(
+ private val array: SparseBooleanArray
+) {
+ constructor() : this(SparseBooleanArray())
+
+ val size: Int
+ get() = array.size()
+
+ operator fun contains(element: Int): Boolean = array[element]
+
+ fun elementAt(index: Int): Int = array.keyAt(index)
+
+ fun indexOf(element: Int): Int = array.indexOfKey(element)
+
+ fun add(element: Int) {
+ array.put(element, true)
+ }
+
+ fun remove(element: Int) {
+ array.delete(element)
+ }
+
+ fun clear() {
+ array.clear()
+ }
+
+ fun removeAt(index: Int) {
+ array.removeAt(index)
+ }
+
+ fun copy(): IntSet = IntSet(array.clone())
+}
+
+inline fun IntSet.allIndexed(predicate: (Int, Int) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (!predicate(index, elementAt(index))) {
+ return false
+ }
+ }
+ return true
+}
+
+inline fun IntSet.anyIndexed(predicate: (Int, Int) -> Boolean): Boolean {
+ for (index in 0 until size) {
+ if (predicate(index, elementAt(index))) {
+ return true
+ }
+ }
+ return false
+}
+
+inline fun IntSet.forEachIndexed(action: (Int, Int) -> Unit) {
+ for (index in 0 until size) {
+ action(index, elementAt(index))
+ }
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun IntSet.minusAssign(element: Int) {
+ remove(element)
+}
+
+@Suppress("NOTHING_TO_INLINE")
+inline operator fun IntSet.plusAssign(element: Int) {
+ add(element)
+}
diff --git a/service/java/com/android/role/RoleService.java b/service/java/com/android/role/RoleService.java
index bb787b7cf..bc8d58a8a 100644
--- a/service/java/com/android/role/RoleService.java
+++ b/service/java/com/android/role/RoleService.java
@@ -272,15 +272,9 @@ public class RoleService extends SystemService implements RoleUserState.Callback
RoleControllerManager controller = mControllers.get(userId);
if (controller == null) {
Context systemContext = getContext();
- Context context;
- try {
- context = systemContext.createPackageContextAsUser(
- systemContext.getPackageName(), 0, UserHandle.of(userId));
- } catch (PackageManager.NameNotFoundException e) {
- throw new RuntimeException(e);
- }
+ Context userContext = systemContext.createContextAsUser(UserHandle.of(userId), 0);
controller = RoleControllerManager.createWithInitializedRemoteServiceComponentName(
- ForegroundThread.getHandler(), context);
+ ForegroundThread.getHandler(), userContext);
mControllers.put(userId, controller);
}
return controller;
diff --git a/service/java/com/android/role/RoleShellCommand.java b/service/java/com/android/role/RoleShellCommand.java
index 357ce5f76..808a64cb4 100644
--- a/service/java/com/android/role/RoleShellCommand.java
+++ b/service/java/com/android/role/RoleShellCommand.java
@@ -29,11 +29,14 @@ import com.android.modules.utils.BasicShellCommandHandler;
import com.android.permission.compat.UserHandleCompat;
import java.io.PrintWriter;
+import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@RequiresApi(Build.VERSION_CODES.S)
class RoleShellCommand extends BasicShellCommandHandler {
+ private static final String ROLE_HOLDER_SEPARATOR = ";";
+
@NonNull
private final IRoleManager mRoleManager;
@@ -74,6 +77,8 @@ class RoleShellCommand extends BasicShellCommandHandler {
PrintWriter pw = getOutPrintWriter();
try {
switch (cmd) {
+ case "get-role-holders":
+ return runGetRoleHolders();
case "add-role-holder":
return runAddRoleHolder();
case "remove-role-holder":
@@ -108,6 +113,15 @@ class RoleShellCommand extends BasicShellCommandHandler {
return Integer.parseInt(flags);
}
+ private int runGetRoleHolders() throws RemoteException {
+ int userId = getUserIdMaybe();
+ String roleName = getNextArgRequired();
+
+ List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(roleName, userId);
+ getOutPrintWriter().println(String.join(ROLE_HOLDER_SEPARATOR, roleHolders));
+ return 0;
+ }
+
private int runAddRoleHolder() throws RemoteException {
int userId = getUserIdMaybe();
String roleName = getNextArgRequired();
@@ -155,6 +169,7 @@ class RoleShellCommand extends BasicShellCommandHandler {
pw.println(" help or -h");
pw.println(" Print this help text.");
pw.println();
+ pw.println(" get-role-holders [--user USER_ID] ROLE");
pw.println(" add-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
pw.println(" remove-role-holder [--user USER_ID] ROLE PACKAGE [FLAGS]");
pw.println(" clear-role-holders [--user USER_ID] ROLE [FLAGS]");
diff --git a/service/java/com/android/role/TEST_MAPPING b/service/java/com/android/role/TEST_MAPPING
index 0d7bc1476..15173a9da 100644
--- a/service/java/com/android/role/TEST_MAPPING
+++ b/service/java/com/android/role/TEST_MAPPING
@@ -1,10 +1,10 @@
{
"presubmit": [
{
- "name": "CtsStatsdHostTestCases",
+ "name": "CtsAppSecurityHostTestCases",
"options": [
{
- "include-filter": "android.cts.statsd.atom.UidAtomTests#testRoleHolder"
+ "include-filter": "android.appsecurity.cts.StatsdAppSecurityAtomTest#testRoleHolder"
}
]
},
@@ -16,5 +16,22 @@
}
]
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsRoleTestCases[com.google.android.permission.apex]",
+ "options": [
+ // TODO(b/238677748): These two tests currently fails on R base image
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList"
+ },
+ {
+ "exclude-filter": "android.app.role.cts.RoleManagerTest#removeSmsRoleHolderThenPermissionIsRevoked"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/service/java/com/android/safetycenter/TEST_MAPPING b/service/java/com/android/safetycenter/TEST_MAPPING
index 5a26efe66..5feb2e901 100644
--- a/service/java/com/android/safetycenter/TEST_MAPPING
+++ b/service/java/com/android/safetycenter/TEST_MAPPING
@@ -13,5 +13,15 @@
{
"name": "CtsSafetyCenterTestCases"
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/tests/cts/safetycenter/AndroidTest.xml b/tests/cts/safetycenter/AndroidTest.xml
index 6d2211fcd..0a1635e8f 100644
--- a/tests/cts/safetycenter/AndroidTest.xml
+++ b/tests/cts/safetycenter/AndroidTest.xml
@@ -28,6 +28,7 @@
<!-- Multi-user code is tested separately using Bedstead. See SafetyCenterMultiUsersTest. -->
<option name="config-descriptor:metadata" key="parameter"
value="not_secondary_user"/>
+ <option name="config-descriptor:metadata" key="mainline-param" value="com.google.android.permission.apex" />
<option name="test-suite-tag" value="cts"/>
diff --git a/tests/cts/safetycenter/TEST_MAPPING b/tests/cts/safetycenter/TEST_MAPPING
index 5a26efe66..5feb2e901 100644
--- a/tests/cts/safetycenter/TEST_MAPPING
+++ b/tests/cts/safetycenter/TEST_MAPPING
@@ -13,5 +13,15 @@
{
"name": "CtsSafetyCenterTestCases"
}
+ ],
+ "mainline-presubmit": [
+ {
+ "name": "CtsSafetyCenterTestCases[com.google.android.permission.apex]",
+ "options": [
+ {
+ "exclude-annotation": "android.platform.test.annotations.FlakyTest"
+ }
+ ]
+ }
]
}
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterMultiUsersTest.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterMultiUsersTest.kt
index 868444fe3..a356aa985 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterMultiUsersTest.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterMultiUsersTest.kt
@@ -70,12 +70,12 @@ import android.safetycenter.cts.testing.UiTestHelper.waitAllTextNotDisplayed
import androidx.test.core.app.ApplicationProvider
import com.android.bedstead.harrier.BedsteadJUnit4
import com.android.bedstead.harrier.DeviceState
-import com.android.bedstead.harrier.OptionalBoolean.TRUE
import com.android.bedstead.harrier.annotations.EnsureHasNoWorkProfile
import com.android.bedstead.harrier.annotations.EnsureHasSecondaryUser
import com.android.bedstead.harrier.annotations.EnsureHasWorkProfile
import com.android.bedstead.harrier.annotations.Postsubmit
import com.android.bedstead.harrier.annotations.enterprise.EnsureHasDeviceOwner
+import com.android.bedstead.nene.types.OptionalBoolean.TRUE
import com.android.safetycenter.resources.SafetyCenterResourcesContext
import com.google.common.base.Preconditions.checkState
import com.google.common.truth.Truth.assertThat
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetySourceIssueTest.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetySourceIssueTest.kt
index 5957956d7..12558ef8b 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetySourceIssueTest.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetySourceIssueTest.kt
@@ -20,6 +20,7 @@ import android.app.PendingIntent
import android.app.PendingIntent.FLAG_IMMUTABLE
import android.content.Context
import android.content.Intent
+import android.os.Build
import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_CRITICAL_WARNING
import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_INFORMATION
import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED
@@ -28,10 +29,13 @@ import android.safetycenter.SafetySourceIssue.Action
import android.safetycenter.SafetySourceIssue.ISSUE_CATEGORY_ACCOUNT
import android.safetycenter.SafetySourceIssue.ISSUE_CATEGORY_DEVICE
import android.safetycenter.SafetySourceIssue.ISSUE_CATEGORY_GENERAL
+import android.safetycenter.SafetySourceIssue.Notification
import android.safetycenter.cts.testing.Generic
+import androidx.annotation.RequiresApi
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.truth.os.ParcelableSubject.assertThat
+import androidx.test.filters.SdkSuppress
import com.android.permission.testing.EqualsHashCodeToStringTester
import com.google.common.truth.Truth.assertThat
import kotlin.test.assertFailsWith
@@ -180,6 +184,190 @@ class SafetySourceIssueTest {
}
@Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_getTitle_returnsTitle() {
+ val notification = Notification.Builder("Notification title", "Notification text").build()
+
+ assertThat(notification.title).isEqualTo("Notification title")
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_getText_returnsText() {
+ val notification = Notification.Builder("Notification title", "Notification text").build()
+
+ assertThat(notification.text).isEqualTo("Notification text")
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_getActions_withDefaultBuilder_returnsEmptyList() {
+ val notification = Notification.Builder("", "").build()
+
+ assertThat(notification.actions).isEmpty()
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_getActions_returnsActions() {
+ val notification =
+ Notification.Builder("", "").addAction(action1).addAction(action2).build()
+
+ assertThat(notification.actions).containsExactly(action1, action2).inOrder()
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_getActions_mutationsAreNotAllowed() {
+ val notification =
+ Notification.Builder("", "").addAction(action1).addAction(action2).build()
+
+ assertFailsWith(UnsupportedOperationException::class) { notification.actions.add(action3) }
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_describeContents_returns0() {
+ val notification =
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action1)
+ .addAction(action2)
+ .build()
+
+ assertThat(notification.describeContents()).isEqualTo(0)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_parcelRoundTrip_recreatesEqual() {
+ val notification =
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action1)
+ .addAction(action2)
+ .build()
+
+ assertThat(notification).recreatesEqual(Notification.CREATOR)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_withNullTitle_throwsNullPointerException() {
+ assertFailsWith(NullPointerException::class) {
+ Notification.Builder(Generic.asNull(), "Notification text")
+ }
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_withNullText_throwsNullPointerException() {
+ assertFailsWith(NullPointerException::class) {
+ Notification.Builder("Notification title", Generic.asNull())
+ }
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_addAction_doesNotMutatePreviouslyBuiltInstance() {
+ val notificationBuilder = Notification.Builder("", "").addAction(action1)
+ val actions = notificationBuilder.build().actions
+
+ notificationBuilder.addAction(action2)
+
+ assertThat(actions).containsExactly(action1)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_addAction_withNull_throwsIllegalArgumentException() {
+ assertFailsWith(NullPointerException::class) {
+ Notification.Builder("", "").addAction(Generic.asNull())
+ }
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_setActions_withNull_throwsIllegalArgumentException() {
+ assertFailsWith(NullPointerException::class) {
+ Notification.Builder("", "").setActions(Generic.asNull())
+ }
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_setActions_removesAllPreviouslyAddedActions() {
+ val notification =
+ Notification.Builder("", "")
+ .addAction(action1)
+ .addAction(action2)
+ .setActions(listOf(action3))
+ .build()
+
+ assertThat(notification.actions).containsExactly(action3)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_builder_clearActions_removesAllActions() {
+ val notification =
+ Notification.Builder("", "")
+ .addAction(action1)
+ .addAction(action2)
+ .clearActions()
+ .addAction(action3)
+ .build()
+
+ assertThat(notification.actions).containsExactly(action3)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_build_withDuplicateActionIds_throwsIllegalArgumentException() {
+ val notificationBuilder =
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action1)
+ .addAction(action1)
+
+ val exception =
+ assertFailsWith(IllegalArgumentException::class) { notificationBuilder.build() }
+ assertThat(exception)
+ .hasMessageThat()
+ .isEqualTo("Custom notification cannot have duplicate action ids")
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_build_withMoreThanTwoActions_throwsIllegalArgumentException() {
+ val notificationBuilder =
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action1)
+ .addAction(action2)
+ .addAction(action3)
+
+ val exception =
+ assertFailsWith(IllegalArgumentException::class) { notificationBuilder.build() }
+ assertThat(exception)
+ .hasMessageThat()
+ .isEqualTo("Custom notification must not contain more than 2 actions")
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun notification_equalsHashCodeToString_usingEqualsHashCodeToStringTester() {
+ EqualsHashCodeToStringTester()
+ .addEqualityGroup(
+ Notification.Builder("Title", "Text").build(),
+ Notification.Builder("Title", "Text").build(),
+ )
+ .addEqualityGroup(Notification.Builder("Other title", "Text").build())
+ .addEqualityGroup(Notification.Builder("Title", "Other text").build())
+ .addEqualityGroup(Notification.Builder("Title", "Text").addAction(action1).build())
+ .addEqualityGroup(Notification.Builder("Title", "Text").addAction(action2).build())
+ .addEqualityGroup(
+ Notification.Builder("Title", "Text").addAction(action1).addAction(action2).build())
+ .test()
+ }
+
+ @Test
fun getId_returnsId() {
val safetySourceIssue =
SafetySourceIssue.Builder(
@@ -416,6 +604,98 @@ class SafetySourceIssueTest {
}
@Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun getCustomNotification_withDefaultBuilder_returnsNull() {
+ val safetySourceIssue =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .addAction(action1)
+ .build()
+
+ assertThat(safetySourceIssue.customNotification).isNull()
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun getCustomNotification_whenSetExplicitly_returnsCustomNotification() {
+ val safetySourceIssue =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .addAction(action1)
+ .setCustomNotification(
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action2)
+ .build())
+ .build()
+
+ assertThat(safetySourceIssue.customNotification)
+ .isEqualTo(
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action2)
+ .build())
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun getNotificationBehavior_withDefaultBuilder_returnsUnspecified() {
+ val safetySourceIssue =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .addAction(action1)
+ .build()
+
+ assertThat(safetySourceIssue.notificationBehavior)
+ .isEqualTo(SafetySourceIssue.NOTIFICATION_BEHAVIOR_UNSPECIFIED)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun getNotificationBehavior_whenSetExplicitly_returnsSpecifiedBehavior() {
+ val safetySourceIssue =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .addAction(action1)
+ .setNotificationBehavior(SafetySourceIssue.NOTIFICATION_BEHAVIOR_NEVER)
+ .build()
+
+ assertThat(safetySourceIssue.notificationBehavior)
+ .isEqualTo(SafetySourceIssue.NOTIFICATION_BEHAVIOR_NEVER)
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun setNotificationBehavior_withInvalidNotificationBehavior_throwsIllegalArgumentException() {
+ val builder =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ val exception =
+ assertFailsWith(IllegalArgumentException::class) { builder.setNotificationBehavior(-1) }
+ assertThat(exception)
+ .hasMessageThat()
+ .isEqualTo("Unexpected NotificationBehavior for SafetySourceIssue: -1")
+ }
+
+ @Test
fun build_withNullId_throwsNullPointerException() {
assertFailsWith(NullPointerException::class) {
SafetySourceIssue.Builder(
@@ -625,7 +905,90 @@ class SafetySourceIssueTest {
}
@Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun parcelRoundTrip_recreatesEqual_atLeastUpsideDownCake() {
+ val safetySourceIssue =
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .setSubtitle("Issue subtitle")
+ .setIssueCategory(ISSUE_CATEGORY_ACCOUNT)
+ .addAction(action1)
+ .addAction(action2)
+ .setOnDismissPendingIntent(pendingIntentService)
+ .setCustomNotification(
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action2)
+ .build())
+ .setNotificationBehavior(SafetySourceIssue.NOTIFICATION_BEHAVIOR_DELAYED)
+ .build()
+
+ assertThat(safetySourceIssue).recreatesEqual(SafetySourceIssue.CREATOR)
+ }
+
+ @Test
fun equalsHashCodeToString_usingEqualsHashCodeToStringTester() {
+ newTiramisuEqualsTester().test()
+ }
+
+ @Test
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+ fun equalsHashCodeToString_usingEqualsHashCodeToStringTester_atLeastUpsideDownCake() {
+ newUpsideDownCakeEqualsTester().test()
+ }
+
+ /**
+ * Creates a new [EqualsHashCodeToStringTester] instance with all the equality groups in the
+ * [newTiramisuEqualsTester] plus new equality groups covering all of the new fields added in U.
+ */
+ @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ private fun newUpsideDownCakeEqualsTester() =
+ newTiramisuEqualsTester()
+ .addEqualityGroup(
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .setSubtitle("Issue subtitle")
+ .setIssueCategory(ISSUE_CATEGORY_ACCOUNT)
+ .addAction(action1)
+ .addAction(action2)
+ .setOnDismissPendingIntent(pendingIntentService)
+ .setNotificationBehavior(SafetySourceIssue.NOTIFICATION_BEHAVIOR_DELAYED)
+ .setCustomNotification(
+ Notification.Builder("Notification title", "Notification text")
+ .addAction(action2)
+ .build())
+ .build())
+ .addEqualityGroup(
+ SafetySourceIssue.Builder(
+ "Issue id",
+ "Issue title",
+ "Issue summary",
+ SEVERITY_LEVEL_INFORMATION,
+ "issue_type_id")
+ .setSubtitle("Issue subtitle")
+ .setIssueCategory(ISSUE_CATEGORY_ACCOUNT)
+ .addAction(action1)
+ .addAction(action2)
+ .setOnDismissPendingIntent(pendingIntentService)
+ .setNotificationBehavior(SafetySourceIssue.NOTIFICATION_BEHAVIOR_IMMEDIATELY)
+ .setCustomNotification(
+ Notification.Builder("Other title", "Other text")
+ .addAction(action2)
+ .build())
+ .build())
+
+ /**
+ * Creates a new [EqualsHashCodeToStringTester] instance which covers all the fields in the T
+ * API and is safe to use on any T+ API level.
+ */
+ private fun newTiramisuEqualsTester() =
EqualsHashCodeToStringTester()
.addEqualityGroup(
SafetySourceIssue.Builder(
@@ -769,6 +1132,4 @@ class SafetySourceIssueTest {
PendingIntent.getService(
context, 0, Intent("Other PendingIntent service"), FLAG_IMMUTABLE))
.build())
- .test()
- }
}
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterFlags.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterFlags.kt
index f91cd3312..b7980a8ea 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterFlags.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterFlags.kt
@@ -161,6 +161,13 @@ object SafetyCenterFlags {
defaultValue = PackageManager.DONT_KILL_APP,
IntParser())
+ /**
+ * Flag that determines whether to show subpages in the Safety Center UI instead of the
+ * expand-and-collapse list.
+ */
+ private val showSubpagesFlag =
+ Flag("safety_center_show_subpages", defaultValue = false, BooleanParser())
+
/** Every Safety Center flag. */
private val FLAGS: List<Flag<*>> =
listOf(
@@ -176,7 +183,8 @@ object SafetyCenterFlags {
issueCategoryAllowlistsFlag,
backgroundRefreshDeniedSourcesFlag,
allowStatsdLoggingInTestsFlag,
- qsTileComponentSettingFlag)
+ qsTileComponentSettingFlag,
+ showSubpagesFlag)
/** Returns whether the device supports Safety Center. */
fun Context.deviceSupportsSafetyCenter() =
@@ -219,6 +227,9 @@ object SafetyCenterFlags {
/** A property that allows getting and setting the [allowStatsdLoggingInTestsFlag]. */
var allowStatsdLoggingInTests: Boolean by allowStatsdLoggingInTestsFlag
+ /** A property that allows getting and setting the [showSubpagesFlag]. */
+ var showSubpages: Boolean by showSubpagesFlag
+
/**
* Returns a snapshot of all the Safety Center flags.
*
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/ui/SafetyCenterSubpagesTest.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/ui/SafetyCenterSubpagesTest.kt
new file mode 100644
index 000000000..d1533b52b
--- /dev/null
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/ui/SafetyCenterSubpagesTest.kt
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.safetycenter.cts.ui
+
+import android.content.Context
+import android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE
+import android.os.Bundle
+import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID
+import android.safetycenter.cts.testing.SafetyCenterActivityLauncher.launchSafetyCenterActivity
+import android.safetycenter.cts.testing.SafetyCenterCtsConfigs.MULTIPLE_SOURCES_GROUP_ID_1
+import android.safetycenter.cts.testing.SafetyCenterCtsConfigs.MULTIPLE_SOURCE_GROUPS_CONFIG
+import android.safetycenter.cts.testing.SafetyCenterCtsHelper
+import android.safetycenter.cts.testing.SafetyCenterFlags
+import android.safetycenter.cts.testing.SafetyCenterFlags.deviceSupportsSafetyCenter
+import android.safetycenter.cts.testing.UiTestHelper.waitDisplayed
+import android.safetycenter.cts.testing.UiTestHelper.waitNotDisplayed
+import android.support.test.uiautomator.By
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
+import org.junit.After
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** CTS tests for generic subpages in Safety Center. */
+@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
+class SafetyCenterSubpagesTest {
+ private val context: Context = getApplicationContext()
+ private val safetyCenterCtsHelper = SafetyCenterCtsHelper(context)
+
+ // JUnit's Assume is not supported in @BeforeClass by the CTS tests runner, so this is used to
+ // manually skip the setup and teardown methods.
+ private val shouldRunTests = context.deviceSupportsSafetyCenter()
+
+ @Before
+ fun assumeDeviceSupportsSafetyCenterToRunTests() {
+ assumeTrue(shouldRunTests)
+ }
+
+ @Before
+ fun enableSafetyCenterBeforeTest() {
+ if (!shouldRunTests) {
+ return
+ }
+ safetyCenterCtsHelper.setup()
+ SafetyCenterFlags.showSubpages = true
+ }
+
+ @After
+ fun clearDataAfterTest() {
+ if (!shouldRunTests) {
+ return
+ }
+ safetyCenterCtsHelper.reset()
+ }
+
+ @Test
+ fun launchSafetyCenter_withSubpagesIntentExtra_showsSubpageTitle() {
+ safetyCenterCtsHelper.setConfig(MULTIPLE_SOURCE_GROUPS_CONFIG)
+ val extras = Bundle()
+ extras.putString(EXTRA_SAFETY_SOURCES_GROUP_ID, MULTIPLE_SOURCES_GROUP_ID_1)
+
+ context.launchSafetyCenterActivity(extras) {
+ // CollapsingToolbar title can't be found by text, so using description instead.
+ waitDisplayed(
+ By.desc(
+ context.getString(
+ MULTIPLE_SOURCE_GROUPS_CONFIG.safetySourcesGroups.first()!!.titleResId)))
+ }
+ }
+
+ @Test
+ fun launchSafetyCenter_withSubpagesFlagDisabled_showsHomepageTitle() {
+ SafetyCenterFlags.showSubpages = false
+ safetyCenterCtsHelper.setConfig(MULTIPLE_SOURCE_GROUPS_CONFIG)
+ val extras = Bundle()
+ extras.putString(EXTRA_SAFETY_SOURCES_GROUP_ID, MULTIPLE_SOURCES_GROUP_ID_1)
+
+ context.launchSafetyCenterActivity(extras) {
+ // CollapsingToolbar title can't be found by text, so using description instead.
+ waitDisplayed(By.desc("Security & privacy"))
+ }
+ }
+
+ @Test
+ fun launchSafetyCenter_withNonExistingGroupID_displaysNothing() {
+ safetyCenterCtsHelper.setConfig(MULTIPLE_SOURCE_GROUPS_CONFIG)
+ val extras = Bundle()
+ extras.putString(EXTRA_SAFETY_SOURCES_GROUP_ID, "non_existing_group_id")
+
+ context.launchSafetyCenterActivity(extras) {
+ waitNotDisplayed(
+ By.desc(
+ context.getString(
+ MULTIPLE_SOURCE_GROUPS_CONFIG.safetySourcesGroups.first()!!.titleResId)))
+ }
+ }
+}