Skip to content

feat(monthly-recap): Monthly Recap module — metrics engine, personalization, playback and dashboard card - #574

Open
vaibhav45sktech wants to merge 17 commits into
PSMRI:feature/gamificationfrom
vaibhav45sktech:feature/monthly-recap-personalization
Open

feat(monthly-recap): Monthly Recap module — metrics engine, personalization, playback and dashboard card#574
vaibhav45sktech wants to merge 17 commits into
PSMRI:feature/gamificationfrom
vaibhav45sktech:feature/monthly-recap-personalization

Conversation

@vaibhav45sktech

@vaibhav45sktech vaibhav45sktech commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

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

    • Added a Monthly Recap experience on the home screen, available in Hindi and Assamese.
    • View personalized summaries of activity from the previous month through animated story playback.
    • Resume, replay, pause, navigate, mute music, or close recap stories at any time.
    • Added accessibility support, reduced-motion behavior, progress tracking, and localized controls.
    • Recap content remains privacy-safe and excludes personal names and health details.
  • Tests

    • Added comprehensive coverage for recap availability, calculations, content validation, playback, persistence, and date boundaries.

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9fe166a7-0f57-4835-b705-7b662566a1ab

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added 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.

Changes

Monthly Recap

Layer / File(s) Summary
Recap contracts and persistence
app/src/main/java/org/piramalswasthya/sakhi/model/*, database/room/*, helpers/RecapClock.kt, helpers/MonthlyRecapAvailability.kt, helpers/MonthlyRecapDataReadiness.kt, di/AppModule.kt
Added recap models, Room storage and migration, calendar windows, availability gates, readiness rules, preferences, and dependency providers.
Activity metrics and snapshot repository
app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/*, repositories/*RecapDataSource.kt, MonthlyRecapMetricsCalculator.kt, MonthlyRecapRepo.kt, app/src/androidTest/*, app/src/test/*
Added activity count queries, IO data sources, metric aggregation, snapshot lifecycle handling, metric freezing, and database-backed tests.
Content validation and scene composition
app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt, RecapSceneComposer.kt, RecapStoryGate.kt, model/RecapContent.kt, app/src/main/res/raw/recap_content.json, app/src/main/res/raw/recap_*.json
Added strict content validation, Hindi and Assamese content, Lottie assets, deterministic scene generation, language fallback, and related tests.
Dashboard strip and playback
app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/*, app/src/main/res/layout/*, navigation/nav_home.xml, values/*, drawable/*, app/src/test/java/.../MonthlyRecap*Test.kt
Added the home strip, navigation destination, animated playback, progress restoration, gestures, music controls, accessibility behavior, localized resources, and UI tests.

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
Loading

Possibly related PRs

Suggested reviewers: ritik-bizbrolly, ishwarchouhan07

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the Monthly Recap module and its main metrics, personalization, playback, and dashboard-card changes.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@vaibhav45sktech

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 value

Extra band ids in a category are accepted.

missingBands only 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 win

Reference the saved-state key from production code instead of repeating the literal.

The literal "recap_playback_scene_index" appears three times in this test. If MonthlyRecapPlaybackViewModel renames 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 win

Pin the time zone so the calendar assertions stay deterministic.

cal() uses Calendar.getInstance(), which uses the JVM default time zone. The CI machine may use a zone with a DST transition. The day count in leap-year february window spans 29 days uses 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 previousMonthWindow uses Calendar.getInstance() internally, also set the default zone in a @Before method 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 value

Align the KDoc with the actual clamp values.

The comment states "~8s for a short welcome", but MIN_SCENE_MS is 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 matches BASE_READ_MS, PER_WORD_MS, MIN_SCENE_MS, and MAX_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 value

Remove the unused Monthly Recap screen description strings.

monthly_recap_lang_screen_cd only appears in app/src/main/res/values/strings.xml, values-hi/strings.xml, and values-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 value

Reuse a single RecapSceneComposer and avoid the second snapshot read.

buildPersonalizedScenes builds a new composer on every call and reads the snapshot again through getOrCreateCurrentRecap(). 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 value

This 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 value

Consider 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 takes categoryId, activityId, unit, and count removes 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 win

Extract the duplicated insertMinimalRow and dummyForType test 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 RecapDaoTestFixtures file 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 local insertMinimalRow and dummyForType and call the shared helper with support.
  • 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

📥 Commits

Reviewing files that changed from the base of the PR and between 9297a67 and c279f12.

⛔ Files ignored due to path filters (2)
  • app/src/main/res/drawable-nodpi/img_recap_character.png is excluded by !**/*.png
  • app/src/main/res/raw/recap_bg_music.mp3 is excluded by !**/*.mp3
📒 Files selected for processing (89)
  • app/build.gradle
  • app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/CbacDaoMonthlyRecapTest.kt
  • app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/EligibleCoupleRecapDaoTest.kt
  • app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/ImmunizationRecapDaoTest.kt
  • app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/MaternalHealthRecapDaoTest.kt
  • app/src/androidTest/java/org/piramalswasthya/sakhi/database/room/dao/RegistrationRecapDaoTest.kt
  • app/src/debug/res/values/monthly_recap_debug.xml
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/InAppDb.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/BenDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/CbacDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/EcrDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/HouseholdDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/ImmunizationDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/MaternalHealthDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/room/dao/MonthlyRecapDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/database/shared_preferences/PreferenceDao.kt
  • app/src/main/java/org/piramalswasthya/sakhi/di/AppModule.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapAvailability.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapDataReadiness.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapMetricsCodec.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapClock.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapContentCodec.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposer.kt
  • app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapStoryGate.kt
  • app/src/main/java/org/piramalswasthya/sakhi/model/MonthlyRecapCache.kt
  • app/src/main/java/org/piramalswasthya/sakhi/model/MonthlyRecapMetrics.kt
  • app/src/main/java/org/piramalswasthya/sakhi/model/RecapContent.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/BeneficiaryRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/CbacRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/EligibleCoupleRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/HouseholdRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/ImmunizationRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRecapDataSource.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapMetricsCalculator.kt
  • app/src/main/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepo.kt
  • app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/HomeIconsFragment.kt
  • app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStrip.kt
  • app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStripViewModel.kt
  • 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/MonthlyRecapPlaybackViewModel.kt
  • app/src/main/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/RecapMusicController.kt
  • app/src/main/res/drawable/bg_monthly_recap_strip.xml
  • app/src/main/res/drawable/bg_recap_badge.xml
  • app/src/main/res/drawable/bg_recap_badge_new.xml
  • app/src/main/res/drawable/bg_recap_playback.xml
  • app/src/main/res/drawable/ic_recap_close.xml
  • app/src/main/res/drawable/ic_recap_music_off.xml
  • app/src/main/res/drawable/ic_recap_music_on.xml
  • app/src/main/res/drawable/ic_recap_next.xml
  • app/src/main/res/drawable/ic_recap_pause.xml
  • app/src/main/res/drawable/ic_recap_play.xml
  • app/src/main/res/drawable/ic_recap_prev.xml
  • app/src/main/res/drawable/recap_bubble_tail.xml
  • app/src/main/res/layout/fragment_monthly_recap_playback.xml
  • app/src/main/res/layout/monthly_recap_strip.xml
  • app/src/main/res/layout/rv_icon_grid.xml
  • app/src/main/res/navigation/nav_home.xml
  • app/src/main/res/raw/recap_content.json
  • app/src/main/res/raw/recap_didi_dashboard.json
  • app/src/main/res/raw/recap_didi_welcome.json
  • app/src/main/res/raw/recap_girl_1.json
  • app/src/main/res/raw/recap_girl_2.json
  • app/src/main/res/raw/recap_girl_3.json
  • app/src/main/res/raw/recap_girl_4.json
  • app/src/main/res/raw/recap_girl_5.json
  • app/src/main/res/raw/recap_girl_6.json
  • app/src/main/res/raw/recap_girl_7.json
  • app/src/main/res/raw/recap_girl_8.json
  • app/src/main/res/values-as/strings.xml
  • app/src/main/res/values-hi/strings.xml
  • app/src/main/res/values/colors.xml
  • app/src/main/res/values/monthly_recap_debug.xml
  • app/src/main/res/values/strings.xml
  • app/src/test/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapDataReadinessTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/helpers/MonthlyRecapMetricsCodecTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapClockTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapContentCodecTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposerTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/model/MonthlyRecapCacheTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/AshaProfileRepoTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/BeneficiaryRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/CbacRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/EligibleCoupleRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/HouseholdRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/ImmunizationRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/MaternalHealthRecapDataSourceTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/repositories/MonthlyRecapRepoTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/home/MonthlyRecapStripTest.kt
  • app/src/test/java/org/piramalswasthya/sakhi/ui/home_activity/monthly_recap/MonthlyRecapPlaybackViewModelTest.kt

Comment thread app/src/main/java/org/piramalswasthya/sakhi/helpers/RecapSceneComposer.kt Outdated
Comment thread app/src/main/java/org/piramalswasthya/sakhi/model/RecapContent.kt
Comment on lines +81 to +96
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()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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:


🏁 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" || true

Repository: 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" || true

Repository: 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.

Comment on lines +121 to +127
<!-- 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" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment thread app/src/main/res/raw/recap_girl_3.json Outdated
@@ -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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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 || true

Repository: 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:


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>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
<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.

Comment on lines +3 to +13
<!--
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>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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.

Suggested change
<!--
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.

Comment on lines +45 to +52
@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())
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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
done

Repository: 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}")
PY

Repository: 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.

Comment on lines +36 to +37
/** 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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
/** 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.
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant