feat(monthly-recap): Monthly Recap module — metrics engine, personalization, playback and dashboard card - #574
Conversation
…efer a11y announcement
…lity status (Phase 6 foundation)
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughAdded an offline Monthly Recap feature. It stores monthly snapshots, calculates activity metrics, validates localized content, composes deterministic scenes, and provides a dashboard strip with animated playback, controls, accessibility support, and persistence. ChangesMonthly Recap
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant HomeIconsFragment
participant MonthlyRecapStripViewModel
participant MonthlyRecapRepo
participant RecapStoryGate
participant MonthlyRecapPlaybackFragment
HomeIconsFragment->>MonthlyRecapStripViewModel: refresh()
MonthlyRecapStripViewModel->>MonthlyRecapRepo: observe recap snapshot
MonthlyRecapStripViewModel->>RecapStoryGate: hasStory()
RecapStoryGate->>MonthlyRecapRepo: composeStory()
MonthlyRecapStripViewModel-->>HomeIconsFragment: ready, resume, or replay state
HomeIconsFragment->>MonthlyRecapPlaybackFragment: navigate to playback
MonthlyRecapPlaybackFragment->>MonthlyRecapRepo: persist scene progress
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (9)
app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt (1)
104-112: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low valueExtra band ids in a category are accepted.
missingBandsonly checks that every declared band exists in the category. A category that also declares an unknown band id passes validation. The composer then never selects that band, so the content push is silently partly dead. Reject unknown band ids for symmetry with the language and category checks.♻️ Proposed refactor
val missingBands = bandIds.toSet() - categoryBandIds.toSet() if (missingBands.isNotEmpty()) { return "${language.id}/${category.id}: missing bands $missingBands" } + val unknownBands = categoryBandIds.toSet() - bandIds.toSet() + if (unknownBands.isNotEmpty()) { + return "${language.id}/${category.id}: unknown bands $unknownBands" + }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt` around lines 104 - 112, Update the category validation in RecapContentCodec so it rejects band IDs that are not declared in the language-level bandIds collection, in addition to detecting duplicates and missing bands. Add an extra-band check alongside missingBands and return a validation error identifying the language and category when unknown IDs are present.app/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModelTest.kt (1)
103-110: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winReference the saved-state key from production code instead of repeating the literal.
The literal
"recap_playback_scene_index"appears three times in this test. IfMonthlyRecapPlaybackViewModelrenames the key, these tests still pass for the wrong reason or fail without a clear cause. Expose the key as an internal constant in the ViewModel and use it here.Also applies to: 177-198
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModelTest.kt` around lines 103 - 110, Expose the saved-state key used by MonthlyRecapPlaybackViewModel as an internal constant, then replace all three occurrences of the literal "recap_playback_scene_index" in MonthlyRecapPlaybackViewModelTest, including the additional references around the later test block, with that production constant.app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapClockTest.kt (1)
18-51: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPin the time zone so the calendar assertions stay deterministic.
cal()usesCalendar.getInstance(), which uses the JVM default time zone. The CI machine may use a zone with a DST transition. The day count inleap-year february window spans 29 daysuses integer division by a fixed 24-hour value, so a DST shift changes the result. Set a fixed time zone for the test class.♻️ Proposed test fix
+import java.util.TimeZone + class RecapClockTest { + private val zone: TimeZone = TimeZone.getTimeZone("Asia/Kolkata") + private fun cal(year: Int, month0: Int, day: Int, hour: Int = 0, minute: Int = 0): Calendar = - Calendar.getInstance().apply { + Calendar.getInstance(zone).apply { clear() set(year, month0, day, hour, minute, 0) set(Calendar.MILLISECOND, 0) }If
previousMonthWindowusesCalendar.getInstance()internally, also set the default zone in a@Beforemethod and restore it in@After.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapClockTest.kt` around lines 18 - 51, Make RecapClockTest use a fixed, non-DST time zone for all Calendar assertions by configuring cal() with that zone instead of the JVM default. If previousMonthWindow relies on Calendar.getInstance(), also set the default time zone in test setup and restore the original zone in teardown.app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.kt (1)
238-260: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAlign the KDoc with the actual clamp values.
The comment states "~8s for a short welcome", but
MIN_SCENE_MSis 7000. A short welcome line therefore lasts 7s, not ~8s. The class KDoc at Line 38 also states "welcome 3.5s, category scenes 6s", which no longer matchesBASE_READ_MS,PER_WORD_MS,MIN_SCENE_MS, andMAX_SCENE_MS. Update both comments so the documented timings match the constants.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.kt` around lines 238 - 260, Update the KDoc above readingDurationMs and the class KDoc near the fragment declaration to accurately describe the durations produced by BASE_READ_MS, PER_WORD_MS, MIN_SCENE_MS, and MAX_SCENE_MS, including the 7000 ms minimum instead of ~8 seconds. Keep the implementation unchanged and ensure the welcome/category timing claims reflect the current adaptive calculation and clamp values.app/src/main/res/values-as/strings.xml (1)
1463-1463: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove the unused Monthly Recap screen description strings.
monthly_recap_lang_screen_cdonly appears inapp/src/main/res/values/strings.xml,values-hi/strings.xml, andvalues-as/strings.xml. The code comments indicate the recap language screen is gone, so remove this resource from all three string files.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/main/res/values-as/strings.xml` at line 1463, Remove the unused monthly_recap_lang_screen_cd string resource from the base, Hindi, and Assamese strings files, leaving all other resources unchanged.app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.kt (1)
295-303: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low valueReuse a single
RecapSceneComposerand avoid the second snapshot read.
buildPersonalizedScenesbuilds a new composer on every call and reads the snapshot again throughgetOrCreateCurrentRecap().ensureCurrentRecapMetrics()has already loaded that row. You can return the seed from the metrics path or read the row once and pass it down.This is a minor cleanup and does not change behavior.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.kt` around lines 295 - 303, Update buildPersonalizedScenes and the related ensureCurrentRecapMetrics flow to reuse one RecapSceneComposer and avoid calling getOrCreateCurrentRecap() for a second snapshot read. Propagate the already-loaded recap row or its variantSeed from ensureCurrentRecapMetrics, while preserving the existing null handling and composition behavior.app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt (1)
199-207: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueThis test does not exercise a race.
The two
getOrCreateCurrentRecap()calls run sequentially, so the second call returns early on the read at line 73 and never reaches the insert. The lost-insert path is not covered. The concurrency case is covered by the test at lines 410-420.Rename this test to describe repeated sequential calls, or force the insert path by clearing the read result for the first lookup only.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt` around lines 199 - 207, Rename the test around getOrCreateCurrentRecap to describe repeated sequential calls, since both invocations read the existing row and do not exercise a concurrent insert race. Keep the assertions verifying identical IDs, variantSeed values, and a single DAO row; do not label this test as a winner/loser concurrency scenario.app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapMetricsCalculator.kt (1)
47-156: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider parallelizing the six independent counts and extracting the repeated builder.
The six data source calls are independent reads. They run sequentially, so the freeze path pays six serialized IO round trips. You can wrap them in
coroutineScope { async { ... } }and await them together. The six category blocks also repeat the same shape; a small private helper that takescategoryId,activityId,unit, andcountremoves the repetition.This is a non-blocking suggestion. The current code is correct.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapMetricsCalculator.kt` around lines 47 - 156, In the calculator method containing the six recap data-source calls, parallelize the independent count operations with coroutineScope and async, then await all results before constructing categories. Extract the repeated RecapCategoryMetric/RecapActivityMetric construction into a private helper accepting categoryId, activityId, unit, and count, and use it for all six metrics without changing results.app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt (1)
297-337: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExtract the duplicated
insertMinimalRowanddummyForTypetest helpers.Four instrumented test classes each carry an identical PRAGMA-driven minimal-insert helper and dummy-value mapper. Any schema change or fixture fix must be applied four times. Move both functions into one shared androidTest utility, for example a
RecapDaoTestFixturesfile in the same package, and let each test class call it.
app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt#L297-L337: remove the localinsertMinimalRowanddummyForTypeand call the shared helper withsupport.app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/EligibleCoupleRecapDaoTest.kt#L128-L166: remove the local copies and call the shared helper.app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/MaternalHealthRecapDaoTest.kt#L183-L221: remove the local copies and call the shared helper.app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/RegistrationRecapDaoTest.kt#L178-L216: remove the local copies and call the shared helper.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt` around lines 297 - 337, Extract the duplicated insertMinimalRow and dummyForType helpers into a shared RecapDaoTestFixtures utility in the same package, preserving their PRAGMA-driven insertion behavior and support/database parameter handling. Remove both local helpers and update app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt lines 297-337, EligibleCoupleRecapDaoTest.kt lines 128-166, MaternalHealthRecapDaoTest.kt lines 183-221, and RegistrationRecapDaoTest.kt lines 178-216 to call the shared helper with support.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposer.kt`:
- Around line 14-15: Update the KDoc for RecapSceneComposer’s lottieRawRes
property to match compose(): scenes may provide WELCOME_ANIMATION, a category
girl_1..girl_6 animation, or GOODBYE_ANIMATION, and null should be documented
only as the absence of an animation rather than being tied to WELCOME.
In `@app/src/main/java/org/piramalswasthya/sakhi/model/RecapContent.kt`:
- Around line 64-72: Add default values to the id and text fields in
RecapSentence, and to id/minCount in RecapBandDefinition, RecapLanguageContent,
and RecapCategoryContent so Gson’s no-argument construction produces
validator-safe blanks; in
app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt:39-53,
move validate(library) inside the existing try block so residual failures return
null.
In
`@app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.kt`:
- Around line 137-145: The updateSafeProgress method currently allows
progressScene to equal totalScenes, but progress must represent the last valid
scene shown. Cap the stored safe value at totalScenes - 1 when totalScenes is
positive, while preserving the existing handling for missing or non-positive
totals and the current DAO update flow.
In
`@app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.kt`:
- Around line 81-96: Update fadeTo in RecapMusicController so cancellation is
tracked for each ValueAnimator and onEnd is invoked only when that animator
completes normally, not after Animator.cancel() triggers onAnimationEnd.
Preserve the existing fade behavior and ensure a cancelled fade cannot pause or
otherwise change player state after a newer fade starts.
In `@app/src/main/res/layout/fragment_monthly_recap_playback.xml`:
- Around line 121-127: Move the recapTouchOverlay declaration before
recapReplayButton in the layout so the Replay button is later in child order and
receives taps before the gesture layer. Preserve the overlay’s existing
dimensions, accessibility setting, and gesture behavior.
In `@app/src/main/res/raw/recap_content.json`:
- Around line 40-42: Update the category unit values in recap_content.json to
use only units supported by RecapCountingUnit, replacing UNIQUE_COUPLE and
UNIQUE_MOTHER with the appropriate existing metric units. Keep the category
names and countMeaning text unchanged, and do not expand the model unless those
categories genuinely require new counting semantics.
In `@app/src/main/res/raw/recap_girl_3.json`:
- Line 1: Enable Lottie merge paths before loading the recap_girl_3 animation:
configure the playback view with app:lottie_enableMergePathsForKitKatAndAbove or
call enableMergePathsForKitKatAndAbove(true) on its LottieAnimationView. Apply
this to the view that loads recap_girl_3.json, or remove the ty:"mm" merge-path
operators from the Hand and Eye layers during export.
In `@app/src/main/res/values-as/strings.xml`:
- Line 1469: Update the Assamese translation for monthly_recap_playback_pause_cd
to use a distinct word meaning “hold” or “pause,” while leaving
monthly_recap_playback_close_cd unchanged so TalkBack announces different
actions for Pause and Close.
In `@app/src/main/res/values/monthly_recap_debug.xml`:
- Around line 3-13: Update the documentation comment above
monthly_recap_preview_state to state that this preview resource is read only in
debug builds; release builds obtain the strip state from
MonthlyRecapStripViewModel.stripState. Remove the claim that release builds use
this value or always render the strip hidden, while preserving the valid token
guidance.
In `@app/src/test/java/org/piramalswasthya/sakhi/model/MonthlyRecapCacheTest.kt`:
- Around line 45-52: Update MonthlyRecapCache.safeProgressScene() to clamp
progressScene to totalScenes - 1 when totalScenes is known, preserving the
lower-bound clamp and unknown-total behavior. Adjust the corrupted progress test
to expect 9 for progressScene 99 with totalScenes 10.
In
`@app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt`:
- Around line 36-37: Correct JULY_2026_MILLIS to the UTC epoch value for 1 July
2026, 1_782_864_000_000L, so its name and comment match the test scenario.
Ensure the associated test uses this value to represent installation after the
complete June recap window.
---
Nitpick comments:
In
`@app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt`:
- Around line 297-337: Extract the duplicated insertMinimalRow and dummyForType
helpers into a shared RecapDaoTestFixtures utility in the same package,
preserving their PRAGMA-driven insertion behavior and support/database parameter
handling. Remove both local helpers and update
app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt
lines 297-337, EligibleCoupleRecapDaoTest.kt lines 128-166,
MaternalHealthRecapDaoTest.kt lines 183-221, and RegistrationRecapDaoTest.kt
lines 178-216 to call the shared helper with support.
In `@app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt`:
- Around line 104-112: Update the category validation in RecapContentCodec so it
rejects band IDs that are not declared in the language-level bandIds collection,
in addition to detecting duplicates and missing bands. Add an extra-band check
alongside missingBands and return a validation error identifying the language
and category when unknown IDs are present.
In
`@app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapMetricsCalculator.kt`:
- Around line 47-156: In the calculator method containing the six recap
data-source calls, parallelize the independent count operations with
coroutineScope and async, then await all results before constructing categories.
Extract the repeated RecapCategoryMetric/RecapActivityMetric construction into a
private helper accepting categoryId, activityId, unit, and count, and use it for
all six metrics without changing results.
In
`@app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.kt`:
- Around line 295-303: Update buildPersonalizedScenes and the related
ensureCurrentRecapMetrics flow to reuse one RecapSceneComposer and avoid calling
getOrCreateCurrentRecap() for a second snapshot read. Propagate the
already-loaded recap row or its variantSeed from ensureCurrentRecapMetrics,
while preserving the existing null handling and composition behavior.
In
`@app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.kt`:
- Around line 238-260: Update the KDoc above readingDurationMs and the class
KDoc near the fragment declaration to accurately describe the durations produced
by BASE_READ_MS, PER_WORD_MS, MIN_SCENE_MS, and MAX_SCENE_MS, including the 7000
ms minimum instead of ~8 seconds. Keep the implementation unchanged and ensure
the welcome/category timing claims reflect the current adaptive calculation and
clamp values.
In `@app/src/main/res/values-as/strings.xml`:
- Line 1463: Remove the unused monthly_recap_lang_screen_cd string resource from
the base, Hindi, and Assamese strings files, leaving all other resources
unchanged.
In `@app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapClockTest.kt`:
- Around line 18-51: Make RecapClockTest use a fixed, non-DST time zone for all
Calendar assertions by configuring cal() with that zone instead of the JVM
default. If previousMonthWindow relies on Calendar.getInstance(), also set the
default time zone in test setup and restore the original zone in teardown.
In
`@app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt`:
- Around line 199-207: Rename the test around getOrCreateCurrentRecap to
describe repeated sequential calls, since both invocations read the existing row
and do not exercise a concurrent insert race. Keep the assertions verifying
identical IDs, variantSeed values, and a single DAO row; do not label this test
as a winner/loser concurrency scenario.
In
`@app/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModelTest.kt`:
- Around line 103-110: Expose the saved-state key used by
MonthlyRecapPlaybackViewModel as an internal constant, then replace all three
occurrences of the literal "recap_playback_scene_index" in
MonthlyRecapPlaybackViewModelTest, including the additional references around
the later test block, with that production constant.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 9cb14f3c-e9c8-4bc5-a506-d3261f6f57cd
⛔ Files ignored due to path filters (2)
app/src/main/res/drawable-nodpi/img_recap_character.pngis excluded by!**/*.pngapp/src/main/res/raw/recap_bg_music.mp3is excluded by!**/*.mp3
📒 Files selected for processing (89)
app/build.gradleapp/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.ktapp/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/EligibleCoupleRecapDaoTest.ktapp/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/ImmunizationRecapDaoTest.ktapp/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/MaternalHealthRecapDaoTest.ktapp/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/RegistrationRecapDaoTest.ktapp/src/debug/res/values/monthly_recap_debug.xmlapp/src/main/java/org/piramalswasthya/sakhi/database/room/InAppDb.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/CbacDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/EcrDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/HouseholdDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/ImmunizationDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/MaternalHealthDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/room/dao/MonthlyRecapDao.ktapp/src/main/java/org/piramalswasthya/sakhi/database/shared_preferences/PreferenceDao.ktapp/src/main/java/org/piramalswasthya/sakhi/di/AppModule.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapAvailability.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapDataReadiness.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapMetricsCodec.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/RecapClock.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposer.ktapp/src/main/java/org/piramalswasthya/sakhi/helpers/RecapStoryGate.ktapp/src/main/java/org/piramalswasthya/sakhi/model/MonthlyRecapCache.ktapp/src/main/java/org/piramalswasthya/sakhi/model/MonthlyRecapMetrics.ktapp/src/main/java/org/piramalswasthya/sakhi/model/RecapContent.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/BeneficiaryRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/CbacRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/EligibleCoupleRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/HouseholdRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/ImmunizationRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRecapDataSource.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapMetricsCalculator.ktapp/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeIconsFragment.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStrip.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStripViewModel.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModel.ktapp/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.ktapp/src/main/res/drawable/bg_monthly_recap_strip.xmlapp/src/main/res/drawable/bg_recap_badge.xmlapp/src/main/res/drawable/bg_recap_badge_new.xmlapp/src/main/res/drawable/bg_recap_playback.xmlapp/src/main/res/drawable/ic_recap_close.xmlapp/src/main/res/drawable/ic_recap_music_off.xmlapp/src/main/res/drawable/ic_recap_music_on.xmlapp/src/main/res/drawable/ic_recap_next.xmlapp/src/main/res/drawable/ic_recap_pause.xmlapp/src/main/res/drawable/ic_recap_play.xmlapp/src/main/res/drawable/ic_recap_prev.xmlapp/src/main/res/drawable/recap_bubble_tail.xmlapp/src/main/res/layout/fragment_monthly_recap_playback.xmlapp/src/main/res/layout/monthly_recap_strip.xmlapp/src/main/res/layout/rv_icon_grid.xmlapp/src/main/res/navigation/nav_home.xmlapp/src/main/res/raw/recap_content.jsonapp/src/main/res/raw/recap_didi_dashboard.jsonapp/src/main/res/raw/recap_didi_welcome.jsonapp/src/main/res/raw/recap_girl_1.jsonapp/src/main/res/raw/recap_girl_2.jsonapp/src/main/res/raw/recap_girl_3.jsonapp/src/main/res/raw/recap_girl_4.jsonapp/src/main/res/raw/recap_girl_5.jsonapp/src/main/res/raw/recap_girl_6.jsonapp/src/main/res/raw/recap_girl_7.jsonapp/src/main/res/raw/recap_girl_8.jsonapp/src/main/res/values-as/strings.xmlapp/src/main/res/values-hi/strings.xmlapp/src/main/res/values/colors.xmlapp/src/main/res/values/monthly_recap_debug.xmlapp/src/main/res/values/strings.xmlapp/src/test/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapDataReadinessTest.ktapp/src/test/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapMetricsCodecTest.ktapp/src/test/java/org/piramalswasthya/sakhi/helpers/RecapClockTest.ktapp/src/test/java/org/piramalswasthya/sakhi/helpers/RecapContentCodecTest.ktapp/src/test/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposerTest.ktapp/src/test/java/org/piramalswasthya/sakhi/model/MonthlyRecapCacheTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/AshaProfileRepoTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/BeneficiaryRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/CbacRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/EligibleCoupleRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/HouseholdRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/ImmunizationRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRecapDataSourceTest.ktapp/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.ktapp/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStripTest.ktapp/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModelTest.kt
| private fun fadeTo(target: Float, onEnd: (() -> Unit)? = null) { | ||
| val p = player ?: return | ||
| cancelFade() | ||
| fade = ValueAnimator.ofFloat(currentVolume, target).apply { | ||
| duration = FADE_MS | ||
| addUpdateListener { anim -> | ||
| val v = anim.animatedValue as Float | ||
| currentVolume = v | ||
| runCatching { p.setVolume(v, v) } | ||
| } | ||
| addListener(object : AnimatorListenerAdapter() { | ||
| override fun onAnimationEnd(animation: Animator) { | ||
| onEnd?.invoke() | ||
| } | ||
| }) | ||
| start() |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🌐 Web query:
Does Android Animator.cancel() invoke AnimatorListener.onAnimationEnd() after onAnimationCancel()?
💡 Result:
Yes, calling Animator.cancel on an Android animation invokes both AnimatorListener.onAnimationCancel and AnimatorListener.onAnimationEnd [1][2]. When cancel is called, the animation stops, and the system sends an onAnimationCancel(Animator) message to its listeners, which is immediately followed by an onAnimationEnd(Animator) message [1][2]. Consequently, any code within your onAnimationEnd listener will be executed regardless of whether the animation finished naturally or was canceled [3].
Citations:
- 1: https://developer.android.com/reference/android/animation/Animator
- 2: https://developer.android.com/reference/androidx/core/animation/Animator
- 3: https://developer.android.com/develop/ui/views/animations/prop-animation
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
# Locate and inspect the controller around the reported lines.
file="$(git ls-files | grep -Fx 'app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.kt' || true)"
if [ -z "${file:-}" ]; then
echo "Could not find RecapMusicController.kt"
exit 0
fi
echo "FILE=$file"
wc -l "$file"
sed -n '1,140p' "$file" | nl -ba
echo
echo "Usages of fadeTo/onEnd related symbols:"
rg -n "fadeTo\(|onEnd|cancelFade|maxVolume|minVolume|muted|unmute|mute|player" "$file" || trueRepository: PSMRI/FLW-Mobile-App
Length of output: 406
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
file="app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.kt"
wc -l "$file"
awk '{printf "%5d\t%s\n", NR, $0}' "$file" | sed -n '1,140p'
echo
echo "Usages of fadeTo/onEnd related symbols:"
rg -n "fadeTo\(|onEnd|cancelFade|maxVolume|minVolume|muted|unmute|mute|player" "$file" || trueRepository: PSMRI/FLW-Mobile-App
Length of output: 5714
Ignore cancelled fade end callbacks.
Animator.cancel() calls onAnimationEnd() after onAnimationCancel(), so setAudible(false) followed by setAudible(true) can pause the player even though a new fade-in starts. Track cancellation so onEnd runs only after normal animation completion.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.kt`
around lines 81 - 96, Update fadeTo in RecapMusicController so cancellation is
tracked for each ValueAnimator and onEnd is invoked only when that animator
completes normally, not after Animator.cancel() triggers onAnimationEnd.
Preserve the existing fade behavior and ensure a cancelled fade cannot pause or
otherwise change player state after a newer fade starts.
| <!-- Full-screen gesture layer (hold to pause, tap left/right). Hidden from | ||
| accessibility: the visible controls below are the accessible path. --> | ||
| <View | ||
| android:id="@+id/recapTouchOverlay" | ||
| android:layout_width="match_parent" | ||
| android:layout_height="match_parent" | ||
| android:importantForAccessibility="no" /> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
The gesture overlay blocks taps on the Replay button.
recapTouchOverlay is declared after recapReplayButton. ConstraintLayout dispatches touch events in reverse child order, so the overlay receives ACTION_DOWN first. setUpGestures() in MonthlyRecapPlaybackFragment.kt returns true for ACTION_DOWN once scenes are loaded, so the overlay consumes the whole gesture and recapReplayButton never receives a click. The Replay button is the only forward action on the goodbye scene, so the story ends in a dead end for touch users.
The comment at Line 12 already documents the intended z-order for the progress row, close button and controls row. Add the Replay button to that group by declaring the overlay before it.
🐛 Proposed fix: declare the overlay before the Replay button
</com.google.android.material.card.MaterialCardView>
+ <!-- Full-screen gesture layer (hold to pause, tap left/right). Hidden from
+ accessibility: the visible controls below are the accessible path. It is
+ declared before the Replay button and the controls so it never steals
+ their clicks. -->
+ <View
+ android:id="@+id/recapTouchOverlay"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:importantForAccessibility="no" />
+
<com.google.android.material.button.MaterialButton
android:id="@+id/recapReplayButton"- <!-- Full-screen gesture layer (hold to pause, tap left/right). Hidden from
- accessibility: the visible controls below are the accessible path. -->
- <View
- android:id="@+id/recapTouchOverlay"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:importantForAccessibility="no" />
-
<!-- Segmented story progress (segments added in code, one per scene). -->🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/src/main/res/layout/fragment_monthly_recap_playback.xml` around lines 121
- 127, Move the recapTouchOverlay declaration before recapReplayButton in the
layout so the Replay button is later in child order and receives taps before the
gesture layer. Preserve the overlay’s existing dimensions, accessibility
setting, and gesture behavior.
| @@ -0,0 +1 @@ | |||
| {"v":"5.7.4","fr":30,"ip":0,"op":90,"w":1080,"h":1080,"nm":"happy01GirlA","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Glitter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[547.648,529.673,0],"ix":2,"l":2},"a":{"a":0,"k":[489.282,370.25,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],[-6.682,7.636],[0,0],[8.386,9.584],[0,0],[6.682,-7.636],[0,0],[-8.386,-9.584]],"o":[[0,0],[8.386,-9.584],[0,0],[-6.682,-7.636],[0,0],[-8.386,9.584],[0,0],[6.682,7.636]],"v":[[0,49.636],[11.454,13.364],[40.091,0],[11.454,-13.364],[0,-49.636],[-11.455,-13.364],[-40.091,0],[-11.455,13.364]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.758294737573,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.223,690.614],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":19,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":30,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":50,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":70,"s":[50,50]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":75,"s":[0,0]},{"t":90,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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,0],[-5.186,5.925],[0,0],[6.508,7.439],[0,0],[5.186,-5.926],[0,0],[-6.508,-7.439]],"o":[[0,0],[6.508,-7.439],[0,0],[-5.186,-5.926],[0,0],[-6.508,7.439],[0,0],[5.186,5.925]],"v":[[0,38.523],[8.89,10.372],[31.114,0.001],[8.89,-10.371],[0,-38.522],[-8.89,-10.371],[-31.114,0.001],[-8.89,10.372]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.758294737573,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.364,638.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":29,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":40,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":50,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":70,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":75,"s":[50,50]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":80,"s":[0,0]},{"t":90,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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],[6.682,7.636],[0,0],[-8.387,9.584],[0,0],[-6.682,-7.636],[0,0],[8.387,-9.585]],"o":[[0,0],[-8.387,-9.585],[0,0],[6.682,-7.636],[0,0],[8.387,9.584],[0,0],[-6.682,7.636]],"v":[[0,49.636],[-11.454,13.364],[-40.091,0],[-11.454,-13.364],[0,-49.636],[11.454,-13.364],[40.091,0],[11.454,13.364]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.758294737573,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[833.242,132.614],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":19,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":30,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":50,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":70,"s":[50,50]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":75,"s":[0,0]},{"t":90,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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],[5.187,5.926],[0,0],[-6.507,7.438],[0,0],[-5.186,-5.927],[0,0],[6.507,-7.438]],"o":[[0,0],[-6.507,-7.438],[0,0],[5.187,-5.927],[0,0],[6.507,7.438],[0,0],[-5.186,5.926]],"v":[[0,38.522],[-8.891,10.372],[-31.114,0],[-8.891,-10.371],[0,-38.522],[8.89,-10.371],[31.114,0],[8.89,10.372]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.758294737573,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[860.102,38.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":29,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":40,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":50,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":70,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":75,"s":[50,50]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":80,"s":[0,0]},{"t":90,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","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],[8.689,9.931],[0,0],[-10.906,12.464],[0,0],[-8.69,-9.931],[0,0],[10.906,-12.464]],"o":[[0,0],[-10.906,-12.464],[0,0],[8.689,-9.931],[0,0],[10.906,12.464],[0,0],[-8.69,9.931]],"v":[[0.001,64.549],[-14.896,17.379],[-52.136,0.001],[-14.896,-17.378],[0.001,-64.549],[14.897,-17.378],[52.136,0.001],[14.897,17.379]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.758294737573,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[926.177,101.567],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":39,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":50,"s":[50,50]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[100,100]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":70,"s":[50,50]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":75,"s":[0,0]},{"t":90,"s":[0,0]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[541.909,862.844,0],"ix":2,"l":2},"a":{"a":0,"k":[150.711,108.384,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":[[7.945,0],[7.036,5.471],[0.263,0.283],[-0.14,1.426],[-1.162,0.838],[-6.107,13.741],[-1.541,0.347],[-1.202,-1.028],[-3.692,-3.097],[-14.116,-13.853],[1.934,-1.971],[1.97,1.936],[11.859,9.95],[1.936,1.635],[8.977,-6.887],[-27.34,-21.263],[-9.791,7.898],[11.76,24.474],[-2.489,1.197],[-1.198,-2.489],[12.586,-10.154]],"o":[[-8.051,0],[-35.902,-27.926],[-0.975,-1.051],[0.143,-1.425],[9.711,-7.018],[0.641,-1.443],[1.537,-0.346],[3.318,2.844],[12,10.067],[1.97,1.934],[-1.934,1.972],[-13.838,-13.58],[-2.043,-1.714],[-9.224,14.055],[8.487,8.691],[10.398,8.09],[9.743,-7.859],[-1.195,-2.491],[2.492,-1.19],[14.289,29.746],[-6.623,5.342]],"v":[[21.314,58.688],[-1.911,50.482],[-64.504,-6.063],[-65.817,-9.956],[-63.768,-13.518],[-21.409,-55.497],[-17.942,-58.342],[-13.586,-57.262],[-3.053,-48.365],[36.662,-13.035],[36.728,-5.964],[29.658,-5.897],[-9.481,-40.704],[-15.452,-45.723],[-53.321,-8.85],[4.23,42.587],[37.464,42.896],[42.652,-7.299],[44.994,-13.973],[51.668,-11.632],[43.744,50.679]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725550034,0.364705882353,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[235.215,146.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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":[[7.115,0],[6.482,6.076],[-11.619,24.18],[-2.492,-1.195],[1.197,-2.49],[-10.469,-9.814],[-12.066,6.783],[-11.639,9.033],[8.543,13.825],[15.842,-12.33],[0,0],[1.695,2.179],[-2.18,1.695],[0,0],[-29.088,17.453],[-1.363,-0.432],[-0.58,-1.309],[-0.33,-0.254],[-0.017,-1.537],[1.202,-0.961],[31.986,-17.992]],"o":[[-8.919,0.002],[-13.819,-12.955],[1.195,-2.488],[2.488,1.196],[-9.629,20.041],[8.406,7.883],[24.744,-13.918],[-8.928,-7.283],[-25.201,15.305],[0,0],[-2.181,1.695],[-1.696,-2.18],[0,0],[17.048,-13.268],[1.229,-0.736],[1.367,0.431],[7.388,16.623],[1.223,0.933],[0.016,1.539],[-1.646,1.316],[-7.079,3.982]],"v":[[-28.639,54.751],[-52.437,45.587],[-55.951,-13.72],[-49.279,-16.06],[-46.939,-9.388],[-45.597,38.29],[-11.897,40.089],[54.486,-5.581],[18.644,-42.562],[-32.301,-7.222],[-34.375,-5.606],[-41.392,-6.483],[-40.515,-13.501],[-38.443,-15.112],[17.982,-53.841],[22.06,-54.321],[25.123,-51.585],[65.591,-9.524],[67.554,-5.608],[65.677,-1.649],[-6.994,48.804]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725550034,0.364705882353,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.82,149.048],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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":[[14,12],[0,0],[-34,-24],[21.411,21.014]],"o":[[-8,18],[0,0],[32.617,23.023],[-18.34,-18]],"v":[[-17.876,-61.512],[-61.876,-17.512],[0.124,38.488],[40.464,-9.512]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.560784313725,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236.25,155.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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":[[-30,18],[0,0],[33.307,-17.137],[-19.524,22.777]],"o":[[8,18],[0,0],[-35.501,18.266],[12,-14]],"v":[[21.762,-56.133],[63.762,-12.133],[-8.238,37.867],[-44.238,-10.133]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.560784313725,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[66.612,155.627],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","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":[[1.268,0],[0.85,0.729],[0.076,1.01],[-2.476,0.189],[-0.189,-2.474],[-7.786,-6.686],[1.619,-1.885]],"o":[[-1.037,0],[-12.216,-10.49],[-0.188,-2.477],[2.489,-0.194],[0.454,5.852],[1.884,1.619],[-0.891,1.037]],"v":[[6.156,20.718],[3.225,19.632],[-11.003,-15.7],[-6.861,-20.524],[-2.031,-16.384],[9.089,12.804],[9.571,19.15]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[167.934,102.014],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 5","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":[[1.158,0],[0.877,0.869],[-1.748,1.766],[0.02,0.189],[-1.774,0.793],[-6.386,0.639],[-3.576,-0.371],[-2.168,0.109],[-0.14,2.355],[2.805,0.489],[3.217,-0.414],[10.391,-3.668],[0.826,2.342],[-2.344,0.828],[-5.949,0.774],[-12.777,-2.226],[0.263,-4.418],[6.096,-0.322],[2.974,0.313],[2.654,-0.27],[3.537,-1.424],[11.158,-11.266]],"o":[[-1.145,0],[-1.766,-1.748],[11.236,-11.346],[-0.201,-1.934],[1.121,-0.502],[3.565,-0.358],[2.752,0.289],[1.174,-0.063],[0.016,-0.275],[-11.367,-1.978],[-4.642,0.603],[-2.348,0.826],[-0.826,-2.344],[9.865,-3.481],[4.293,-0.559],[7.908,1.377],[-0.397,6.6],[-2.867,0.146],[-3.127,-0.322],[-3.158,0.314],[0.11,6.986],[-0.881,0.889]],"v":[[-24.184,33.094],[-27.35,31.791],[-27.382,25.428],[-17.983,-5.101],[-15.347,-9.681],[2.174,-15.236],[13.01,-14.834],[20.533,-14.388],[24.884,-19.654],[22.145,-21.256],[0.173,-23.609],[-27.564,-15.732],[-33.306,-18.478],[-30.559,-24.22],[-0.988,-32.535],[23.689,-30.123],[33.868,-19.115],[21.004,-5.4],[12.077,-5.883],[3.069,-6.279],[-8.857,-2.654],[-20.988,31.76]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.795,96.732],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 6","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.859,0],[1.318,4.299],[-4.387,2.392],[-5.619,-0.407],[-14.567,-4.286],[0.701,-2.385],[2.389,0.704],[3.975,0.293],[11.474,-6.26],[-0.06,-0.193],[-5.26,0.506],[-0.236,-2.475],[2.475,-0.236]],"o":[[-8.949,0],[-1.397,-4.557],[9.723,-5.305],[4.74,0.351],[2.385,0.701],[-0.701,2.384],[-13.559,-3.988],[-2.135,-0.125],[-0.883,0.48],[0.377,1.235],[2.445,-0.262],[0.238,2.473],[-0.937,0.092]],"v":[[-16.93,15.51],[-31.883,6.559],[-26.888,-5.06],[1.233,-15.103],[29.532,-8.306],[32.579,-2.72],[26.993,0.326],[0.57,-6.127],[-22.579,2.842],[-23.279,3.92],[-15.094,6.418],[-10.187,10.467],[-14.236,15.375]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.707,64.041],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 7","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":[[5.377,0],[0,2.484],[-2.484,0],[-0.425,0.127],[0.437,0.32],[0,0],[3.859,-0.776],[9.723,-5.72],[1.261,2.142],[-2.142,1.26],[-9.728,1.946],[-9.906,-7.207],[0,0],[0.586,-1.798]],"o":[[-2.484,0],[0,-2.484],[0.789,0],[-0.238,-0.239],[0,0],[-11.17,-8.128],[-7.781,1.556],[-2.143,1.262],[-1.26,-2.141],[9.34,-5.494],[8.522,-1.712],[0,0],[6.125,4.455],[-1.271,3.911]],"v":[[26.698,15.969],[22.198,11.469],[26.698,6.969],[28.51,6.736],[27.509,5.892],[27.188,5.659],[4.54,-5.432],[-31.507,10.165],[-37.667,8.568],[-36.07,2.407],[2.774,-14.257],[32.483,-1.618],[32.802,-1.385],[37.641,9.534]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.272,48.581],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 8","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":[[1.893,0],[0.467,0.153],[0.4,3.793],[-6.109,3.565],[0,0],[-7.926,0.277],[-0.157,0],[-3.311,-2.805],[1.608,-1.897],[1.896,1.607],[5.287,-0.239],[5.957,-3.477],[0,0],[0.301,-0.314],[-1.033,-0.34],[0.776,-2.361]],"o":[[-0.465,0],[-4.946,-1.625],[-0.235,-2.207],[0,0],[12.33,-7.196],[0.152,-0.004],[11.205,0],[1.896,1.605],[-1.609,1.894],[-8.463,-7.168],[-6.756,0.234],[0,0],[-0.871,0.507],[0.344,0.248],[2.362,0.775],[-0.623,1.895]],"v":[[-26.876,16.6],[-28.28,16.374],[-36.69,7.849],[-30.294,-2.158],[-29.837,-2.422],[2.923,-16.592],[3.386,-16.6],[34.792,0.025],[35.317,6.367],[28.976,6.892],[3.237,-7.596],[-25.302,5.35],[-25.759,5.617],[-27.462,6.888],[-25.472,7.824],[-22.601,13.503]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152,37.007],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 9","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.002,0.002],[0.002,-0.004]],"o":[[-0.002,0.002],[0.002,-0.004]],"v":[[-27.187,-23.849],[-27.193,-23.84]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.334,0],[0.113,0.008],[-0.183,2.478],[-6.227,7.332],[-9.181,0],[0,0],[-2.873,-3.449],[0.187,-1.854],[2.828,-2.262],[1.553,1.942],[-1.941,1.553],[-0.039,0.395],[0.139,0.168],[4.594,0.003],[5.529,-6.332],[1.318,-17.795]],"o":[[-0.112,0],[-2.479,-0.184],[0.592,-7.975],[5.433,-6.403],[0,0],[9.307,0.008],[2.385,2.865],[-0.299,2.953],[-1.941,1.548],[-1.551,-1.941],[0.984,-0.787],[0.027,-0.269],[-3.35,-4.018],[-5.427,0.287],[-3.506,5.969],[-0.176,2.365]],"v":[[-44.212,57.786],[-44.548,57.774],[-48.705,52.954],[-34.054,-29.664],[13.964,-57.786],[13.971,-57.786],[46.227,-37.733],[48.701,-30.206],[43.852,-22.12],[37.526,-22.826],[38.231,-29.151],[39.747,-31.115],[39.312,-31.974],[13.963,-48.785],[-27.107,-23.943],[-39.728,53.618]],"c":true},"ix":2},"nm":"パス 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"パスを結合 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[139.386,62.643],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 10","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.152,0],[0.237,2.316],[4.627,4.437],[4.914,0],[0,0],[6.508,-4.041],[1.576,-1.576],[1.758,1.758],[-0.4,3.505],[-2.916,1.824],[-9.41,0.057],[0,0],[-6.58,-6.035],[-1.56,-15.301],[2.473,-0.252]],"o":[[-2.279,0],[-3.634,-35.607],[-6.965,-6.387],[0,0],[-4.817,0.029],[1.25,1.757],[-1.758,1.758],[-0.897,-0.897],[0.287,-2.526],[0.231,-0.145],[0,0],[8.926,0],[9.864,9.041],[0.252,2.473],[-0.156,0.015]],"v":[[44.353,57.209],[39.882,53.166],[22.882,-29.232],[-10.321,-48.209],[-10.339,-48.209],[-38.956,-35.152],[-39.444,-29.365],[-45.807,-29.365],[-48.686,-36.148],[-43.858,-42.701],[-10.393,-57.209],[-10.344,-57.209],[28.966,-35.863],[48.835,52.252],[44.815,57.186]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[163.719,57.459],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 11","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":[[1.703,16.674],[6.914,6.337],[6.909,-0.042],[4.202,-2.626],[-1.153,-1.152],[0,0],[1.913,-2.254],[0.796,-19.566],[-18.237,26.168],[0,0],[-5.846,0.584],[-10.283,-11.26]],"o":[[-1.704,-16.674],[-6.912,-6.337],[-6.909,0.042],[-4.608,2.881],[0,0],[-6.122,4.089],[-4.374,5.151],[-0.796,19.565],[11.763,-13.832],[0,0],[0,0],[10.284,11.262]],"v":[[56.001,32.067],[37.565,-53.19],[1.275,-73.352],[-29.832,-59.526],[-30.985,-53.19],[-30.196,-52.415],[-43.316,-42.211],[-56.907,37.828],[-17.467,47.225],[-6.79,13.057],[9.34,7.873],[22.012,40.132]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.078,78.101],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 12","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":[[1.281,0],[0.843,0.711],[10.989,7.198],[-1.363,2.08],[-2.082,-1.363],[-19.322,-16.274],[1.602,-1.9]],"o":[[-1.023,0],[-18.336,-15.443],[-2.078,-1.361],[1.36,-2.08],[10.937,7.166],[1.901,1.599],[-0.888,1.057]],"v":[[28.209,26.055],[25.313,24.997],[-30.594,-17.165],[-31.891,-23.395],[-25.66,-24.693],[31.109,18.115],[31.652,24.454]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[234.255,120.687],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 13","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":[[-23.642,-22.522],[-9.675,-8.148],[36.943,31.113],[11.382,7.458]],"o":[[24.843,23.667],[18.484,15.567],[-18.484,-15.568],[-15.107,-9.896]],"v":[[-45.472,-11.917],[5.421,39.169],[32.172,-2.356],[-24.167,-44.84]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[230.295,144.598],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 14","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.826,0],[0.86,1.348],[-2.098,1.336],[-11.793,5.652],[-1.072,-2.238],[2.24,-1.074],[20.221,-12.875]],"o":[[-1.486,0],[-1.334,-2.096],[21.307,-13.564],[2.248,-1.075],[1.075,2.242],[-11.846,5.676],[-0.748,0.476]],"v":[[-30.734,22.134],[-34.536,20.05],[-33.154,13.837],[28.791,-21.059],[34.795,-18.946],[32.682,-12.942],[-28.322,21.431]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.585,119.874],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 15","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":[[26.419,-19.188],[10.67,-6.793],[-40.743,25.938],[-12.271,5.882]],"o":[[-27.763,20.163],[-20.386,12.978],[20.386,-12.979],[16.285,-7.806]],"v":[[46.276,-8.938],[-21.423,39.225],[-31.951,-9.761],[29.525,-44.397]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.798,147.269],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Hair","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,392.45,0],"ix":2,"l":2},"a":{"a":0,"k":[270.25,170.25,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],[-82,-22],[-6.75,-75.937],[0,0],[9.943,35.511],[0,0],[10,-32],[0,0],[12,48],[0,0],[14,-44],[0,0],[16,68],[0,0],[16,-68],[0,0],[14,44],[0,0],[12,-48],[0,0],[9.125,29.201],[0,0],[14,-50],[0,0],[-8,90],[-74.339,19.944]],"o":[[0,0],[74.339,19.944],[8,90],[0,0],[-14,-50],[0,0],[-9.125,29.201],[0,0],[-12,-48],[0,0],[-14,44],[0,0],[-16,-68],[0,0],[-16,68],[0,0],[-14,-44],[0,0],[-12,48],[0,0],[-10,-32],[0,0],[-9.944,35.511],[0,0],[6.75,-75.937],[82,-22]],"v":[[0,-140],[110,-148],[262,30],[236,170],[226,104],[196,42],[188,100],[168,146],[156,66],[126,-14],[114,72],[76,136],[62,28],[0,-88],[-62,28],[-76,136],[-114,72],[-126,-14],[-156,66],[-168,146],[-188,100],[-196,42],[-226,104],[-236,170],[-262,30],[-110,-148]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654027362898,0.419909069585,0.256856462067,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[270.25,170.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":"トランスフォーム"}],"nm":"グループ 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Eyebrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[540.197,501.356,0],"to":[0,-2.5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[540.197,486.356,0],"to":[0,0,0],"ti":[0,-2.5,0]},{"t":90,"s":[540.197,501.356,0]}],"ix":2,"l":2},"a":{"a":0,"k":[193,44.641,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],[-28,-4],[0,0]],"o":[[0,0],[28,4],[0,0]],"v":[[-37,0],[1,-8],[37,12]],"c":false},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[324,52.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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,0],[28,-4],[0,0]],"o":[[0,0],[-28,4],[0,0]],"v":[[37,0],[-1,-8],[-37,12]],"c":false},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[62,52.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"EyeLight_02","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":70,"s":[0]},{"t":90,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[547.859,610.643,0],"ix":2,"l":2},"a":{"a":0,"k":[143.134,19.757,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":[[-6.885,-1.377],[0,-5.508],[6.346,0],[0,5.507]],"o":[[4.726,0.945],[0,5.508],[-4.82,0],[0,-5.551]],"v":[[2.41,-8.95],[9.982,1.378],[-1.032,10.326],[-9.982,0.689]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568718584846,0.539330994849,0.557344563802,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.904,10.577],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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":[[6.885,-1.377],[0,-5.508],[-6.346,0],[0,5.507]],"o":[[-4.726,0.945],[0,5.508],[4.82,0],[0,-5.551]],"v":[[-2.41,-8.95],[-9.982,1.378],[1.031,10.326],[9.982,0.689]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568718584846,0.539330994849,0.557344563802,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[276.036,10.577],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"EyeLight_01","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[0]},{"t":90,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[547.859,610.643,0],"ix":2,"l":2},"a":{"a":0,"k":[143.134,19.757,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":[[-9.49,-1.898],[0,-7.592],[8.749,0],[0,7.592]],"o":[[6.514,1.303],[0,7.592],[-6.643,0],[0,-7.651]],"v":[[3.323,-12.337],[13.76,1.898],[-1.423,14.235],[-13.76,0.949]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568718584846,0.539330994849,0.557344563802,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.01,25.03],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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":[[9.49,-1.898],[0,-7.592],[-8.749,0],[0,7.592]],"o":[[-6.514,1.303],[0,7.592],[6.644,0],[0,-7.651]],"v":[[-3.322,-12.337],[-13.76,1.898],[1.423,14.235],[13.76,0.949]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.568718584846,0.539330994849,0.557344563802,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.364,25.03],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Eye","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,613.72,0],"ix":2,"l":2},"a":{"a":0,"k":[161.25,34.266,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]],"o":[[0,0],[0,0]],"v":[[-7,-26.987],[-6.98,-26.987]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.761,0],[1.764,-0.351],[0,-13.666],[-13.439,0],[0,12.682],[5.639,4.621]],"o":[[-1.727,0],[-11.427,2.285],[0,14.506],[11.58,0],[0,-6.623],[-4.545,-3.727]],"v":[[-0.777,-22.609],[-6.02,-22.085],[-24,3.013],[3,24.013],[24,1.013],[14.996,-16.943]],"c":true},"ix":2},"nm":"パス 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[17.094,0],[0,18.252],[-16.049,3.207],[-8.268,-6.778],[0,-9.586]],"o":[[-21.785,0],[0,-18.32],[10.64,-2.125],[7.93,6.502],[0,18.195]],"v":[[3,34.013],[-34,3.013],[-7.98,-31.888],[21.336,-24.677],[34,1.013]],"c":true},"ix":2},"nm":"パス 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"パスを結合 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.25,34.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 1","np":5,"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":[[20,-4],[0,-16],[-18.438,0],[0,16]],"o":[[-13.728,2.746],[0,16],[14,0],[0,-16.124]],"v":[[-7,-26],[-29,4],[3,30],[29,2]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[288.25,33.28],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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":[[1.727,0],[4.544,-3.727],[0,-6.623],[-11.58,0],[0,14.506],[11.428,2.286]],"o":[[-5.762,0],[-5.639,4.621],[0,12.682],[13.439,0],[0,-13.666],[-1.762,-0.351]],"v":[[0.777,-22.608],[-14.996,-16.941],[-24,1.016],[-3,24.016],[24,3.016],[6.019,-22.082]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[21.785,0],[0,18.195],[-7.93,6.502],[-10.637,-2.129],[0,-18.32]],"o":[[-17.094,0],[0,-9.586],[8.265,-6.78],[16.049,3.207],[0,18.252]],"v":[[-3,34.016],[-34,1.016],[-21.336,-24.676],[7.98,-31.887],[34,3.016]],"c":true},"ix":2},"nm":"パス 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"パスを結合 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.25,34.266],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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":[[-20,-4],[0,-16],[18.439,0],[0,16]],"o":[[13.728,2.746],[0,16],[-14,0],[0,-16.124]],"v":[[7,-26],[29,4],[-3,30],[-29,2]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.253067944097,0.218980901382,0.226545909807,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.25,33.28],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Cheek_01","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,665.735,0],"ix":2,"l":2},"a":{"a":0,"k":[226.25,39.25,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,-21.539],[-21.539,0],[0,21.539],[21.539,0]],"o":[[0,21.539],[21.539,0],[0,-21.539],[-21.539,0]],"v":[[-39,0],[0,39],[39,0],[0,-39]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272506415,0.419909069585,0.405691139371,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[413.25,39.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":"トランスフォーム"}],"nm":"グループ 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,-21.539],[21.539,0],[0,21.539],[-21.539,0]],"o":[[0,21.539],[-21.539,0],[0,-21.539],[21.539,0]],"v":[[39,0],[0,39],[-39,0],[0,-39]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272506415,0.419909069585,0.405691139371,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.25,39.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":"トランスフォーム"}],"nm":"グループ 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Cheek_02","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[0]},{"t":90,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,665.735,0],"ix":2,"l":2},"a":{"a":0,"k":[226.25,39.25,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,-21.539],[-21.539,0],[0,21.539],[21.539,0]],"o":[[0,21.539],[21.539,0],[0,-21.539],[-21.539,0]],"v":[[-39,0],[0,39],[39,0],[0,-39]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254901961,0.552941176471,0.501960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[413.25,39.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":"トランスフォーム"}],"nm":"グループ 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,-21.539],[21.539,0],[0,21.539],[-21.539,0]],"o":[[0,21.539],[-21.539,0],[0,-21.539],[21.539,0]],"v":[[39,0],[0,39],[-39,0],[0,-39]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254901961,0.552941176471,0.501960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.25,39.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":"トランスフォーム"}],"nm":"グループ 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Mouth","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[540.197,756.056,0],"to":[0,-2,0],"ti":[0,2,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":20,"s":[540.197,744.056,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[540.197,744.056,0],"to":[0,2,0],"ti":[0,-2,0]},{"t":90,"s":[540.197,756.056,0]}],"ix":2,"l":2},"a":{"a":0,"k":[80.281,56.378,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-19.037,0],[-9.832,9.832],[0,0],[48.884,0],[0,0],[-14.903,-14.903]],"o":[[19.963,0],[13.043,-13.043],[0,0],[-48.884,0],[0,0],[7.597,7.597]],"v":[[80.121,71.756],[121.074,52.398],[140.33,4.458],[80.228,4],[19.982,4.458],[40.228,52.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[-24.847,0],[-16.625,24.273],[0,0],[48.884,0],[0,0],[-18.608,-27.169]],"o":[[24.847,0],[18.608,-27.169],[0,0],[-48.884,0],[0,0],[16.625,24.273]],"v":[[80.281,112.506],[141.704,75.735],[158.33,4.515],[80.281,0.25],[2.232,4.515],[18.858,75.735]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[{"i":[[-24.847,0],[-16.625,24.273],[0,0],[48.884,0],[0,0],[-18.608,-27.169]],"o":[[24.847,0],[18.608,-27.169],[0,0],[-48.884,0],[0,0],[16.625,24.273]],"v":[[80.281,112.506],[141.704,75.735],[158.33,4.515],[80.281,0.25],[2.232,4.515],[18.858,75.735]],"c":true}]},{"t":90,"s":[{"i":[[-19.037,0],[-9.832,9.832],[0,0],[48.884,0],[0,0],[-14.903,-14.903]],"o":[[19.963,0],[13.043,-13.043],[0,0],[-48.884,0],[0,0],[7.597,7.597]],"v":[[80.121,71.756],[121.074,52.398],[140.33,4.458],[80.228,4],[19.982,4.458],[40.228,52.485]],"c":true}]}],"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272506415,0.419909069585,0.405691139371,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Face","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,519.422,0],"ix":2,"l":2},"a":{"a":0,"k":[457.781,303.223,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]],"o":[[0,0],[0,0]],"v":[[457.781,434.248],[457.781,446.248]],"c":false},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.873935415231,0.564931054209,0.349760466931,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 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":"トランスフォーム"}],"nm":"グループ 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":[[42,0],[48,26.695],[-12,47.229],[-48,100.618],[-80,0],[-42.891,-89.909],[-12,-47.229],[48,-26.694]],"o":[[-42,0],[-48,-26.694],[12,-47.229],[42.891,-89.909],[80,0],[48,100.618],[12,47.229],[-48,26.695]],"v":[[0,266.946],[-196,229.984],[-230,123.206],[-216,-145.793],[0,-266.946],[216,-145.793],[230,123.206],[196,229.984]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[457.781,339.249],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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":[[-11.268,18.029],[-18,-12],[14,-26],[12,-2],[-5.831,17.493]],"o":[[10,-16],[18,12],[-14,26],[-12,2],[10,-30]],"v":[[-35.366,-46],[18.634,-50],[32.634,28],[-17.366,60],[-35.366,30]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.970616718367,0.754505710976,0.580090092678,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[699.147,434.249],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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":[[11.268,18.029],[18,-12],[-14,-26],[-12,-2],[5.831,17.493]],"o":[[-10,-16],[-18,12],[14,26],[12,2],[-10,-30]],"v":[[35.366,-46],[-18.634,-50],[-32.634,28],[17.366,60],[35.366,30]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.970616718367,0.754505710976,0.580090092678,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[216.415,434.249],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","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":[[-289.125,0],[94.585,183.819],[88.549,0],[62.561,-121.58]],"o":[[289.125,0],[-62.56,-121.58],[-88.549,0],[-94.586,183.819]],"v":[[0.001,301],[265.647,-149.499],[0.001,-301],[-265.646,-149.499]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.512799012427,0.327018318924,0.222757586311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[456.781,301.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":"トランスフォーム"}],"nm":"グループ 5","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":[[45.453,-17.084],[-12.771,-28],[-19.156,14]],"o":[[-21.285,8],[12.826,28.121],[19.156,-14]],"v":[[-18.091,-43.458],[-30.862,28.542],[24.478,46.542]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910897946825,0.293824917662,0.308998347264,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[181.827,382.708],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 6","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":[[-13.915,22.942],[57.944,-3.252],[0,0],[-28.233,1.706],[11.447,-37.589],[0,0],[-64.4,26.845]],"o":[[13.915,-22.943],[-65.517,3.677],[0,0],[-0.916,-1.078],[-13.713,45.034],[0,0],[40.528,-16.894]],"v":[[86.164,-24.552],[-18.748,-91.317],[-97.612,-22.511],[-52.719,-43.926],[-86.366,-0.522],[-89.119,94.569],[-12.774,7.497]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.512799012427,0.327018318924,0.222757586311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.329,432.316],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 7","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":[[-45.453,-17.084],[12.771,-28],[19.156,14]],"o":[[21.285,8],[-12.826,28.121],[-19.157,-14]],"v":[[18.092,-43.458],[30.863,28.542],[-24.477,46.542]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910897946825,0.293824917662,0.308998347264,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[733.735,382.708],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 8","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":[[13.915,22.942],[-57.943,-3.252],[0,0],[28.233,1.706],[-11.446,-37.589],[0,0],[64.401,26.845]],"o":[[-13.914,-22.943],[65.517,3.677],[0,0],[0.915,-1.078],[13.713,45.034],[0,0],[-40.528,-16.894]],"v":[[-86.164,-24.552],[18.748,-91.317],[97.612,-22.511],[52.719,-43.926],[86.365,-0.522],[89.118,94.569],[12.773,7.497]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.512799012427,0.327018318924,0.222757586311,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[815.234,432.316],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Arm","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.573,875.502,0],"ix":2,"l":2},"a":{"a":0,"k":[155.942,86.57,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":[[7.945,0],[7.036,5.471],[0.263,0.283],[-0.14,1.426],[-1.162,0.838],[-6.107,13.741],[-1.541,0.347],[-1.202,-1.028],[-3.692,-3.097],[-14.116,-13.853],[1.934,-1.971],[1.97,1.936],[11.859,9.95],[1.936,1.635],[8.977,-6.887],[-27.34,-21.263],[-9.791,7.898],[11.758,24.474],[18.656,21.334],[-2.08,1.818],[-1.818,-2.08],[-15.352,-31.95],[12.586,-10.154]],"o":[[-8.051,0],[-35.902,-27.926],[-0.975,-1.051],[0.143,-1.425],[9.711,-7.018],[0.641,-1.443],[1.537,-0.346],[3.318,2.844],[12,10.067],[1.97,1.934],[-1.934,1.972],[-13.838,-13.58],[-2.043,-1.714],[-9.224,14.055],[8.487,8.691],[10.398,8.09],[9.743,-7.859],[-14.949,-31.114],[-1.818,-2.078],[2.078,-1.818],[19.27,22.033],[14.289,29.746],[-6.623,5.342]],"v":[[21.314,75.868],[-1.911,67.661],[-64.504,11.116],[-65.817,7.223],[-63.768,3.661],[-21.409,-38.318],[-17.942,-41.163],[-13.586,-40.083],[-3.053,-31.185],[36.662,4.145],[36.728,11.216],[29.658,11.282],[-9.481,-23.525],[-15.452,-28.544],[-53.321,8.329],[4.23,59.766],[37.464,60.075],[42.654,9.88],[-6.604,-66.995],[-6.131,-74.05],[0.923,-73.577],[51.668,5.548],[43.744,67.858]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725550034,0.364705882353,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[241.782,95.309],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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":[[7.115,0],[6.482,6.076],[-11.619,24.18],[-15.022,17.174],[-2.076,-1.821],[1.818,-2.078],[17.427,-36.275],[-10.469,-9.814],[-12.066,6.783],[-11.639,9.033],[8.543,13.825],[15.842,-12.33],[0,0],[1.695,2.179],[-2.18,1.695],[0,0],[-29.088,17.453],[-1.363,-0.432],[-0.58,-1.309],[-0.33,-0.254],[-0.017,-1.537],[1.202,-0.961],[31.986,-17.992]],"o":[[-8.919,0.002],[-13.819,-12.955],[17.947,-37.355],[1.816,-2.08],[2.08,1.818],[-14.576,16.668],[-9.631,20.041],[8.406,7.883],[24.744,-13.918],[-8.928,-7.283],[-25.201,15.305],[0,0],[-2.181,1.695],[-1.696,-2.18],[0,0],[17.048,-13.268],[1.229,-0.736],[1.367,0.431],[7.388,16.623],[1.223,0.933],[0.016,1.539],[-1.646,1.316],[-7.079,3.982]],"v":[[-28.639,73.943],[-52.437,64.78],[-55.951,5.473],[-5.209,-71.652],[1.845,-72.124],[2.318,-65.071],[-46.937,9.805],[-45.597,57.482],[-11.897,59.282],[54.486,13.611],[18.644,-23.37],[-32.301,11.971],[-34.375,13.587],[-41.392,12.71],[-40.515,5.691],[-38.443,4.081],[17.982,-34.648],[22.06,-35.128],[25.123,-32.393],[65.591,9.669],[67.554,13.585],[65.677,17.544],[-6.994,67.997]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725550034,0.364705882353,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.388,95.384],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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":[[15.421,21.868],[12.375,23.545],[-21.666,-24.773],[-16.436,-34.209]],"o":[[-16.678,-23.65],[-21.206,-40.346],[17.169,19.631],[22.692,47.23]],"v":[[0.257,64.452],[-47.743,-15.548],[-3.743,-61.547],[46.257,16.453]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.560784313725,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[242.685,86.57],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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":[[-18.208,19.608],[-12.375,23.545],[21.666,-24.773],[16.436,-34.209]],"o":[[26,-28],[21.206,-40.346],[-17.169,19.631],[-22.692,47.23]],"v":[[-6.257,63.583],[47.743,-10.418],[3.743,-58.417],[-46.257,17.583]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.937254961799,0.560784313725,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.199,85.44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","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":[[15.421,21.868],[12.376,23.545],[-21.665,-24.772],[-16.436,-34.209]],"o":[[-16.678,-23.65],[-21.206,-40.347],[17.169,19.631],[22.692,47.231]],"v":[[4.429,57.542],[-41.35,-11.191],[-3.764,-54.639],[39.864,14.044]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[242.432,86.709],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 5","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":[[-15.421,21.868],[-12.375,23.545],[21.666,-24.772],[16.436,-34.209]],"o":[[16.677,-23.65],[21.206,-40.347],[-17.169,19.631],[-22.692,47.231]],"v":[[-4.428,57.542],[41.35,-11.191],[3.764,-54.639],[-39.864,14.044]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.977253693225,0.833177274816,0.698581531001,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.792,86.709],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540.197,1023.346,0],"ix":2,"l":2},"a":{"a":0,"k":[236,237.625,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,-7.732],[7.732,0],[0,7.732],[-7.732,0]],"o":[[0,7.732],[-7.732,0],[0,-7.732],[7.732,0]],"v":[[14,0],[0,14],[-14,0],[0,-14]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.914689307119,0.363972832175,0.468252383961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[237,136.476],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 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,-7.732],[7.732,0],[0,7.732],[-7.732,0]],"o":[[0,7.732],[-7.732,0],[0,-7.732],[7.732,0]],"v":[[14,0],[0,14],[-14,0],[0,-14]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.914689307119,0.363972832175,0.468252383961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[237,92.476],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 2","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],[-12,-6],[0,0],[-12,6],[0,0]],"o":[[0,0],[12,6],[0,0],[12,-6],[0,0]],"v":[[-55,-17],[-31,11],[1,-11],[31,11],[55,-17]],"c":false},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.914689307119,0.363972832175,0.468252383961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[236,59.476],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 3","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],[-10.391,-39.732],[0,0],[34,-8],[29.316,-6.373],[28,10],[44,26],[52,26],[-35.815,126.376],[-12.427,27.12]],"o":[[13.221,28.188],[36.831,140.824],[-22,-18],[-27.325,6.43],[-46,10],[-44.332,-15.833],[-66.975,-39.576],[8,-22],[11.687,-41.237],[0,0]],"v":[[113.595,-176.001],[149,-73.999],[211,148.001],[139,130.001],[85,166.001],[1,136.001],[-91,148.001],[-211,138.001],[-151.51,-73.999],[-115.52,-176.001]],"c":false},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.914689307119,0.363972832175,0.468252383961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"線 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[236,274.249],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 4","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":[[52,26],[-35.815,126.376],[-64.94,0.405],[-34.018,-130.066],[0,0],[34,-8],[29.315,-6.373],[28,10],[44,26]],"o":[[8,-22],[42.529,-150.066],[64.939,0.405],[36.831,140.824],[-22,-18],[-27.325,6.43],[-46,10],[-44.332,-15.833],[-66.976,-39.576]],"v":[[-211,264.986],[-151.51,52.986],[1,-147.014],[149,52.986],[211,274.986],[139,256.986],[85,292.986],[1,262.986],[-91,274.986]],"c":true},"ix":2},"nm":"パス 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.936495852003,0.561131196864,0.654027362898,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"塗り 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236,147.264],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"トランスフォーム"}],"nm":"グループ 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]} No newline at end of file | |||
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Check whether merge paths are enabled anywhere and which recap assets rely on them.
set -euo pipefail
# Assets that use merge paths.
fd -t f 'recap_.*\.json' -p app/src/main/res/raw --exec sh -c 'grep -l "\"ty\":\"mm\"" "$1" || true' _ {}
# Is the flag enabled in code or layouts?
rg -n 'enableMergePathsForKitKatAndAbove|lottie_enableMergePaths' -g '!**/build/**'Repository: PSMRI/FLW-Mobile-App
Length of output: 236
🏁 Script executed:
#!/bin/bash
# Check repository references to merge-path support without depending on repository commands.
set -u
echo "== merge path / flag references =="
rg -n 'mergePaths|merge paths|merge paths|EnableMerge|enableMergePathsForKitkatAndAbove|enableMergePathsForKitKatAndAbove|lottie_enableMergePaths' -g '!**/build/**' . || true
echo
echo "== recap raw assets with merge paths =="
while IFS= read -r -d '' file; do
if grep -q '"ty":"mm"' "$file"; then
echo "$file"
fi
done < <(find app/src/main/res/raw -maxdepth 1 -type f -print0 2>/dev/null | sort -z | head -zn 50)
echo
echo "== Lottie dependency declarations =="
rg -n 'com\.airbnb\.android:lottie|lottie' -g '!**/build/**' .Repository: PSMRI/FLW-Mobile-App
Length of output: 3653
🏁 Script executed:
#!/bin/bash
set -u
echo "== fragments using LottieAnimationView =="
for f in app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.kt \
app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/strips/*.kt \
app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModel.kt \
app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposer.kt; do
if [ -f "$f" ]; then echo "--- $f"; fi
done
echo
rg -n "\.setRawFile|\.setAnimation|\.animation|setAnimation|LottieAnimationView|setRawFileWith" app/src/main app/src/test -g '!**/build/**' || true
echo
echo "== layout snippets =="
sed -n '20,40p' app/src/main/res/layout/fragment_monthly_recap_playback.xml || true
sed -n '160,175p' app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackFragment.kt || trueRepository: PSMRI/FLW-Mobile-App
Length of output: 4420
🌐 Web query:
Lottie Android 6.4.0 LottieAnimationView enableMergePathsForKitKatAndAbove documentation
💡 Result:
In Lottie for Android 6.4.0, merge paths are a feature that must be manually enabled using the enableMergePathsForKitKatAndAbove(boolean) method [1][2]. Key documentation and usage details include: Purpose and Compatibility: Merge paths are only supported on devices running Android KitKat (API level 19) and above [1][2]. Because they can introduce performance overhead due to the use of Path.Op, they are disabled by default [1][2]. Implementation: You can enable this feature either programmatically or via XML [3][4]. Programmatic: lottieAnimationView.enableMergePathsForKitKatAndAbove(true); XML: <com.airbnb.lottie.LottieAnimationView... app:lottie_enableMergePathsForKitKatAndAbove="true" /> Limitations: Merge paths do not function correctly if the operand shape is entirely contained within the first shape [5][6]. If your goal is to cut one shape out of another, it is recommended to use an even-odd fill type instead [5][6]. Warning: If an animation contains merge paths but they have not been enabled, Lottie will log a warning indicating that they are disabled [3][4].
Citations:
- 1: https://airbnb.gitbook.io/lottie/android
- 2: https://github.com/airbnb/lottie/blob/master/android.md
- 3: Add support for merge paths airbnb/lottie-android#101
- 4: https://stackoverflow.com/questions/51493427/android-lottie-animation-lags
- 5: https://github.com/airbnb/lottie-android/blob/c5b8318c7cf205e95db143955acbfc69f86bc339/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
- 6: https://github.com/airbnb/lottie-android/blob/master/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
Enable merge paths before loading recap_girl_3.json.
recap_girl_3.json uses "ty":"mm" merge paths in the Hand and Eye layers. lottie-android 6.4.0 disables merge paths by default, and this playback view does not set app:lottie_enableMergePathsForKitKatAndAbove or call enableMergePathsForKitKatAndAbove(true). Enable it, or export the animation without merge-path operators.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/src/main/res/raw/recap_girl_3.json` at line 1, Enable Lottie merge paths
before loading the recap_girl_3 animation: configure the playback view with
app:lottie_enableMergePathsForKitKatAndAbove or call
enableMergePathsForKitKatAndAbove(true) on its LottieAnimationView. Apply this
to the view that loads recap_girl_3.json, or remove the ty:"mm" merge-path
operators from the Hand and Eye layers during export.
| <string name="monthly_recap_playback_girl_cd">আপোনাৰ আশা দিদীয়ে আপোনাৰ কামৰ উদযাপন কৰি আছে</string> | ||
| <string name="monthly_recap_playback_prev_cd">পূৰ্বৰ বাৰ্তা</string> | ||
| <string name="monthly_recap_playback_next_cd">পৰৱৰ্তী বাৰ্তা</string> | ||
| <string name="monthly_recap_playback_pause_cd">বন্ধ কৰক</string> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use a distinct Assamese word for "Pause".
monthly_recap_playback_pause_cd is "বন্ধ কৰক". monthly_recap_playback_close_cd at Line 1464 uses the same verb, "বন্ধ কৰক". TalkBack users then hear the same action word for the Pause button and the Close button. Pause and Close have different results: Pause holds the story, Close leaves the screen. Use a word that means "hold" for the Pause button.
✏️ Proposed wording change
- <string name="monthly_recap_playback_pause_cd">বন্ধ কৰক</string>
+ <string name="monthly_recap_playback_pause_cd">সাময়িকভাৱে ৰখাওক</string>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <string name="monthly_recap_playback_pause_cd">বন্ধ কৰক</string> | |
| <string name="monthly_recap_playback_pause_cd">সাময়িকভাৱে ৰখাওক</string> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/src/main/res/values-as/strings.xml` at line 1469, Update the Assamese
translation for monthly_recap_playback_pause_cd to use a distinct word meaning
“hold” or “pause,” while leaving monthly_recap_playback_close_cd unchanged so
TalkBack announces different actions for Pause and Close.
| <!-- | ||
| Monthly Recap strip preview state (main = release-safe default). | ||
|
|
||
| Release builds use THIS value and therefore always render the strip HIDDEN | ||
| until the real eligibility source is implemented in a later Phase. Debug builds | ||
| override this via app/src/debug/res/values/monthly_recap_debug.xml. | ||
|
|
||
| Valid tokens: hidden | ready | resume | replay | ||
| (see MonthlyRecapStripState.fromToken — anything unknown is treated as hidden). | ||
| --> | ||
| <string name="monthly_recap_preview_state" translatable="false">hidden</string> |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Correct the comment: release builds do not read this value.
HomeIconsFragment.setUpMonthlyRecapStrip() reads monthly_recap_preview_state only inside if (BuildConfig.DEBUG). In release builds the strip state comes from MonthlyRecapStripViewModel.stripState. The comment states that release builds use this value and always render HIDDEN. That statement is wrong and can hide a rollout gap.
📝 Proposed comment fix
- Release builds use THIS value and therefore always render the strip HIDDEN
- until the real eligibility source is implemented in a later Phase. Debug builds
- override this via app/src/debug/res/values/monthly_recap_debug.xml.
+ Debug builds read this value (overridden in
+ app/src/debug/res/values/monthly_recap_debug.xml) to force a preview state.
+ Release builds ignore this value: the strip state comes from
+ MonthlyRecapStripViewModel, which fails closed to HIDDEN until the real
+ eligibility source is implemented in a later Phase.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <!-- | |
| Monthly Recap strip preview state (main = release-safe default). | |
| Release builds use THIS value and therefore always render the strip HIDDEN | |
| until the real eligibility source is implemented in a later Phase. Debug builds | |
| override this via app/src/debug/res/values/monthly_recap_debug.xml. | |
| Valid tokens: hidden | ready | resume | replay | |
| (see MonthlyRecapStripState.fromToken — anything unknown is treated as hidden). | |
| --> | |
| <string name="monthly_recap_preview_state" translatable="false">hidden</string> | |
| <!-- | |
| Monthly Recap strip preview state (main = release-safe default). | |
| Debug builds read this value (overridden in | |
| app/src/debug/res/values/monthly_recap_debug.xml) to force a preview state. | |
| Release builds ignore this value: the strip state comes from | |
| MonthlyRecapStripViewModel, which fails closed to HIDDEN until the real | |
| eligibility source is implemented in a later Phase. | |
| Valid tokens: hidden | ready | resume | replay | |
| (see MonthlyRecapStripState.fromToken — anything unknown is treated as hidden). | |
| --> | |
| <string name="monthly_recap_preview_state" translatable="false">hidden</string> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/src/main/res/values/monthly_recap_debug.xml` around lines 3 - 13, Update
the documentation comment above monthly_recap_preview_state to state that this
preview resource is read only in debug builds; release builds obtain the strip
state from MonthlyRecapStripViewModel.stripState. Remove the claim that release
builds use this value or always render the strip hidden, while preserving the
valid token guidance.
| @Test | ||
| fun `corrupted progress is coerced into safe bounds`() { | ||
| assertEquals(0, cache(progressScene = -4).safeProgressScene()) | ||
| assertEquals(3, cache(progressScene = 3, totalScenes = 10).safeProgressScene()) | ||
| assertEquals(10, cache(progressScene = 99, totalScenes = 10).safeProgressScene()) | ||
| // Unknown total: only the lower bound applies. | ||
| assertEquals(99, cache(progressScene = 99, totalScenes = null).safeProgressScene()) | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Inspect the clamp implementation and every consumer of progressScene.
fd 'MonthlyRecapCache.kt' -t f --exec rg -n -C6 'safeProgressScene|progressScene|totalScenes' {}
rg -n 'safeProgressScene|updateSafeProgress|progressScene' --type kotlin -g '!**/test/**'Repository: PSMRI/FLW-Mobile-App
Length of output: 1228
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Find MonthlyRecapCache-related files:"
fd 'MonthlyRecapCache' -t f
echo
echo "Inspect MonthlyRecapCache file outlines:"
for f in $(fd 'MonthlyRecapCache' -t f); do
echo "--- $f"
ast-grep outline "$f" --view compact || true
echo "--- relevant sections"
sed -n '1,180p' "$f" | cat -n
done
echo
echo "Production consumers:"
rg -n -C4 'safeProgressScene|updateSafeProgress|progressScene' --type kotlin -g '!**/test/**' || true
echo
echo "Test files:"
fd 'MonthlyRecap.*Test.kt|MonthlyRecapCacheTest.kt' -t f
for f in $(fd 'MonthlyRecap.*Test.kt|MonthlyRecapCacheTest.kt' -t f); do
echo "--- $f"
ast-grep outline "$f" --view compact || true
sed -n '1,220p' "$f" | cat -n
doneRepository: PSMRI/FLW-Mobile-App
Length of output: 7713
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Diff stat and MonthlyRecapCache diff context:"
git diff --stat || true
git diff -- app/src/main/java/org/piramalswasthya/sakhi/model/MonthlyRecapCache.kt app/src/test/java/org/piramalswasthya/sakhi/model/MonthlyRecapCacheTest.kt || true
echo
echo "All repository references to MonthlyRecapCache and safeProgressScene:"
rg -n 'MonthlyRecapCache|safeProgressScene|progressScene' . || true
echo
echo "Behavioral probe of current clamp inputs:"
python3 - <<'PY'
import sys
values = [(-4, None), (3, 10), (99, 10), (99, None)]
for progress_scene, total_scenes in values:
upper = total_scenes if (total_scenes is not None and total_scenes > 0) else None
coerced = progress_scene if progress_scene >= 0 else 0
result = coerced if upper is None else min(coerced, upper)
print(f"progressScene={progress_scene}, totalScenes={total_scenes} -> safeProgressScene={result}")
PYRepository: PSMRI/FLW-Mobile-App
Length of output: 8501
Clamp progressScene to the last valid scene index.
progressScene is documented as the last completed scene index, and MonthlyRecapPlaybackViewModel resumes from that value for the scene index. For a 10-scene recap, the valid index range is 0..9; this should coerce 99 to 9 when totalScenes = 10, so update both the clamp and the test.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/src/test/java/org/piramalswasthya/sakhi/model/MonthlyRecapCacheTest.kt`
around lines 45 - 52, Update MonthlyRecapCache.safeProgressScene() to clamp
progressScene to totalScenes - 1 when totalScenes is known, preserving the
lower-bound clamp and unknown-total behavior. Adjust the corrupted progress test
to expect 9 for progressScene 99 with totalScenes 10.
| /** 1 July 2026 UTC — after the June window, so the install missed part of the month. */ | ||
| private const val JULY_2026_MILLIS = 1_782_000_000_000L |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
JULY_2026_MILLIS does not hold 1 July 2026.
1_782_000_000_000L is approximately 21 June 2026 UTC, not 1 July 2026. 1 July 2026 UTC is 1_782_864_000_000L. The tests still pass because the value is after the 1 June window start, so DEVICE_MISSED_PART_OF_MONTH still fires. The name and the comment are wrong, and the constant no longer proves the "install after the whole recap month" case.
🐛 Proposed fix
/** 1 July 2026 UTC — after the June window, so the install missed part of the month. */
-private const val JULY_2026_MILLIS = 1_782_000_000_000L
+private const val JULY_2026_MILLIS = 1_782_864_000_000L📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| /** 1 July 2026 UTC — after the June window, so the install missed part of the month. */ | |
| private const val JULY_2026_MILLIS = 1_782_000_000_000L | |
| /** 1 July 2026 UTC — after the June window, so the install missed part of the month. */ | |
| private const val JULY_2026_MILLIS = 1_782_864_000_000L |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt`
around lines 36 - 37, Correct JULY_2026_MILLIS to the UTC epoch value for 1 July
2026, 1_782_864_000_000L, so its name and comment match the test scenario.
Ensure the associated test uses this value to represent installation after the
complete June recap window.
…ication Completes the recap's production flow. Before this, a release build could never show the recap (availability failed closed with no way to open it), nothing froze the monthly snapshot on a schedule, and nothing told the ASHA her recap was ready — the strip only appeared if she happened to open the app during days 1-7 and noticed it. Rollout gate - GamificationConfigProvider: one shared Firebase Remote Config provider for every gamification mechanic. gamification_master_enabled (kill switch) + one boolean key per mechanic + a shared pilot allowlist of user ids. A mechanic is on only when master AND its own key are true AND the allowlist is empty or contains the logged-in user. - Keys for badges/notifications/consistency dashboard are reserved now so later mechanics need no new provider plumbing, only their own gate call. - Every default in remote_config_defaults.xml is false/empty, so an unfetched or failed config shows nothing rather than guessing. Corrupt values and a malformed allowlist also fail closed. - LocalMonthlyRecapAvailability now reads the real gate in release instead of returning all-unknown forever. Debug behaviour is unchanged. Snapshot scheduler and notification - MonthlyRecapReminderWorker: daily worker, scheduled at app startup. Inside the day 1-7 window it freezes the month's snapshot via the repo's existing idempotent getOrCreateCurrentRecap(), then posts one local notification inviting her to watch it. - RecapNotificationState dedupes on (userId, yearMonth) so she is invited once per recap month, and a second ASHA on a shared device never receives the first one's reminder. - Recap gets its own notification channel, separate from sync noise, so she can manage it independently. Strings in en/hi/as/bn. - Worker no-ops silently when gated off, logged out, or outside the window, and swallows failures: gamification must never surface an error or retry-storm on top of clinical work. On-device only, no server calls, no clinical table writes.
|



Adds an on-device Monthly Recap that celebrates an ASHA’s verified work from the previous month through personalised Hindi/Assamese stories. It uses read-only Room queries, freezes results for consistent replay, and remains hidden in release builds until rollout controls are added. Includes an additive database migration and automated tests.
Summary by CodeRabbit
New Features
Tests