diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml
index 8601af45..c00a6bba 100644
--- a/.github/workflows/android_cd.yml
+++ b/.github/workflows/android_cd.yml
@@ -45,50 +45,72 @@ jobs:
- name: Install Firebase CLI
run: curl -sL https://firebase.tools | bash
- # 6. Decode google-services.json
- - name: Decode google-services.json
+ # 6. Decode google-services.json for debug
+ - name: Decode google-services.json (debug)
env:
- FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }}
+ FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }}
+ run: |
+ mkdir -p app/src/dev
+ echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json
+
+ # 7. Decode google-services.json for release
+ - name: Decode google-services.json (release)
+ env:
+ FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }}
run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json
- # 7. local.properties
- - name: Add local.properties
+ # 8. Add Local Properties
+ - name: Add Local Properties
env:
BASE_URL: ${{ secrets.BASE_URL }}
+ AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }}
+ ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }}
+ ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }}
+ ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }}
+ ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }}
run: |
- echo "base.url=\"$BASE_URL\"" >> app/local.properties
-
- # 8. Ktlint
+ echo -e "baseUrl=$BASE_URL" > local.properties
+ echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties
+ echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties
+ echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties
+ echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties
+ echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties
+
+ # 9. Debug Local Properties Check
+ - name: Debug Local Properties
+ run: cat local.properties
+
+ # 10. Ktlint
- name: Run Ktlint Check
run: ./gradlew ktlintCheck --stacktrace
- # 9. Debug APK Build
+ # 11. Debug APK Build
- name: Build Debug APK
run: ./gradlew assembleDebug --stacktrace
- # 10. Release AAB Build
+ # 12. Release AAB Build
- name: Build Release AAB
run: ./gradlew bundleRelease --stacktrace
- # 11. Release APK Build
+ # 13. Release APK Build
- name: Build Release APK
run: ./gradlew assembleRelease --stacktrace
- # 12. AAB Artifact Upload
+ # 14. AAB Artifact Upload
- name: Upload Release AAB
uses: actions/upload-artifact@v4
with:
name: release-aab
path: app/build/outputs/bundle/release/app-release.aab
- # 13. APK Artifact Upload
+ # 15. APK Artifact Upload
- name: Upload Release APK
uses: actions/upload-artifact@v4
with:
name: release-apk
path: app/build/outputs/apk/release/app-release.apk
- # 14. Set up Firebase Service Account Credentials
+ # 16. Set up Firebase Service Account Credentials
- name: Set up Firebase Service Account Credentials
env:
GOOGLE_APPLICATION_CREDENTIALS_JSON: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_JSON }}
@@ -99,7 +121,7 @@ jobs:
export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json
echo "GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS"
- # 15. Firebase CLI 인증 확인
+ # 17. Firebase CLI 인증 확인
- name: Check Firebase CLI Authentication
run: |
export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json
@@ -111,7 +133,7 @@ jobs:
echo "📌 현재 Firebase 프로젝트 목록 확인:"
firebase projects:list || (echo "❌ Firebase 인증 실패!"; exit 1)
- # 16. Firebase App Distribution Upload
+ # 18. Firebase App Distribution Upload
- name: Upload APK to Firebase App Distribution
env:
GOOGLE_APPLICATION_CREDENTIALS: $HOME/firebase-credentials.json
@@ -134,7 +156,7 @@ jobs:
--release-notes "🚀 새로운 데모 버전이 배포되었습니다!" \
--groups "orbit-tester-group"
- # 17. Notify Discord
+ # 19. Notify Discord
- name: Notify Discord
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml
index 89bba90a..b8974a0d 100644
--- a/.github/workflows/android_ci.yml
+++ b/.github/workflows/android_ci.yml
@@ -14,7 +14,7 @@ jobs:
steps:
# Gradle Cache
- name: Cache Gradle packages
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: |
~/.gradle/caches
@@ -42,21 +42,40 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- # Decode google-services.json
- - name: Decode google-services.json
+ # Decode google-services.json for debug
+ - name: Decode google-services.json (debug)
env:
- FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }}
- run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json
+ FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }}
+ run: |
+ mkdir -p app/src/dev
+ echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json
- # Debug google-services.json
- - name: Debug google-services.json
- run: cat app/google-services.json
+ # Decode google-services.json for release
+ - name: Decode google-services.json (release)
+ env:
+ FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }}
+ run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json
# Add Local Properties
- name: Add Local Properties
env:
- BASE_URL: ${{ secrets.BASE_URL }}
- run: echo "baseUrl=$BASE_URL" >> local.properties
+ BASE_URL: ${{ secrets.BASE_URL }}
+ AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }}
+ ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }}
+ ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }}
+ ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }}
+ ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }}
+ run: |
+ echo -e "baseUrl=$BASE_URL" > local.properties
+ echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties
+ echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties
+ echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties
+ echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties
+ echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties
+
+ # Debug Local Properties Check
+ - name: Debug Local Properties
+ run: cat local.properties
# Run Lint and Build
- name: Run lint and build
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..eb422992
--- /dev/null
+++ b/README.md
@@ -0,0 +1,70 @@
+# 아침을 깨우는 새로운 알람!
+
+
+
+
+
+
+
+## 🚀 핵심 기능
+
+### 메인 화면
+
+https://github.com/user-attachments/assets/d41dbd9c-5fba-4ca2-aad5-6d6211a36108
+
+- **알람 삭제**: 편집 모드로 전환하여 선택한 알람을 삭제하거나, 길게 눌러 개별 알람을 삭제할 수 있습니다.
+- **알람 정렬 순서 변경**: 정렬 옵션을 변경하여 활성화된 알람을 우선적으로 표시할 수 있습니다.
+
+### 알람 설정/수정
+
+https://github.com/user-attachments/assets/0f8083f5-3aba-439a-a124-2c6ffc81fde4
+
+- **시간 설정**: 원하는 시간에 알람이 울리도록 설정할 수 있습니다.
+- **반복 요일 설정**: 특정 요일에 반복되는 알람을 설정할 수 있으며, 공휴일에만 알람이 울리지 않도록 설정할 수도 있습니다.
+- **알람 미루기 설정**: 알람 미루기 기능을 활성화하고, 몇 분 간격으로 몇 회까지 미룰 수 있는지 설정할 수 있습니다.
+- **사운드 설정**: 진동, 소리 여부 및 음량을 조절할 수 있습니다.
+
+### 알람 끄기 - 미션
+
+https://github.com/user-attachments/assets/3c1596e9-7cdc-4c8e-8327-aefedf48ffd5
+
+- **알람 끄기**: 울리는 알람을 끌 수 있습니다.
+- **알람 미루기**: 설정한 미루기 옵션에 따라 알람을 일정 시간 뒤로 미룰 수 있습니다.
+- **미션 수행**: 당일 첫 알람 해제 시 미션을 수행하여 알람을 끌 수 있습니다.
+
+### 운세
+
+
+
+- **행운의 편지**: 사용자에게 오늘의 종합 운세가 담긴 편지를 제공합니다.
+- **세부 운세**: 학업/직장운, 재물운, 건강운, 애정운 등의 운세 정보를 제공합니다.
+- **부적 제공**: 당일 첫 알람 해제 시 미션을 수행하면, 랜덤한 부적을 받을 수 있습니다.
+
+
+
+## 👨👦👦 팀원
+
+|
|
|
+|:-:|:-:|
+|Donghyeon Kim
[@DongChyeon](https://github.com/DongChyeon)|Moonsu Kang
[@MoonsuKang](https://github.com/MoonsuKang)|
+
+
+
+## 🛠️ 기술 스택
+
+| 카테고리 | 스택 |
+| --- | --- |
+| Language | Kotlin |
+| Architecture | Orbit-MVI |
+| DI | Hilt |
+| Networking | Retrofit, OkHttp, GSON |
+| Asynchronous | Coroutine, Flow |
+| JetPack | AAC, ViewModel, Navigation, Repository |
+| Local DB | DataStore, Room |
+| Image | Coil |
+
+
+
+## 📊 모듈 의존성 그래프
+
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2c391bf4..4acc31ae 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -3,18 +3,24 @@ plugins {
id("orbit.android.compose")
alias(libs.plugins.google.service)
alias(libs.plugins.firebase.app.distribution)
+ alias(libs.plugins.firebase.crashlytics)
}
android {
namespace = "com.yapp.orbit"
defaultConfig {
- versionCode = 1
- versionName = "0.0.2"
+ versionCode = 5
+ versionName = "1.0.3"
targetSdk = 34
}
buildTypes {
+ debug {
+ applicationIdSuffix = ".dev"
+ isDebuggable = true
+ }
+
release {
signingConfig = signingConfigs.getByName("debug")
}
@@ -38,4 +44,7 @@ dependencies {
implementation(projects.feature.mission)
implementation(projects.feature.setting)
implementation(projects.feature.navigator)
+ implementation(libs.firebase.analytics)
+ implementation(libs.firebase.crashlytics)
+ implementation(libs.play.services.ads)
}
diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml
new file mode 100644
index 00000000..1ccceb99
--- /dev/null
+++ b/app/src/debug/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ 오르비 알람 DEV
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3bdddf10..51ec3303 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,7 @@
+
@@ -24,6 +25,10 @@
android:usesCleartextTraffic="true"
tools:targetApi="31">
+
+
.addBuildConfigFields(project: Project) {
val baseUrl = project.getLocalProperty("baseUrl", "https://default.example.com")
- val isDebug = project.providers.gradleProperty("isDebug").orNull?.toBoolean() ?: false
+ val amplitudeApikey = project.getLocalProperty("amplitudeApiKey", "")
buildTypes {
getByName("debug") {
buildConfigField("String", "BASE_URL", "\"$baseUrl\"")
- buildConfigField("boolean", "DEBUG", isDebug.toString())
+ buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"")
+ buildConfigField("boolean", "DEBUG", "true")
}
getByName("release") {
buildConfigField("String", "BASE_URL", "\"$baseUrl\"")
+ buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"")
buildConfigField("boolean", "DEBUG", "false")
}
}
}
+internal fun CommonExtension<*, *, *, *, *, *>.addResValues(project: Project) {
+ val admobAppIdDebug = project.getLocalProperty("admobAppIdDebug", "")
+ val admobAppIdRelease = project.getLocalProperty("admobAppIdRelease", "")
+ val admobAdUnitIdDebug = project.getLocalProperty("admobAdUnitIdDebug", "")
+ val admobAdUnitIdRelease = project.getLocalProperty("admobAdUnitIdRelease", "")
+
+ buildTypes {
+ getByName("debug") {
+ resValue("string", "admob_app_id", admobAppIdDebug)
+ resValue("string", "admob_ad_unit_id", admobAdUnitIdDebug)
+ }
+ getByName("release") {
+ resValue("string", "admob_app_id", admobAppIdRelease)
+ resValue("string", "admob_ad_unit_id", admobAdUnitIdRelease)
+ }
+ }
+}
+
internal fun Project.getLocalProperty(key: String, defaultValue: String? = null): String {
val propertiesFile = rootProject.file("local.properties")
if (propertiesFile.exists()) {
diff --git a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt
index 8a658a2d..b842ac37 100644
--- a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt
+++ b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt
@@ -41,6 +41,7 @@ internal fun Project.configureKotlinAndroid() {
}
addBuildConfigFields(project)
+ addResValues(project)
}
configureKotlin()
diff --git a/build.gradle.kts b/build.gradle.kts
index 693d3170..46e42947 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -11,6 +11,7 @@ plugins {
alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.google.service) apply false
alias(libs.plugins.firebase.app.distribution) apply false
+ alias(libs.plugins.firebase.crashlytics) apply false
// alias(libs.plugins.sentry) apply false
}
diff --git a/core/alarm/build.gradle.kts b/core/alarm/build.gradle.kts
index 0bce88ba..0747052e 100644
--- a/core/alarm/build.gradle.kts
+++ b/core/alarm/build.gradle.kts
@@ -10,6 +10,7 @@ android {
}
dependencies {
+ implementation(projects.core.analytics)
implementation(projects.core.datastore)
implementation(projects.core.designsystem)
implementation(projects.core.media)
diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt
index 3a1e95fb..67d359f1 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt
@@ -9,7 +9,19 @@ object AlarmConstants {
const val EXTRA_NOTIFICATION_ID = "com.yapp.orbit.EXTRA_NOTIFICATION_ID"
const val EXTRA_ALARM = "com.yapp.orbit.EXTRA_ALARM"
+ const val EXTRA_ALARM_DAY = "com.yapp.orbit.EXTRA_ALARM_DAY"
const val EXTRA_IS_SNOOZED = "com.yapp.orbit.EXTRA_IS_SNOOZED"
const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS"
+
+ const val SNOOZE_ID_OFFSET = 10000
+
+ const val WEEK_INTERVAL_MILLIS: Long = 7 * 24 * 60 * 60 * 1000
+
+ val HOLIDAYS_2025 = setOf(
+ "2025-01-01", "2025-01-27", "2025-01-28", "2025-01-29", "2025-01-30",
+ "2025-03-01", "2025-03-03", "2025-05-05", "2025-05-06", "2025-06-06",
+ "2025-08-15", "2025-10-03", "2025-10-05", "2025-10-06", "2025-10-07",
+ "2025-10-08", "2025-10-09", "2025-12-25",
+ )
}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt
index b79d722e..4823278e 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt
@@ -2,17 +2,17 @@ package com.yapp.alarm
import android.app.AlarmManager
import android.app.Application
-import android.content.Intent
import android.util.Log
import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForSchedule
import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForUnSchedule
-import com.yapp.alarm.services.AlarmService
import com.yapp.domain.model.Alarm
import com.yapp.domain.model.AlarmDay
import com.yapp.domain.model.toAlarmDays
import com.yapp.domain.model.toDayOfWeek
+import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
+import java.time.format.DateTimeFormatter
import javax.inject.Inject
class AlarmHelper @Inject constructor(
@@ -31,6 +31,21 @@ class AlarmHelper @Inject constructor(
}
}
+ fun scheduleWeeklyAlarm(alarm: Alarm, day: AlarmDay) {
+ val initialTriggerMillis = getNextAlarmTimeMillis(alarm, day) + AlarmConstants.WEEK_INTERVAL_MILLIS
+ val triggerMillis = findNextNonHolidayDate(initialTriggerMillis)
+
+ val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day)
+
+ alarmManager.setExactAndAllowWhileIdle(
+ AlarmManager.RTC_WAKEUP,
+ triggerMillis,
+ pendingIntent,
+ )
+
+ Log.d("AlarmHelper", "Scheduled weekly alarm for $day at: $triggerMillis")
+ }
+
fun unScheduleAlarm(alarm: Alarm) {
val selectedDays = alarm.repeatDays.toAlarmDays()
@@ -53,8 +68,11 @@ class AlarmHelper @Inject constructor(
}
}
- fun stopAlarm() {
- app.stopService(Intent(app, AlarmService::class.java))
+ fun cancelSnoozedAlarm(alarmId: Long) {
+ val snoozedAlarmId = alarmId + AlarmConstants.SNOOZE_ID_OFFSET
+ val pendingIntent = createAlarmReceiverPendingIntentForUnSchedule(app, Alarm(id = snoozedAlarmId))
+ alarmManager.cancel(pendingIntent)
+ Log.d("AlarmHelper", "Canceled snoozed alarm with id: $snoozedAlarmId")
}
private fun setRepeatingAlarm(day: AlarmDay, alarm: Alarm) {
@@ -62,7 +80,7 @@ class AlarmHelper @Inject constructor(
createAlarmReceiverPendingIntentForSchedule(app, alarm, day)
val firstAlarmTriggerMillis = getNextAlarmTimeMillis(alarm, day)
- Log.d("AlarmHelper", "Setting repeating alarm at: $firstAlarmTriggerMillis")
+ Log.d("AlarmHelper", "Setting repeating alarm id: ${alarm.id} at: $firstAlarmTriggerMillis")
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
@@ -114,4 +132,25 @@ class AlarmHelper @Inject constructor(
return epochMillis
}
+
+ private fun findNextNonHolidayDate(initialMillis: Long): Long {
+ val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
+
+ var adjustedMillis = initialMillis
+
+ while (true) {
+ val localDate = Instant.ofEpochMilli(adjustedMillis)
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate()
+
+ val dateString = localDate.format(dateFormatter)
+
+ if (!AlarmConstants.HOLIDAYS_2025.contains(dateString)) {
+ return adjustedMillis // 공휴일이 아니라면 해당 날짜 반환
+ }
+
+ // 공휴일이라면 다음 1주 뒤로 이동
+ adjustedMillis += AlarmConstants.WEEK_INTERVAL_MILLIS
+ }
+ }
}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt
index 0511f673..cdb80e2c 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt
@@ -12,6 +12,7 @@ fun createAlarmAlertPendingIntent(
alarm: Alarm,
): PendingIntent {
val alarmAlertIntent = createAlarmAlertIntent(
+ context,
alarm.id,
alarm,
)
@@ -24,6 +25,7 @@ fun createAlarmAlertPendingIntent(
}
private fun createAlarmAlertIntent(
+ context: Context,
notificationId: Long,
alarm: Alarm,
): Intent {
@@ -31,5 +33,6 @@ private fun createAlarmAlertIntent(
putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId)
putExtra(AlarmConstants.EXTRA_ALARM, alarm)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
+ setPackage(context.packageName)
}
}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt
index c68f575d..3bd687df 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt
@@ -5,6 +5,7 @@ import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.content.Context
import android.content.Intent
+import androidx.core.net.toUri
import com.yapp.alarm.AlarmConstants
import com.yapp.alarm.receivers.AlarmReceiver
@@ -30,3 +31,26 @@ fun createAlarmDismissIntent(
putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId)
}
}
+
+fun createNavigateToMissionPendingIntent(
+ applicationContext: Context,
+ notificationId: Long,
+): PendingIntent {
+ val navigateToMissionIntent = createNavigateToMissionIntent(applicationContext, notificationId)
+ return PendingIntent.getActivity(
+ applicationContext,
+ notificationId.toInt(),
+ navigateToMissionIntent,
+ FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE,
+ )
+}
+
+fun createNavigateToMissionIntent(
+ context: Context,
+ notificationId: Long,
+): Intent {
+ return Intent(Intent.ACTION_VIEW, "orbitapp://mission?notificationId=$notificationId".toUri()).apply {
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+ setPackage(context.packageName)
+ }
+}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt
index 2e8967ca..517eedbd 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt
@@ -13,10 +13,7 @@ fun createAlarmReceiverPendingIntentForSchedule(
alarm: Alarm,
day: AlarmDay? = null,
): PendingIntent {
- val alarmReceiverIntent = createAlarmReceiverIntent(
- app,
- alarm,
- )
+ val alarmReceiverIntent = createAlarmReceiverIntent(app, alarm, day)
return PendingIntent.getBroadcast(
app,
generateAlarmIntentId(alarm.id.toInt(), day),
@@ -28,15 +25,17 @@ fun createAlarmReceiverPendingIntentForSchedule(
private fun createAlarmReceiverIntent(
app: Application,
alarm: Alarm,
+ day: AlarmDay? = null,
): Intent {
return Intent(AlarmConstants.ACTION_ALARM_TRIGGERED).apply {
setClass(app, AlarmReceiver::class.java)
putExtra(AlarmConstants.EXTRA_ALARM, alarm)
+ day?.let { putExtra(AlarmConstants.EXTRA_ALARM_DAY, it.name) }
}
}
fun generateAlarmIntentId(id: Int, day: AlarmDay?): Int {
return day?.let {
- (id * 10) + it.ordinal + 1
+ (id * 10) + ((day.ordinal + 6) % 7) + 1
} ?: id
}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt
index 88f7d9fd..4b703bf9 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt
@@ -3,9 +3,8 @@ package com.yapp.alarm.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
-import android.net.Uri
-import android.util.Log
import androidx.activity.ComponentActivity
+import androidx.core.net.toUri
import com.yapp.alarm.AlarmConstants
import com.yapp.datastore.UserPreferences
import dagger.hilt.android.AndroidEntryPoint
@@ -24,7 +23,6 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity)
lateinit var userPreferences: UserPreferences
override fun onReceive(context: Context?, intent: Intent?) {
- Log.d("AlarmInteractionActivityReceiver", "알람 수신, AlarmAlertActivity 종료")
val isSnoozed = intent?.getBooleanExtra(AlarmConstants.EXTRA_IS_SNOOZED, false) ?: false
if (intent?.action == AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE) {
@@ -35,13 +33,12 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity)
val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull()
val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
- Log.d("AlarmReceiver", "fortuneDate: $fortuneDate, todayDate: $todayDate")
-
if (fortuneDate != todayDate) {
context?.let {
val missionIntent =
- Intent(Intent.ACTION_VIEW, Uri.parse("orbitapp://mission")).apply {
+ Intent(Intent.ACTION_VIEW, "orbitapp://mission".toUri()).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ setPackage(context.packageName)
}
it.startActivity(missionIntent)
}
diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt
index b7a3c68a..2e97ee68 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt
@@ -5,20 +5,40 @@ import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
+import android.widget.Toast
import com.yapp.alarm.AlarmConstants
import com.yapp.alarm.AlarmHelper
import com.yapp.alarm.services.AlarmService
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.AnalyticsHelper
+import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
+import com.yapp.domain.model.toTimeString
+import com.yapp.domain.usecase.AlarmUseCase
import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.firstOrNull
+import kotlinx.coroutines.launch
import java.time.LocalDateTime
import javax.inject.Inject
@AndroidEntryPoint
class AlarmReceiver : BroadcastReceiver() {
+ @Inject
+ lateinit var analyticsHelper: AnalyticsHelper
+
@Inject
lateinit var alarmHelper: AlarmHelper
+ @Inject
+ lateinit var userPreferences: UserPreferences
+
+ @Inject
+ lateinit var alarmUseCase: AlarmUseCase
+
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
intent ?: return
@@ -27,25 +47,85 @@ class AlarmReceiver : BroadcastReceiver() {
when (intent.action) {
AlarmConstants.ACTION_ALARM_TRIGGERED -> {
Log.d("AlarmReceiver", "Alarm Triggered")
+
+ val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java)
+ } else {
+ @Suppress("DEPRECATION")
+ alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM)
+ }
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "alarm_ring",
+ properties = mapOf(
+ AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}",
+ AnalyticsEvent.AlarmPropertiesKeys.ALARM_TIME to alarm?.toTimeString(),
+ ),
+ ),
+ )
+
context.startForegroundService(alarmServiceIntent)
}
AlarmConstants.ACTION_ALARM_SNOOZED -> {
Log.d("AlarmReceiver", "Alarm Snoozed")
+
val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java)
} else {
@Suppress("DEPRECATION")
intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM)
}
-
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "alarm_snooze",
+ properties = mapOf(
+ AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}",
+ ),
+ ),
+ )
alarm?.let { handleSnooze(context, it) }
+
+ Toast.makeText(context, "알람이 ${alarm?.snoozeInterval}분 후 다시 울려요", Toast.LENGTH_SHORT).show()
}
AlarmConstants.ACTION_ALARM_DISMISSED -> {
Log.d("AlarmReceiver", "Alarm Dismissed")
+
+ val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L)
+ if (alarmId != -1L) {
+ CoroutineScope(Dispatchers.IO).launch {
+ val alarms = alarmUseCase.getAllAlarms().first().sortedBy { it.isAlarmActive }
+ val isFirstAlarm = alarms.firstOrNull()?.id == alarmId
+
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "alarm_dismiss",
+ properties = mapOf(
+ AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "$alarmId",
+ AnalyticsEvent.AlarmPropertiesKeys.DISMISS_IS_FIRST_ALARM to isFirstAlarm,
+ ),
+ ),
+ )
+ val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull()
+ if (existingId == null) {
+ // 첫 번째 알람 해제 기록
+ userPreferences.saveFirstDismissedAlarmId(alarmId)
+ } else if (existingId != alarmId) {
+ // 두 번째 알람 해제 감지 - 기존 기록 삭제
+ userPreferences.clearDismissedAlarmId()
+ }
+ }
+
+ alarmHelper.cancelSnoozedAlarm(alarmId)
+ } else {
+ Log.e("AlarmReceiver", "알람 ID 수신 실패")
+ }
+ alarmHelper.cancelSnoozedAlarm(alarmId)
context.stopService(alarmServiceIntent)
sendBroadCastToCloseAlarmInteractionActivity(context)
+
+ Toast.makeText(context, "알람이 해제되었어요", Toast.LENGTH_SHORT).show()
}
}
}
@@ -76,12 +156,14 @@ class AlarmReceiver : BroadcastReceiver() {
hour = if (snoozeDateTime.hour == 0) 12 else if (snoozeDateTime.hour > 12) snoozeDateTime.hour - 12 else snoozeDateTime.hour,
minute = snoozeDateTime.minute,
second = snoozeDateTime.second,
+ repeatDays = 0,
snoozeCount = newSnoozeCount,
+ id = alarm.id + AlarmConstants.SNOOZE_ID_OFFSET,
)
Log.d(
"AlarmReceiver",
- "Scheduling snooze alarm: alarmId=${alarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount",
+ "Scheduling snooze alarm: alarmId=${updatedAlarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount",
)
context.stopService(Intent(context, AlarmService::class.java))
diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt
index f719e769..c982fe7e 100644
--- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt
+++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt
@@ -10,37 +10,38 @@ import android.graphics.BitmapFactory
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
-import android.os.Handler
-import android.os.HandlerThread
import android.os.IBinder
-import android.os.Looper
-import android.os.Message
-import android.os.Process.THREAD_PRIORITY_BACKGROUND
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.VibratorManager
import android.util.Log
import androidx.core.app.NotificationCompat
+import androidx.core.net.toUri
import com.yapp.alarm.AlarmConstants
import com.yapp.alarm.AlarmHelper
import com.yapp.alarm.pendingIntent.interaction.createAlarmAlertPendingIntent
import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent
import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozePendingIntent
+import com.yapp.alarm.pendingIntent.interaction.createNavigateToMissionPendingIntent
+import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
+import com.yapp.domain.model.AlarmDay
import com.yapp.domain.usecase.AlarmUseCase
import com.yapp.media.sound.SoundPlayer
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
import javax.inject.Inject
@AndroidEntryPoint
class AlarmService : Service() {
- private var serviceLooper: Looper? = null
- private var serviceHandler: ServiceHandler? = null
-
@Inject
lateinit var alarmUseCase: AlarmUseCase
@@ -52,68 +53,20 @@ class AlarmService : Service() {
@Inject
lateinit var alarmHelper: AlarmHelper
- private inner class ServiceHandler(looper: Looper) : Handler(looper) {
-
- override fun handleMessage(message: Message) {
- super.handleMessage(message)
-
- val bundle = message.data
- val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- bundle?.getParcelable(AlarmConstants.EXTRA_ALARM, Alarm::class.java)
- } else {
- @Suppress("DEPRECATION")
- bundle?.getParcelable(AlarmConstants.EXTRA_ALARM)
- }
-
- if (alarm == null) {
- Log.e("AlarmService", "Failed to retrieve Alarm object from intent")
- return
- }
+ @Inject
+ lateinit var userPreferences: UserPreferences
- val notificationId = alarm.id
- val isDismiss = bundle.getBoolean(AlarmConstants.EXTRA_IS_DISMISS, false)
- val isOneTimeAlarm = alarm.repeatDays == 0
-
- when (isDismiss) {
- true -> {
- stopSelf()
- }
-
- false -> {
- startForeground(
- notificationId.toInt(),
- createNotification(alarm),
- )
- if (alarm.isVibrationEnabled) startVibration()
- if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume)
- }
- }
-
- if (isOneTimeAlarm) {
- turnOffAlarm(alarmId = notificationId)
- }
- }
- }
+ private val serviceScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun onCreate() {
super.onCreate()
-
createNotificationChannel()
-
setupVibrator()
-
- HandlerThread("AlarmServiceThread", THREAD_PRIORITY_BACKGROUND).apply {
- start()
- serviceLooper = looper
- serviceHandler = ServiceHandler(looper)
- }
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- serviceHandler?.obtainMessage()?.also { message ->
- message.arg1 = startId
- message.data = intent?.extras
- serviceHandler?.sendMessage(message)
+ serviceScope.launch {
+ handleIntent(intent ?: return@launch)
}
return START_NOT_STICKY
}
@@ -123,31 +76,79 @@ class AlarmService : Service() {
override fun onDestroy() {
stopVibration()
stopSound()
- // remove notification
stopForeground(STOP_FOREGROUND_REMOVE)
- stopSelf()
+ serviceScope.cancel()
+ super.onDestroy()
}
- private fun createNotification(
- alarm: Alarm,
- ): Notification {
- Log.d("AlarmForegroundService", "createNotification()")
+ private suspend fun handleIntent(intent: Intent) {
+ val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java)
+ } else {
+ @Suppress("DEPRECATION")
+ intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM)
+ }
+
+ if (alarm == null) {
+ Log.e("AlarmService", "Failed to retrieve Alarm object from intent")
+ return
+ }
+
+ val notificationId = alarm.id
+ val isDismiss = intent.getBooleanExtra(AlarmConstants.EXTRA_IS_DISMISS, false)
+ val isOneTimeAlarm = alarm.repeatDays == 0
+
+ Log.d("AlarmService", "AlarmService started for alarm: $alarm")
+
+ // 반복 요일 알람 시, 다음 주 동일 요일 알람 예약
+ if (!isOneTimeAlarm) {
+ intent.getStringExtra(AlarmConstants.EXTRA_ALARM_DAY)?.let {
+ alarmHelper.scheduleWeeklyAlarm(alarm, AlarmDay.valueOf(it))
+ }
+ }
- val closeIntent = Intent(AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE).apply {
- putExtra(AlarmConstants.EXTRA_IS_SNOOZED, true)
+ // 알람 해제 여부에 따른 처리
+ when (isDismiss) {
+ true -> stopSelf()
+ false -> {
+ startForeground(
+ notificationId.toInt(),
+ createNotification(alarm, shouldNavigateToMission()),
+ )
+ if (alarm.isVibrationEnabled) startVibration()
+ if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume)
+ }
}
- applicationContext.sendBroadcast(closeIntent)
+ if (isOneTimeAlarm) {
+ turnOffAlarm(alarmId = notificationId)
+ }
+ }
+
+ private suspend fun shouldNavigateToMission(): Boolean {
+ val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull()
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ return fortuneDate != todayDate
+ }
+
+ private fun createNotification(alarm: Alarm, shouldNavigateToMission: Boolean): Notification {
val alarmAlertPendingIntent =
createAlarmAlertPendingIntent(applicationContext, alarm)
- val alarmDismissPendingIntent =
- createAlarmDismissPendingIntent(applicationContext, pendingIntentId = alarm.id)
- val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) {
- createAlarmSnoozePendingIntent(
- applicationContext,
- alarm,
+ val alarmDismissPendingIntent = if (shouldNavigateToMission) {
+ createNavigateToMissionPendingIntent(
+ applicationContext = applicationContext,
+ notificationId = alarm.id,
)
+ } else {
+ createAlarmDismissPendingIntent(
+ applicationContext = applicationContext,
+ pendingIntentId = alarm.id,
+ )
+ }
+
+ val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) {
+ createAlarmSnoozePendingIntent(applicationContext, alarm)
} else {
null
}
@@ -160,10 +161,13 @@ class AlarmService : Service() {
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setFullScreenIntent(alarmAlertPendingIntent, true)
+ .setDeleteIntent(
+ snoozePendingIntent ?: alarmDismissPendingIntent,
+ )
.addAction(core.designsystem.R.drawable.ic_cancel, "알람 해제", alarmDismissPendingIntent)
- if (snoozePendingIntent != null) {
- builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", snoozePendingIntent)
+ snoozePendingIntent?.let {
+ builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", it)
}
return builder.build()
@@ -218,7 +222,7 @@ class AlarmService : Service() {
private fun startSound(soundUri: String, volume: Int) {
val uri: Uri = if (soundUri.isNotEmpty()) {
- Uri.parse(soundUri)
+ soundUri.toUri()
} else {
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
}
diff --git a/core/analytics/.gitignore b/core/analytics/.gitignore
new file mode 100644
index 00000000..42afabfd
--- /dev/null
+++ b/core/analytics/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts
new file mode 100644
index 00000000..2bfdbe5a
--- /dev/null
+++ b/core/analytics/build.gradle.kts
@@ -0,0 +1,16 @@
+import com.yapp.convention.setNamespace
+
+plugins {
+ id("orbit.android.library")
+ id("orbit.android.hilt")
+ id("orbit.android.compose")
+}
+
+android {
+ setNamespace("com.yapp.analytics")
+}
+
+dependencies {
+ implementation(projects.core.common)
+ implementation(libs.amplitude.analytics)
+}
diff --git a/core/analytics/consumer-rules.pro b/core/analytics/consumer-rules.pro
new file mode 100644
index 00000000..e69de29b
diff --git a/core/analytics/proguard-rules.pro b/core/analytics/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/core/analytics/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/core/analytics/src/main/AndroidManifest.xml b/core/analytics/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..e1000761
--- /dev/null
+++ b/core/analytics/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt
new file mode 100644
index 00000000..a19a3ea9
--- /dev/null
+++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt
@@ -0,0 +1,24 @@
+package com.yapp.analytics
+
+import com.amplitude.android.Amplitude
+import com.amplitude.core.events.BaseEvent
+import javax.inject.Inject
+
+class AmplitudeAnalyticsHelper @Inject constructor(
+ private val amplitude: Amplitude,
+) : AnalyticsHelper() {
+ override fun logEvent(event: AnalyticsEvent) {
+ amplitude.track(event.toAmplitudeEvent())
+ }
+
+ override fun setUserId(userId: Long?) {
+ amplitude.setUserId("ORBIT_$userId")
+ }
+
+ private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent {
+ return BaseEvent().apply {
+ this.eventType = type
+ this.eventProperties = properties?.toMutableMap()
+ }
+ }
+}
diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt
new file mode 100644
index 00000000..3c278d90
--- /dev/null
+++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt
@@ -0,0 +1,29 @@
+package com.yapp.analytics
+
+data class AnalyticsEvent(
+ val type: String,
+ val properties: Map? = null,
+) {
+ object OnboardingPropertiesKeys {
+ const val STEP = "step"
+ const val GENDER = "gender"
+ const val IS_PERMISSION_GRANTED = "permission"
+ }
+
+ object AlarmPropertiesKeys {
+ const val ALARM_ID = "alarm_id"
+ const val ALARM_TIME = "alarm_time"
+ const val REPEAT_DAYS = "repeat_days"
+ const val SNOOZE_OPTION = "snooze_option"
+ const val DISMISS_IS_FIRST_ALARM = "dismiss_is_first_alarm"
+ }
+
+ object MissionPropertiesKeys {
+ const val MISSION_TYPE = "mission_type"
+ }
+
+ object FortunePropertiesKeys {
+ const val FORTUNE_PAGE_NUMBER = "fortune_page_number"
+ const val DURATION = "duration"
+ }
+}
diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt
new file mode 100644
index 00000000..2026c842
--- /dev/null
+++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt
@@ -0,0 +1,12 @@
+package com.yapp.analytics
+
+import androidx.compose.runtime.staticCompositionLocalOf
+
+abstract class AnalyticsHelper {
+ abstract fun logEvent(event: AnalyticsEvent)
+ abstract fun setUserId(userId: Long?)
+}
+
+val LocalAnalyticsHelper = staticCompositionLocalOf {
+ DebugAnalyticsHelper()
+}
diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt
new file mode 100644
index 00000000..b4ef3424
--- /dev/null
+++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt
@@ -0,0 +1,16 @@
+package com.yapp.analytics
+
+import android.util.Log
+
+class DebugAnalyticsHelper : AnalyticsHelper() {
+ private var userId: String = ""
+
+ override fun logEvent(event: AnalyticsEvent) {
+ Log.d("DebugAnalyticsHelper", "userId: $userId logEvent: $event")
+ }
+
+ override fun setUserId(userId: Long?) {
+ this.userId = "ORBIT_$userId"
+ Log.d("DebugAnalyticsHelper", "setUserId: $userId")
+ }
+}
diff --git a/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt
new file mode 100644
index 00000000..caef0cf5
--- /dev/null
+++ b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt
@@ -0,0 +1,59 @@
+package com.yapp.analytics.di
+
+import android.content.Context
+import com.amplitude.android.Amplitude
+import com.amplitude.android.Configuration
+import com.yapp.analytics.AmplitudeAnalyticsHelper
+import com.yapp.analytics.AnalyticsHelper
+import com.yapp.analytics.BuildConfig
+import com.yapp.analytics.DebugAnalyticsHelper
+import com.yapp.common.buildconfig.BuildConfigFieldProvider
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.android.qualifiers.ApplicationContext
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Qualifier
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object AnalyticsModule {
+
+ @Provides
+ @Singleton
+ fun providesAmplitude(
+ @ApplicationContext context: Context,
+ buildConfigFieldProvider: BuildConfigFieldProvider,
+ ): Amplitude = Amplitude(
+ Configuration(
+ apiKey = buildConfigFieldProvider.get().amplitudeApiKey,
+ context = context,
+ ),
+ )
+
+ @Provides
+ @Singleton
+ @Debug
+ fun provideDebugAnalyticsHelper(): AnalyticsHelper = DebugAnalyticsHelper()
+
+ @Provides
+ @Singleton
+ @Release
+ fun provideReleaseAnalyticsHelper(amplitude: Amplitude): AnalyticsHelper = AmplitudeAnalyticsHelper(amplitude)
+
+ @Provides
+ @Singleton
+ fun provideAnalyticsHelper(
+ @Debug debugAnalyticsHelper: AnalyticsHelper,
+ @Release releaseAnalyticsHelper: AnalyticsHelper,
+ ): AnalyticsHelper = if (BuildConfig.DEBUG) debugAnalyticsHelper else releaseAnalyticsHelper
+}
+
+@Qualifier
+@Retention(AnnotationRetention.BINARY)
+annotation class Debug
+
+@Qualifier
+@Retention(AnnotationRetention.BINARY)
+annotation class Release
diff --git a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt
index 1017778a..ae3ddfe4 100644
--- a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt
+++ b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt
@@ -2,6 +2,7 @@ package com.yapp.buildconfig
import com.yapp.common.buildconfig.BuildConfigFieldProvider
import com.yapp.common.buildconfig.BuildConfigFields
+import core.buildconfig.BuildConfig.AMPLITUDE_API_KEY
import core.buildconfig.BuildConfig.BASE_URL
import core.buildconfig.BuildConfig.DEBUG
import javax.inject.Inject
@@ -10,6 +11,7 @@ class BuildConfigFieldsProviderImpl @Inject constructor() : BuildConfigFieldProv
override fun get(): BuildConfigFields =
BuildConfigFields(
baseUrl = BASE_URL,
+ amplitudeApiKey = AMPLITUDE_API_KEY,
isDebug = DEBUG,
)
}
diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts
index c856674a..a01d2fa2 100644
--- a/core/common/build.gradle.kts
+++ b/core/common/build.gradle.kts
@@ -12,6 +12,8 @@ android {
dependencies {
implementation(projects.core.designsystem)
+ implementation(projects.domain)
implementation(libs.compose.navigation)
implementation(libs.hilt.navigation.compose)
+ implementation(libs.kotlinx.serialization.json)
}
diff --git a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt
index 30e0e506..a7edf3e0 100644
--- a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt
+++ b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt
@@ -2,5 +2,6 @@ package com.yapp.common.buildconfig
data class BuildConfigFields(
val baseUrl: String,
+ val amplitudeApiKey: String,
val isDebug: Boolean,
)
diff --git a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt b/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt
deleted file mode 100644
index 4cc9ac3f..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.yapp.common.navigation
-
-import android.os.Bundle
-import androidx.navigation.NavType
-
-abstract class JsonNavType : NavType(isNullableAllowed = false) {
- abstract fun fromJsonParse(value: String): T
- abstract fun T.getJsonParse(): String
-
- override fun get(bundle: Bundle, key: String): T? =
- bundle.getString(key)?.let { parseValue(it) }
-
- override fun parseValue(value: String): T = fromJsonParse(value)
-
- override fun put(bundle: Bundle, key: String, value: T) {
- bundle.putString(key, value.getJsonParse())
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
index bfbd7ec8..34ceed6f 100644
--- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
+++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt
@@ -1,63 +1,88 @@
package com.yapp.common.navigation
+import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
-import androidx.navigation.NavDestination
import androidx.navigation.NavHostController
-import androidx.navigation.compose.currentBackStackEntryAsState
+import androidx.navigation.NavOptions
import androidx.navigation.compose.rememberNavController
-import androidx.navigation.navOptions
-import com.yapp.common.navigation.destination.HomeDestination
-import com.yapp.common.navigation.destination.OnboardingDestination
-import com.yapp.common.navigation.destination.TopLevelDestination
+import com.yapp.common.navigation.route.AlarmInteractionDestination
+import com.yapp.common.navigation.route.FortuneBaseRoute
+import com.yapp.common.navigation.route.FortuneDestination
+import com.yapp.common.navigation.route.HomeBaseRoute
+import com.yapp.common.navigation.route.HomeDestination
+import com.yapp.common.navigation.route.OnboardingBaseRoute
+import com.yapp.common.navigation.route.OnboardingDestination
+import com.yapp.common.navigation.route.SettingBaseRoute
+import com.yapp.common.navigation.route.SettingDestination
+import com.yapp.common.navigation.route.SplashRoute
+import com.yapp.common.navigation.route.WebViewRoute
+import com.yapp.domain.model.Alarm
class OrbitNavigator(
val navController: NavHostController,
) {
- val startDestination = OnboardingDestination.Route.route
-
- private val currentDestination: NavDestination?
- @Composable get() = navController
- .currentBackStackEntryAsState().value?.destination
-
- val currentTab: TopLevelDestination?
- @Composable get() = currentDestination
- ?.route
- ?.let(TopLevelDestination.Companion::find)
-
- fun navigateTo(route: String, popUpTo: String? = null, inclusive: Boolean = false) {
- navController.navigate(route) {
- popUpTo?.let {
- popUpTo(it) { this.inclusive = inclusive }
- }
- launchSingleTop = true
- restoreState = true
+ val startDestination = SplashRoute
+
+ fun navigateToOnboarding(navOptions: NavOptions? = null) {
+ navController.navigate(OnboardingBaseRoute, navOptions)
+ }
+
+ fun navigateToOnboardingNextStep(currentStep: Int, navOptions: NavOptions? = null) {
+ val instance = OnboardingDestination.getNextRouteForStep(currentStep)?.objectInstance
+ if (instance != null) {
+ navController.navigate(instance, navOptions)
+ } else {
+ Log.e("Navigator", "Invalid route at step: $currentStep")
}
}
- fun navigateBack() {
- navController.popBackStack()
+ fun navigateToAddAlarm(navOptions: NavOptions? = null) {
+ navController.navigate(HomeDestination.AlarmAddEdit(-1), navOptions)
}
- fun navigateToTopLevelDestination(tab: TopLevelDestination) {
- val navOptions = navOptions {
- popUpTo(Routes.Home.ROUTE) {
- saveState = true
- }
- launchSingleTop = true
- restoreState = true
- }
+ fun navigateToEditAlarm(alarmId: Long, navOptions: NavOptions? = null) {
+ navController.navigate(HomeDestination.AlarmAddEdit(alarmId), navOptions)
+ }
- when (tab) {
- TopLevelDestination.HOME -> navController.navigate(Routes.Home.ROUTE, navOptions)
- TopLevelDestination.MYPAGE -> navController.navigate(Routes.MyPage.ROUTE, navOptions)
- }
+ fun navigateToHome(navOptions: NavOptions? = null) {
+ navController.navigate(HomeBaseRoute, navOptions)
+ }
+
+ fun navigateToAlarmAction(alarm: Alarm, navOptions: NavOptions? = null) {
+ navController.navigate(AlarmInteractionDestination.AlarmAction(alarm), navOptions)
+ }
+
+ fun navigateToAlarmSnoozeTimer(alarm: Alarm, navOptions: NavOptions? = null) {
+ navController.navigate(AlarmInteractionDestination.AlarmSnoozeTimer(alarm), navOptions)
+ }
+
+ fun navigateToFortune(navOptions: NavOptions? = null) {
+ navController.navigate(FortuneBaseRoute, navOptions)
+ }
+
+ fun navigateToFortuneReward(navOptions: NavOptions? = null) {
+ navController.navigate(FortuneDestination.Reward, navOptions)
+ }
+
+ fun navigateToSetting(navOptions: NavOptions? = null) {
+ navController.navigate(SettingBaseRoute, navOptions)
+ }
+
+ fun navigateToEditProfile(navOptions: NavOptions? = null) {
+ navController.navigate(SettingDestination.EditProfile, navOptions)
}
- @Composable
- fun shouldHaveNavigationBarsPadding(): Boolean {
- val currentRoute = currentDestination?.route ?: return false
- return currentRoute !in HomeDestination.Home.route
+ fun navigateToEditBirthDay(navOptions: NavOptions? = null) {
+ navController.navigate(SettingDestination.EditBirthday, navOptions)
+ }
+
+ fun navigateToWebView(url: String, navOptions: NavOptions? = null) {
+ navController.navigate(WebViewRoute(url), navOptions)
+ }
+
+ fun navigateBack() {
+ navController.popBackStack()
}
}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt b/core/common/src/main/java/com/yapp/common/navigation/Routes.kt
deleted file mode 100644
index d8fcb620..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.yapp.common.navigation
-
-object Routes {
- object Onboarding {
- const val ROUTE = "onboarding_route"
- const val EXPLAIN = "onboarding_explain"
- const val ALARM_TIME_SELECTION = "onboarding_alarm_time_selection"
- const val BIRTHDAY = "onboarding_birthday"
- const val TIME_OF_BIRTH = "onboarding_time_of_birth"
- const val NAME = "onboarding_name"
- const val GENDER = "onboarding_gender"
- const val ACCESS = "onboarding_access"
- const val COMPLETE_FIRST = "onboarding_complete_first"
- const val COMPLETE_SECOND = "onboarding_complete_second"
- }
-
- object Home {
- const val ROUTE = "home_route"
- const val HOME = "home"
- const val ALARM_ADD_EDIT = "alarm_add_edit"
- }
-
- object AlarmInteraction {
- const val ROUTE = "alarm_interaction_route"
- const val ALARM_ACTION = "alarm_action"
- const val ALARM_SNOOZE_TIMER = "alarm_snooze_timer"
- }
-
- object MyPage {
- const val ROUTE = "mypage_route"
- const val MYPAGE = "mypage"
- }
-
- object Mission {
- const val ROUTE = "mission_route"
- const val MISSION = "mission_main"
- const val PROGRESS = "mission_progress"
- }
-
- object Fortune {
- const val ROUTE = "fortune_route"
- const val FORTUNE = "fortune_main"
- const val REWARD = "fortune_reward"
- }
-
- object Setting {
- const val ROUTE = "setting_route"
- const val SETTING = "setting_main"
- const val EDIT_PROFILE = "setting_edit_profile"
- const val EDIT_BIRTHDAY = "setting_edit_birthday"
- }
-
- object Splash {
- const val ROUTE = "splash_route"
- const val SPLASH = "splash"
- }
-
- object WebView {
- const val ROUTE = "webview_route"
- const val WEBVIEW = "webview"
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt
deleted file mode 100644
index 47b8d731..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class AlarmInteractionDestination(val route: String) {
- data object Route : AlarmInteractionDestination(Routes.AlarmInteraction.ROUTE)
- data object AlarmAction : HomeDestination(Routes.AlarmInteraction.ALARM_ACTION)
- data object AlarmSnoozeTimer : HomeDestination(Routes.AlarmInteraction.ALARM_SNOOZE_TIMER)
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt
deleted file mode 100644
index 808c3f62..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class FortuneDestination(val route: String) {
- data object Route : FortuneDestination(Routes.Fortune.ROUTE)
- data object Fortune : FortuneDestination(Routes.Fortune.FORTUNE)
- data object Reward : FortuneDestination(Routes.Fortune.REWARD)
-
- companion object {
- val routes = listOf(Fortune, Reward)
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt
deleted file mode 100644
index 81a71aed..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class HomeDestination(val route: String) {
- data object Route : HomeDestination(Routes.Home.ROUTE)
- data object Home : HomeDestination(Routes.Home.HOME)
- data object AlarmAddEdit : HomeDestination(Routes.Home.ALARM_ADD_EDIT)
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt
deleted file mode 100644
index fd742d70..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class MissionDestination(val route: String) {
- data object Route : MissionDestination(Routes.Mission.ROUTE)
- data object Mission : MissionDestination(Routes.Mission.MISSION)
- data object Progress : MissionDestination(Routes.Mission.PROGRESS)
-
- companion object {
- val routes = listOf(Mission, Progress)
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt
deleted file mode 100644
index 9ccb7d9c..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class MyPageDestination(val route: String) {
- data object Route : MyPageDestination(Routes.MyPage.ROUTE)
- data object MyPage : MyPageDestination(Routes.MyPage.MYPAGE)
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt
deleted file mode 100644
index 89c4afe8..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class OnboardingDestination(val route: String) {
- data object Route : OnboardingDestination(Routes.Onboarding.ROUTE)
- data object Explain : OnboardingDestination(Routes.Onboarding.EXPLAIN)
- data object AlarmTimeSelection : OnboardingDestination(Routes.Onboarding.ALARM_TIME_SELECTION)
- data object Birthday : OnboardingDestination(Routes.Onboarding.BIRTHDAY)
- data object TimeOfBirth : OnboardingDestination(Routes.Onboarding.TIME_OF_BIRTH)
- data object Name : OnboardingDestination(Routes.Onboarding.NAME)
- data object Gender : OnboardingDestination(Routes.Onboarding.GENDER)
- data object Access : OnboardingDestination(Routes.Onboarding.ACCESS)
- data object Complete1 : OnboardingDestination(Routes.Onboarding.COMPLETE_FIRST)
- data object Complete2 : OnboardingDestination(Routes.Onboarding.COMPLETE_SECOND)
-
- companion object {
- val routes = listOf(Explain, AlarmTimeSelection, Birthday, TimeOfBirth, Name, Gender, Access, Complete1, Complete2)
-
- fun nextRoute(currentStep: Int): String? {
- return routes.getOrNull(currentStep)?.route
- }
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt
deleted file mode 100644
index 0b1f8e8f..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class SettingDestination(val route: String) {
- data object Route : SettingDestination(Routes.Setting.ROUTE)
- data object Setting : SettingDestination(Routes.Setting.SETTING)
- data object EditProfile : SettingDestination(Routes.Setting.EDIT_PROFILE)
- data object EditBirthday : SettingDestination(Routes.Setting.EDIT_BIRTHDAY)
-
- companion object {
- val routes = listOf(Setting, EditProfile, EditBirthday)
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt
deleted file mode 100644
index 9ea3934f..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class SplashDestination(val route: String) {
- data object Route : SplashDestination(Routes.Splash.ROUTE)
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt
deleted file mode 100644
index 3a9fcc52..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import androidx.annotation.DrawableRes
-import androidx.annotation.StringRes
-import com.yapp.common.navigation.Routes
-
-enum class TopLevelDestination(
- @DrawableRes val iconId: Int,
- @StringRes val titleId: Int,
- val route: String,
-) {
- HOME(
- iconId = core.designsystem.R.drawable.ic_launcher_foreground,
- titleId = core.designsystem.R.string.app_name,
- route = Routes.Home.ROUTE,
- ),
- MYPAGE(
- iconId = core.designsystem.R.drawable.ic_launcher_foreground,
- titleId = core.designsystem.R.string.app_name,
- route = Routes.MyPage.MYPAGE,
- ),
- ;
-
- companion object {
- operator fun contains(route: String): Boolean = entries.any { it.route == route }
- fun find(route: String): TopLevelDestination? = entries.find { it.route == route }
- }
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt
deleted file mode 100644
index 9533099b..00000000
--- a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.yapp.common.navigation.destination
-
-import com.yapp.common.navigation.Routes
-
-sealed class WebViewDestination(val route: String) {
- object Route : WebViewDestination(Routes.WebView.ROUTE)
- object WebView : WebViewDestination(Routes.WebView.WEBVIEW)
-}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt
new file mode 100644
index 00000000..21310ba9
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt
@@ -0,0 +1,18 @@
+package com.yapp.common.navigation.route
+
+import com.yapp.domain.model.Alarm
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object AlarmInteractionBaseRoute
+
+sealed interface AlarmInteractionDestination {
+ @Serializable
+ data object Route : AlarmInteractionDestination
+
+ @Serializable
+ data class AlarmAction(val alarm: Alarm) : AlarmInteractionDestination
+
+ @Serializable
+ data class AlarmSnoozeTimer(val alarm: Alarm) : AlarmInteractionDestination
+}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt
new file mode 100644
index 00000000..c581c8ed
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt
@@ -0,0 +1,14 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object FortuneBaseRoute
+
+sealed interface FortuneDestination {
+ @Serializable
+ data object Fortune : FortuneDestination
+
+ @Serializable
+ data object Reward : FortuneDestination
+}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt
new file mode 100644
index 00000000..04b8b4da
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt
@@ -0,0 +1,14 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object HomeBaseRoute
+
+sealed interface HomeDestination {
+ @Serializable
+ data object Route : HomeDestination
+
+ @Serializable
+ data class AlarmAddEdit(val alarmId: Long? = null) : HomeDestination
+}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt
new file mode 100644
index 00000000..d5a04949
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt
@@ -0,0 +1,6 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object MissionRoute
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt
new file mode 100644
index 00000000..ff4faea4
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt
@@ -0,0 +1,55 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+import kotlin.reflect.KClass
+
+@Serializable
+data object OnboardingBaseRoute
+
+sealed class OnboardingDestination {
+ @Serializable
+ data object Explain : OnboardingDestination()
+
+ @Serializable
+ data object AlarmTimeSelection : OnboardingDestination()
+
+ @Serializable
+ data object Birthday : OnboardingDestination()
+
+ @Serializable
+ data object TimeOfBirth : OnboardingDestination()
+
+ @Serializable
+ data object Name : OnboardingDestination()
+
+ @Serializable
+ data object Gender : OnboardingDestination()
+
+ @Serializable
+ data object Access : OnboardingDestination()
+
+ @Serializable
+ data object Complete1 : OnboardingDestination()
+
+ @Serializable
+ data object Complete2 : OnboardingDestination()
+
+ companion object {
+ val routes: List> = listOf(
+ Explain::class,
+ AlarmTimeSelection::class,
+ Birthday::class,
+ TimeOfBirth::class,
+ Name::class,
+ Gender::class,
+ Access::class,
+ Complete1::class,
+ Complete2::class,
+ )
+
+ fun getNextRouteForStep(currentStep: Int): KClass? {
+ val nextRoute = routes.getOrNull(currentStep + 1)
+ return nextRoute
+ }
+ }
+}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt
new file mode 100644
index 00000000..9246eed0
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt
@@ -0,0 +1,18 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object SettingBaseRoute
+
+@Serializable
+sealed interface SettingDestination {
+ @Serializable
+ data object Setting : SettingDestination
+
+ @Serializable
+ data object EditProfile : SettingDestination
+
+ @Serializable
+ data object EditBirthday : SettingDestination
+}
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt
new file mode 100644
index 00000000..81724c65
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt
@@ -0,0 +1,6 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data object SplashRoute
diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt
new file mode 100644
index 00000000..9ced251c
--- /dev/null
+++ b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt
@@ -0,0 +1,6 @@
+package com.yapp.common.navigation.route
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class WebViewRoute(val url: String)
diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt
index 47a6492e..35298556 100644
--- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt
+++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt
@@ -1,5 +1,6 @@
package com.yapp.datastore
+import android.util.Log
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
@@ -23,10 +24,15 @@ class UserPreferences @Inject constructor(
) {
private object Keys {
val USER_ID = longPreferencesKey("user_id")
+ val USER_NAME = stringPreferencesKey("user_name")
val ONBOARDING_COMPLETED = booleanPreferencesKey("onboarding_completed")
val FORTUNE_ID = longPreferencesKey("fortune_id")
val FORTUNE_DATE = stringPreferencesKey("fortune_date")
val FORTUNE_IMAGE_ID = intPreferencesKey("fortune_image_id")
+ val FORTUNE_SCORE = intPreferencesKey("fortune_score")
+ val FORTUNE_CHECKED = booleanPreferencesKey("fortune_checked")
+ val FIRST_DISMISSED_ALARM_ID = longPreferencesKey("first_dismissed_alarm_id")
+ val DISMISSED_DATE = stringPreferencesKey("dismissed_date")
}
val userIdFlow: Flow = dataStore.data
@@ -34,6 +40,11 @@ class UserPreferences @Inject constructor(
.map { it[Keys.USER_ID] }
.distinctUntilChanged()
+ val userNameFlow: Flow = dataStore.data
+ .catch { emit(emptyPreferences()) }
+ .map { it[Keys.USER_NAME] }
+ .distinctUntilChanged()
+
val onboardingCompletedFlow: Flow = dataStore.data
.catch { emit(emptyPreferences()) }
.map { it[Keys.ONBOARDING_COMPLETED] ?: false }
@@ -54,17 +65,59 @@ class UserPreferences @Inject constructor(
.map { it[Keys.FORTUNE_IMAGE_ID] }
.distinctUntilChanged()
+ val fortuneScoreFlow: Flow = dataStore.data
+ .catch { emit(emptyPreferences()) }
+ .map { it[Keys.FORTUNE_SCORE] }
+ .distinctUntilChanged()
+
+ val hasNewFortuneFlow: Flow = dataStore.data
+ .catch { emit(emptyPreferences()) }
+ .map { preferences ->
+ val savedDate = preferences[Keys.FORTUNE_DATE]
+ val isChecked = preferences[Keys.FORTUNE_CHECKED] ?: true
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ savedDate == todayDate && !isChecked
+ }
+ .distinctUntilChanged()
+
+ val firstDismissedAlarmIdFlow: Flow = dataStore.data
+ .catch { emit(emptyPreferences()) }
+ .map { preferences ->
+ val savedDate = preferences[Keys.DISMISSED_DATE]
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+
+ if (savedDate == todayDate) {
+ preferences[Keys.FIRST_DISMISSED_ALARM_ID]
+ } else {
+ null
+ }
+ }
+ .distinctUntilChanged()
+
suspend fun saveUserId(userId: Long) {
dataStore.edit { preferences ->
preferences[Keys.USER_ID] = userId
}
}
+ suspend fun saveUserName(userName: String) {
+ dataStore.edit { preferences ->
+ preferences[Keys.USER_NAME] = userName
+ }
+ }
+
suspend fun saveFortuneId(fortuneId: Long) {
val currentDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
dataStore.edit { preferences ->
preferences[Keys.FORTUNE_ID] = fortuneId
preferences[Keys.FORTUNE_DATE] = currentDate
+ preferences[Keys.FORTUNE_CHECKED] = false
+ }
+ }
+
+ suspend fun markFortuneAsChecked() {
+ dataStore.edit { preferences ->
+ preferences[Keys.FORTUNE_CHECKED] = true
}
}
@@ -74,12 +127,38 @@ class UserPreferences @Inject constructor(
}
}
+ suspend fun saveFortuneScore(score: Int) {
+ dataStore.edit { preferences ->
+ preferences[Keys.FORTUNE_SCORE] = score
+ }
+ }
+
+ suspend fun saveFirstDismissedAlarmId(alarmId: Long) {
+ dataStore.edit { preferences ->
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ if (preferences[Keys.FIRST_DISMISSED_ALARM_ID] == null) {
+ preferences[Keys.FIRST_DISMISSED_ALARM_ID] = alarmId
+ preferences[Keys.DISMISSED_DATE] = todayDate
+ Log.d("UserPreferences", "첫 해제된 알람 ID 저장 완료: $alarmId (날짜: $todayDate)")
+ } else {
+ Log.d("UserPreferences", "이미 첫 알람 해제 ID가 저장되어 있음)")
+ }
+ }
+ }
+
suspend fun setOnboardingCompleted() {
dataStore.edit { preferences ->
preferences[Keys.ONBOARDING_COMPLETED] = true
}
}
+ suspend fun clearDismissedAlarmId() {
+ dataStore.edit { preferences ->
+ preferences.remove(Keys.FIRST_DISMISSED_ALARM_ID)
+ preferences.remove(Keys.DISMISSED_DATE)
+ }
+ }
+
suspend fun clearUserData() {
dataStore.edit { preferences ->
preferences.clear()
@@ -91,6 +170,8 @@ class UserPreferences @Inject constructor(
preferences.remove(Keys.FORTUNE_ID)
preferences.remove(Keys.FORTUNE_DATE)
preferences.remove(Keys.FORTUNE_IMAGE_ID)
+ preferences.remove(Keys.FORTUNE_SCORE)
+ preferences.remove(Keys.FORTUNE_CHECKED)
}
}
}
diff --git a/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png
new file mode 100644
index 00000000..ceeac7b7
Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png differ
diff --git a/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png
new file mode 100644
index 00000000..52b8f24d
Binary files /dev/null and b/core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png differ
diff --git a/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml
new file mode 100644
index 00000000..69255ae7
--- /dev/null
+++ b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/designsystem/src/main/res/drawable/ic_check.xml b/core/designsystem/src/main/res/drawable/ic_check.xml
index eaa1bbcd..1412ec7b 100644
--- a/core/designsystem/src/main/res/drawable/ic_check.xml
+++ b/core/designsystem/src/main/res/drawable/ic_check.xml
@@ -1,9 +1,9 @@
+ android:width="21dp"
+ android:height="20dp"
+ android:viewportWidth="21"
+ android:viewportHeight="20">
+ android:pathData="M16.503,5.244C16.828,5.57 16.828,6.097 16.503,6.423L8.864,14.061C8.707,14.218 8.495,14.306 8.274,14.306C8.053,14.306 7.841,14.218 7.685,14.061L4.213,10.589C3.887,10.264 3.887,9.736 4.213,9.411C4.538,9.085 5.066,9.085 5.391,9.411L8.274,12.294L15.324,5.244C15.649,4.919 16.177,4.919 16.503,5.244Z"
+ android:fillColor="#ffffff"/>
diff --git a/core/designsystem/src/main/res/drawable/ic_filter.xml b/core/designsystem/src/main/res/drawable/ic_filter.xml
new file mode 100644
index 00000000..9a284caa
--- /dev/null
+++ b/core/designsystem/src/main/res/drawable/ic_filter.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png
new file mode 100644
index 00000000..6c421ae1
Binary files /dev/null and b/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png differ
diff --git a/core/designsystem/src/main/res/drawable/ic_trash.xml b/core/designsystem/src/main/res/drawable/ic_trash.xml
new file mode 100644
index 00000000..541852eb
--- /dev/null
+++ b/core/designsystem/src/main/res/drawable/ic_trash.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/designsystem/src/main/res/raw/fortune_preload.json b/core/designsystem/src/main/res/raw/fortune_preload.json
index 54154ad5..5a989fc7 100644
--- a/core/designsystem/src/main/res/raw/fortune_preload.json
+++ b/core/designsystem/src/main/res/raw/fortune_preload.json
@@ -1 +1 @@
-{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#232323"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"128","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"126","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"99","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"103","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"107","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"114","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":6},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"131","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"133","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":8}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":68,"h":69,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABFCAMAAADEkbAlAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUdwTP////3+/v////////////////////////////3+/v39/v////f5+v////////j5+////////////////////////////9Xc5NXc5P///9Xc5O7x9OPo7S4sF6sAAAAadFJOUwAJEN4t6vT7AQQgPNBOF7eCp4xYZZvFcd7Fv+W+XAAAA0BJREFUWMPlmOuSoyAQhQOiKIqigiYxef/X3G6IShLxlv2xVdupmZqaqv7Sp0Hpw+Xyn0UKkY2RpicAkEcIpbQsSwE/lJBjHPh+zC+FYIzlNhgTwIF69gIyAl8vMF3KVuseQutW5sAheyhYA7UAm66axpgawphG9a1kUsotUSMil5gP2VXVdYWNrqvqRl2HYbjKNQrqeBEAAPlFEUUxRJIkcRxFRTW4AMwGotUKCJ3Nh2w+BoCiYQyVBhiECiZbKAIJCMDU+xycPybIcBNriLqyhA+ACw8yXMUCoxT5iMAa7osx+BT6zWBSK4fgIQQo8im3BUbfvBBezjfFV6Q+Ga0yVREn4SIm7HOm5N4Gs4y6wzLuW8H9YmZBKaFMImOzjDHmWuQIyaiQvTnA8Gq5ToWUuW6qKNmLQMrzvStpZsUU8XIdAXLy3pWUiFybLj5SiN8W6joChYTEhMHcb63tCBRyrA6vFOXUYEf2iuFfC3R1alpcmmNifD0IKdkpNfMD7VrS4/oehzw9iLBrs9oE/iskHI8Zgn3tIr53Ubw/PyFnWvIBMf8EBPaa/h2Ce+3UNvGW+C9B8nMQ7m37LQgP/2f4vZK79yo435PH/JK1SzxB+Lk3WxbebOtE7p0Z2fezww+pGXBi2vcUh9XcLj+8T55vJ4bA12NyVM0EEfYQPbhR+Ps56obIV2eT+6HW8ntip9EbHY/i8Cm6QomL2ihJ0nmwWNGzfETzJKqalpWjWRiPQH7gAeZJ3Jk+FySbZhzhjq8DghIQoySjs2vxStnHgToKEJOXZJ7vMzfl7BUECxNDQ3QuvELmeWvf4MeRYbR8Y9gFwjG22DVxWS2mh4aQd7OCgqAte+ZpWFvoh5asnFbGm2RhCq2LjVGWo5Suhn5AHV9+EmZqqOU1mIc4FgFSVAs9JemSZbIUE3QqzrwVYCVBCvQ0W/Zu6Lu0b7u4m2/g4wgRutG+zVnYGlu74qyXtZDJFLEzol1lLELQFXvtTCBgnBVFM/sKsMRVDZZYt86hZ2vGOnOY2Va7AHPeIMGZfLJ15ZA6jDX4fa8UWHz41fcAsISd1w3uqkEIvKiQrxgvLOiBiw/LwTsLQMEHokRAmPAH3uowRR/Tl6YAAAAASUVORK5CYII=","u":""},{"id":"3","e":1,"w":64,"h":168,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACoCAMAAABnoBgDAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABRUExURUdwTI60532v7H6w7X6w7X6w7H6w7X6u632v7ISy6svLyz5/0H2v632v68LHzDx+0MnJy8rKyjt/z8vLy8nJyX+w7cvLyz5/0KK83oyv22GSz9D6oqIAAAAVdFJOUwAQgJ+579skZUcqzZCg8Yyiez3JkLnlnz4AAAJPSURBVGje5ZjrTuswEAYdXzZ26qSFYkJ5/wcFeuBIpXG0zigCif2/07U1n7eKMb+1uhSz89dyNvaNzdFJuSnf0p58uSvR/7gNpQBAJ2W51BNU+ov6FmUvQNQCPAWMFUCmAKcF2ApALULcC6A2KVGT+t0AiYZBbVKoACwNg6Nh8BQgNAyBhqF01OWeAhINQ6QuWwrQmtQValKgJgk1SahJnpo0UpMyNclSQDUMmYbBU4DQMAgNQ6GrRW2S7AaINAyRhiHTMDgaBk/DIBRQaBi0IvT7ARINQ4SrRb0ehZrkqUmemlRNU6Bh0K7HSE2K1KRETaq7bCnA0TB4GgahYQgUUGgYtCaN1KRMTbIUUA9DpmFwFCA0DEpA/X9WoWnSmiT7ASINQ6RhyBTgaBg8DYNQQKBhUK7Hnqq4Akg0DBGuFu16FGqSpyZ5atJITbLUpEhNitSkRE1acdlSgKOrxdM0CQ0DBhQaBqVJIzUpU5MsBayEIVOAo2kSGgYMKDQMSpMCBQhVUahJnpo0UpMyfdQsNWklDIECdOsxURXXAOmnJxD6omxa8JeX/zUNbS/Ke+vzbQ363XT53nst7Uf66Xm5ztqP9KcK4KQFDBXAg4EjDAaO0Bk2wlnfvzzCqQFgHhYAqQWw5MJg2Ajnpv6FEZ7aAPf3ODQCzPm2f2rtN8OETnB3j0M74OYQpw39pv88xDRtG+D9efzovszz/LppgOs1TK/zRx3MVsJl/lfdVsLhE3D8ccDhDwOO9BIfKeDrDL1hI2y+gq9beAQA0x+Pi/1vhq86U19TQfcAAAAASUVORK5CYII=","u":""},{"id":"4","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]}
\ No newline at end of file
+{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#172b4c"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"207","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[210,210]},"s":{"a":0,"k":[130,130,92.857]},"p":{"a":0,"k":[275.5,280.5,0]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"115","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"116","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"117","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"118","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"119","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":6},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"120","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"121","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":8},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"122","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":9}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":420,"h":420,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"3","e":1,"w":68,"h":69,"p":"data:image/png;base64,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","u":""},{"id":"4","e":1,"w":64,"h":168,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACoCAYAAABQfugxAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAcRSURBVHgB7Z3PbltFFMa/ufc6LUVqUxWVsurtHgSR0kUlJCLxAol4AXiClieo+wZlxbZ9grZbWBD+iUUqNUisWNBbCVQWUAqiTUjsGWYcO7LUJpFnznc8E/hJluXaqXM/n3PmnPmmLvA//20MiPTv/LE4wHClquqLsINLxlRn/Fu2L3+166yzj/zzXQ272V87vwkFGggSLniI4WplzHv+QlYcbFsHjZ31D6vxq9yBP1+NX2Nddc/frUIBEQH6d35bdaa66i94pdoPKodYjMFFKBEtQPi0bYWrxtlr/lIXUy74RcwilIgSIFy8M/aBcWjBoYUS0UXw+t3fJT/yFzBu51J/7Y0OZCpEYzpQqVXSIEEALkNU70CBFAE6ULF5R4AbNS08DEwLBbJNgb2ukU98BPjWFVRc3jWggnsKKibvGmBRkQXQaYaiBajpKRA6zsctyCQUwaYDHX4zlO0qEDBVjz4VRgvQXzvbgczADs+CTGoEkAuha0EmUQBDFcDvEOWbAmM6UMk+AujNUAsySQI45/4El7yXQf48gMWw/QYiSQLw54HAdr4CKMwDvhk6+TaIJKYA6AKwm6EkARrUHehwl8LMO0F+M5S9AH6pzTcF/EAUBKCKwPYJBcZhU3Q3KCCAZacBtRmSiIAOdLbzFUBhHvA0LUgIRAC/HR7CtCCRHgEKSyHTJyyiBjB9wkIiwLQgkSxAo1ADmM2QQApoGCQm5xqgkQI8nzBZgPE8QIflEwpZYxrdIMcnzNobnIZ1aEpKgA50bL4RwD4wFWA1Q0IRoNELcA5NyUSAylLI2RwtaBUwLQgUswqA1AyJCKBxYCrAaIaEIkBjHgjIN0MlpQDl0JSIABoHpgIMn1AyAopcCgUFMEX6hJIR0IEMwycUFECjHTbihyXEBNAxSJDvMuh0miFxn1BMAJ0DU4HtPAXQODAVkD40JZgCKrvD4s2QmAA6B6YCss1QYZ2gfDMkJoDWPCDdDElPg8X5hMICmOKcYmEBrEYdyLMP2ENjc1R2a0xUAKV5AJKHpoQjQKcdljw0JRsBSr2ApE9YZA2Q9AmLjABJn1BUgEZtJJb7cgXhFNAySEyuNUCrCMr5hKICaB2YGr2XUDNEsMZ0VgIpn7Aob3AaqUNTDAE6qGDzjACNA1MBqWao2BSQaobkI0DptIjU5mjBq4BpIUCxKQChnSFxAWq1FJDxCQkRoDUPBHZbJFJyCogcmhIXQMsgCUj4hKwI0NoXaJEISQBTjE/IioAOCkj4hCQBnNLeYPqhKYoAegYJcuwDNOeB9GaIIoDeganAdn4CaB2Y2iPNJySlgNrucLJPSBFA78BUIK0ZKrwTTG+GihcgtRmiCKBpkKQemiKOw2pbY/ktg3vYInxCogBVET4hTQAtg2SP+GaIGAGuiGaIFwGKS2GKT3gMVoE0n7DoXeEJKT4hTQBFgwQph6aIEaBpkJgca4AqLSKhCaBpkIzeL7IZYkeA4lIYd2iKLIDRmwojfUKyAGoDkfcJdy8hAnYEdFAithmiCqBokEQ3Q+QI0PQH4jZHuRGgugqYFhEcmxqASJ/wuHSCgSifkCqA7kAU2M5LAH1m3xo7ZgLMvuocJwG6/tr5TczIsRHAOPcxImiQIafqXbxSD0a3QK+26Bm7//yuq7A7rPafu3DyGV5/dbDZx+yQBQi7QvbgZ/1Fnen9g9MLOzi3sIXTvR2cagaIfC/EYEDm+t0nX/jitDJ5HC703Iltf9u7l+Ly5ctR10JPgdWLj9Ye/908rAwWwyc9HcqCzFz8JtCL4NLS0tPXTmzdC5826eJhbbwNp7IKDIfDPoj4sXsdkagIcOXKlc7/krdBoq7rfFNgAjMKmqbJXwBiFGyGOoNIVDtBRhQYY6I//YCqACEKfMW+AUF8VN1FAuqzwMLCwk0IbpX5/P8eCagLEPLVR8EnkCHkf4cE5jINjqOgQyI+/L9EInMRYFy1P0IivgAm5f/o78Ac2djY8IMSVhBH5wegKDtsmrluiAwGgxAFUQXRh/89CDBXAcKy6O+ilsVer3cTAsx9S8yHcbiQ9Vl+xuf+rdTqPyGLPcGjUuHJczO6TZBsqedaBKe5f//+qr+wO5PHW7vAVw9rfP2TwdZg79d884LDB28Nb73/7nLyCjIhm13h5eXlsKSN6sGT58Cn3zX47Mdq/+IDP/xq0P+8EfnihAlZbYv7etD3dzc2fq7wy18vD07/p6sr/QfZfpdYMkGEb7vq0AlvOMSHECJLY+TZzhGlqZL7jxZydYYODXEj+O3SRVpjzpg8v1GyRHIVQO8fXiJHjp7zOwiRpQC2wuFzvnVJ22DTZCnAN/2ldRzyKdf1bMPTYWRbBK1xB/X73Xp/KWkrfJpsBRhFgXEv7BUcIkwU2UyDB+H7/tZaXAtrvzPu9jg9xPgXx2U9u5p6cLkAAAAASUVORK5CYII=","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"6","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]}
\ No newline at end of file
diff --git a/core/designsystem/src/main/res/raw/mission_letter_open.json b/core/designsystem/src/main/res/raw/mission_letter_open.json
new file mode 100644
index 00000000..0e60c6cc
--- /dev/null
+++ b/core/designsystem/src/main/res/raw/mission_letter_open.json
@@ -0,0 +1 @@
+{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,-112.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,-49.14],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,-20.88],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,-15.193],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,-43.15],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,-38.925],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[0.832,-26.592],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0.797,-29.327],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-0.179,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.737,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[0.737,-55.475],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[0.737,-57.711],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[0.737,-56.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.737,-50.611],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.674,-45.655],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,15.889],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[1.355,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[1.253,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[1.253,13.261],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[1.146,11.963],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,-0.955],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-50.813,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-46.997,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-46.997,-0.797],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-42.983,-0.719],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-32.515,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-23.024,-32.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[-23.692,-49.423],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-25.624,-61.983],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-18.274,-89.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[-18.274,-79.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[-18.274,-82.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,158.907],[139.386,149.762],[139.51,138.716],[138.056,127.67],[138.612,116.624],[139.571,105.579],[139.741,94.533],[139.649,83.487],[138.18,72.223],[149.838,72.749],[161.294,72.548],[172.75,73.166],[184.206,70.791],[195.648,71.702],[206.421,71.702],[218.562,72.164],[230.018,72.164],[241.474,70.884],[252.93,73.63],[264.28,72.565],[263.353,83.489],[264.575,95.79],[264.575,107.184],[264.282,118.293],[264.575,127.675],[264.096,138.72],[264.282,148.741],[264.158,159.976]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,139.536],[139.386,131.506],[139.51,121.807],[138.056,112.107],[138.612,102.408],[139.571,92.708],[139.741,83.009],[139.649,73.31],[138.18,63.419],[149.838,63.881],[161.294,63.705],[172.75,64.247],[184.206,62.162],[195.648,62.962],[206.421,62.962],[218.562,63.367],[230.018,63.367],[241.474,62.243],[252.93,64.655],[264.28,63.719],[263.353,73.311],[264.575,84.113],[264.575,94.118],[264.282,103.873],[264.575,112.111],[264.096,121.81],[264.282,130.61],[264.158,140.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,173.198],[128.887,165.954],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,165.145],[243.002,174.044]]}],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":46.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,149.493],[128.887,142.248],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,141.44],[243.002,150.339]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[258.086,137.873],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[247.206,131.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[201.315,115.384],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[201.315,101.318],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[184.119,91.397],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0,-0.082],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0,-0.573],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0,8.301],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0,-27.835],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0,-60.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[0,-50.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[0,-53.706],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-53.664],[81.481,53.664],[-81.481,53.664],[-81.481,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-47.122],[81.481,47.122],[-81.481,47.122],[-81.481,-47.122]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[74.521,-42.508],[74.521,42.508],[-74.521,42.508],[-74.521,-42.508]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-239.483,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-221.499,-2.252],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-221.499,-0.196],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-202.578,6.137],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[600.945,736.025],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[543.874,666.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[530.625,649.898],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[526.549,644.906],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[526.549,605.871],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[1127.494,1341.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[187.817,139.527],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[254.855,223],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[288.103,260.401],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[186.079,150.013],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":20.7,"s":[187.968,157.745],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.251,161.749],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.493,163.924],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.856,172.187],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[300.69,326.133],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[408.801,476.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[407.801,465.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":42.6,"s":[410.801,468.212],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.595],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-2],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[30.328,30.328],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[29.649,29.649],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[30.757,30.757],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[30.429,30.429],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[31.641,31.641],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[32.156,32.156],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[35.4,35.4],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[36.743,36.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[36.703,36.703],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[37.02,37.02],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":false,"nm":"뒷면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,520.788],[926.565,545.128],[926.442,569.092],[927.284,593.057],[926.179,617.029],[927.958,640.993],[925.522,664.966],[927.012,688.931],[926.521,712.904],[925.172,736.876],[928.072,760.84],[926.539,784.805],[926.337,808.777],[927.87,832.741],[926.013,856.714],[927.38,880.687],[925.768,904.66],[928.405,928.633],[926.863,952.606],[927.222,976.587],[916.839,1002.295],[893.559,1014.693],[869.078,1014.256],[844.614,1015.859],[820.141,1014.868],[795.669,1016.849],[771.197,1015.193],[746.725,1016.963],[722.261,1017.462],[697.789,1017.296],[673.308,1014.772],[648.835,1013.975],[624.363,1016.744],[599.891,1015.237],[575.419,1016.77],[550.946,1017.506],[526.474,1014.571],[501.993,1017.558],[477.521,1017.611],[453.048,1016.507],[428.576,1017.611],[404.095,1015.052],[379.623,1017.339],[355.15,1015.096],[330.678,1016.157],[306.197,1017.015],[281.725,1017.654],[257.244,1014.115],[232.772,1017.392],[208.29,1015.552],[183.809,1015.666],[159.328,1016.98],[134.646,1003.373],[124.841,976.587],[126.506,952.614],[127.925,928.65],[127.102,904.686],[125.2,880.713],[124.999,856.749],[128.144,832.777],[124.692,808.812],[124.876,784.84],[127.513,760.867],[125.069,736.903],[125.936,712.939],[127.365,688.966],[126.9,665.002],[124.832,641.029],[127.811,617.056],[124.973,593.083],[127.925,569.11],[127.741,545.137],[126.611,521.34],[145.747,507.005],[166.049,494.081],[187.428,482.787],[206.547,468.084],[226.112,454.047],[246.791,441.702],[266.462,427.84],[286.36,414.303],[306.775,401.554],[327.226,388.876],[346.424,374.287],[365.98,360.232],[387.035,348.448],[406.969,334.963],[427.288,322.074],[447.765,309.404],[468.277,296.787],[487.737,282.584],[512.84,272.157],[539.88,272.963],[564.72,283.214],[585.626,295.227],[606.077,307.923],[625.441,322.258],[646.032,334.735],[666.579,347.291],[686.065,361.442],[705.569,375.557],[726.782,387.097],[746.795,400.459],[765.87,415.232],[786.25,428.024],[805.308,442.823],[825.776,455.502],[845.928,468.654],[865.415,482.813],[886.505,494.545],[906.684,507.653]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,489.266],[926.565,512.133],[926.442,534.647],[927.284,557.16],[926.179,579.682],[927.958,602.196],[925.522,624.718],[927.012,647.232],[926.521,669.753],[925.172,692.275],[928.072,714.789],[926.539,737.302],[926.337,759.824],[927.87,782.338],[926.013,804.86],[927.38,827.382],[925.768,849.903],[928.405,872.425],[926.863,894.947],[927.222,917.477],[916.839,941.629],[893.559,953.277],[869.078,952.865],[844.614,954.372],[820.141,953.441],[795.669,955.302],[771.197,953.746],[746.725,955.409],[722.261,955.878],[697.789,955.722],[673.308,953.351],[648.835,952.602],[624.363,955.203],[599.891,953.787],[575.419,955.228],[550.946,955.919],[526.474,953.162],[501.993,955.968],[477.521,956.018],[453.048,954.98],[428.576,956.018],[404.095,953.614],[379.623,955.762],[355.15,953.655],[330.678,954.652],[306.197,955.458],[281.725,956.059],[257.244,952.734],[232.772,955.812],[208.29,954.083],[183.809,954.19],[159.328,955.425],[134.646,942.641],[124.841,917.477],[126.506,894.955],[127.925,872.441],[127.102,849.928],[125.2,827.406],[124.999,804.892],[128.144,782.371],[124.692,759.857],[124.876,737.335],[127.513,714.814],[125.069,692.3],[125.936,669.786],[127.365,647.265],[126.9,624.751],[124.832,602.229],[127.811,579.707],[124.973,557.185],[127.925,534.663],[127.741,512.141],[126.611,489.784],[145.747,476.317],[166.049,464.176],[187.428,453.565],[206.547,439.752],[226.112,426.565],[246.791,414.967],[266.462,401.944],[286.36,389.226],[306.775,377.249],[327.226,365.338],[346.424,351.632],[365.98,338.429],[387.035,327.357],[406.969,314.688],[427.288,302.58],[447.765,290.677],[468.277,278.823],[487.737,265.48],[512.84,255.684],[539.88,256.441],[564.72,266.072],[585.626,277.358],[606.077,289.285],[625.441,302.752],[646.032,314.474],[666.579,326.27],[686.065,339.565],[705.569,352.826],[726.782,363.667],[746.795,376.22],[765.87,390.099],[786.25,402.117],[805.308,416.02],[825.776,427.931],[845.928,440.287],[865.415,453.59],[886.505,464.612],[906.684,476.926]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":60,"v":"5.6.0","w":375}
\ No newline at end of file
diff --git a/core/designsystem/src/main/res/raw/mission_letter_tap.json b/core/designsystem/src/main/res/raw/mission_letter_tap.json
new file mode 100644
index 00000000..a308b021
--- /dev/null
+++ b/core/designsystem/src/main/res/raw/mission_letter_tap.json
@@ -0,0 +1 @@
+{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,5.274],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.832,-25.463],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[0.832,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.731,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.797,-28.198],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,13.331],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,18.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[1.414,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[1.242,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[1.355,17.956],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,8.281],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,0.818],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-53.049,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-46.593,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-50.813,0.865],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.959],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.958],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-33.946,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-29.814,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-32.515,-39.867],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,180.477],[178.692,170.09],[178.851,157.545],[176.987,145],[177.7,132.455],[178.929,119.909],[179.148,107.364],[179.03,94.819],[177.146,82.027],[192.092,82.623],[206.778,82.396],[221.465,83.098],[236.152,80.4],[250.82,81.435],[264.631,81.435],[280.196,81.96],[294.883,81.96],[309.569,80.506],[324.256,83.625],[338.807,82.415],[337.618,94.821],[339.184,108.792],[339.184,121.732],[338.809,134.35],[339.184,145.005],[338.57,157.55],[338.809,168.931],[338.65,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[156.973,180.477],[156.943,170.09],[157.083,157.545],[155.446,145],[156.072,132.455],[157.151,119.909],[157.344,107.364],[157.24,94.819],[155.585,82.027],[168.712,82.623],[181.611,82.396],[194.51,83.098],[207.409,80.4],[220.293,81.435],[232.422,81.435],[246.093,81.96],[258.992,81.96],[271.891,80.506],[284.79,83.625],[297.57,82.415],[296.526,94.821],[297.901,108.792],[297.901,121.732],[297.572,134.35],[297.901,145.005],[297.362,157.55],[297.572,168.931],[297.432,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[240.247,129.182],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[240.247,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[208.835,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[229.367,122.354],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-17.839,1.227],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-17.839,0.736],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-53.664],[91.974,53.664],[-91.974,53.664],[-91.974,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80.779,-53.664],[80.779,53.664],[-80.779,53.664],[-80.779,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-250.023,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-219.592,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-239.483,7.748],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[35.002,80.037]},"r":{"a":0,"k":0},"s":{"a":0,"k":[25.311,25.311]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":true,"nm":"뒷면","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.142,0.142,0.142]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":15,"v":"5.6.0","w":375}
\ No newline at end of file
diff --git a/core/remoteconfig/.gitignore b/core/remoteconfig/.gitignore
new file mode 100644
index 00000000..42afabfd
--- /dev/null
+++ b/core/remoteconfig/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/core/remoteconfig/build.gradle.kts b/core/remoteconfig/build.gradle.kts
new file mode 100644
index 00000000..61a87620
--- /dev/null
+++ b/core/remoteconfig/build.gradle.kts
@@ -0,0 +1,15 @@
+import com.yapp.convention.setNamespace
+
+plugins {
+ id("orbit.android.library")
+ id("orbit.android.hilt")
+}
+
+android {
+ setNamespace("core.remoteconfig")
+}
+
+dependencies {
+ implementation(platform(libs.firebase.bom))
+ implementation(libs.firebase.config)
+}
diff --git a/core/remoteconfig/consumer-rules.pro b/core/remoteconfig/consumer-rules.pro
new file mode 100644
index 00000000..e69de29b
diff --git a/core/remoteconfig/proguard-rules.pro b/core/remoteconfig/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/core/remoteconfig/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/core/remoteconfig/src/main/AndroidManifest.xml b/core/remoteconfig/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..8bdb7e14
--- /dev/null
+++ b/core/remoteconfig/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt
new file mode 100644
index 00000000..7427b54f
--- /dev/null
+++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt
@@ -0,0 +1,26 @@
+package com.yapp.remoteconfig
+
+import com.google.firebase.remoteconfig.FirebaseRemoteConfig
+import kotlinx.coroutines.tasks.await
+import javax.inject.Inject
+
+class FirebaseRemoteConfigManager @Inject constructor(
+ private val remoteConfig: FirebaseRemoteConfig,
+) {
+ suspend fun fetchAndActivate(): Boolean {
+ return try {
+ remoteConfig.fetchAndActivate().await()
+ } catch (e: Exception) {
+ false
+ }
+ }
+
+ fun getRawMissionType(): String {
+ val rawValue = remoteConfig.getString(KEY_MISSION_TYPE)
+ return rawValue
+ }
+
+ companion object {
+ private const val KEY_MISSION_TYPE = "alarm_mission_type"
+ }
+}
diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt
new file mode 100644
index 00000000..0b2928b1
--- /dev/null
+++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt
@@ -0,0 +1,35 @@
+package com.yapp.remoteconfig.di
+
+import com.google.firebase.ktx.Firebase
+import com.google.firebase.remoteconfig.FirebaseRemoteConfig
+import com.google.firebase.remoteconfig.ktx.remoteConfig
+import com.google.firebase.remoteconfig.ktx.remoteConfigSettings
+import com.yapp.remoteconfig.FirebaseRemoteConfigManager
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object RemoteConfigModule {
+
+ @Provides
+ @Singleton
+ fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig {
+ return Firebase.remoteConfig.apply {
+ setConfigSettingsAsync(
+ remoteConfigSettings {
+ minimumFetchIntervalInSeconds = 3600L
+ },
+ )
+ }
+ }
+
+ @Provides
+ @Singleton
+ fun provideRemoteConfigManager(
+ remoteConfig: FirebaseRemoteConfig,
+ ): FirebaseRemoteConfigManager = FirebaseRemoteConfigManager(remoteConfig)
+}
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
index 8944d6aa..b4250dc6 100644
--- a/core/ui/build.gradle.kts
+++ b/core/ui/build.gradle.kts
@@ -17,4 +17,5 @@ dependencies {
implementation(libs.orbit.compose)
implementation(libs.orbit.viewmodel)
implementation(libs.lottie.compose)
+ implementation(libs.play.services.ads)
}
diff --git a/core/ui/src/main/AndroidManifest.xml b/core/ui/src/main/AndroidManifest.xml
index 8bdb7e14..76073216 100644
--- a/core/ui/src/main/AndroidManifest.xml
+++ b/core/ui/src/main/AndroidManifest.xml
@@ -1,4 +1,3 @@
-
-
+
diff --git a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt
index 2a926524..baf7e50b 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt
@@ -1,7 +1,7 @@
package com.yapp.ui.component
+import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.shape.RoundedCornerShape
@@ -19,9 +19,14 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.PathMeasure
import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
import kotlinx.coroutines.launch
@@ -37,7 +42,9 @@ fun OrbitBottomSheet(
onDismissRequest: () -> Unit = {},
shape: Shape = RoundedCornerShape(topStart = 30.dp, topEnd = 30.dp),
containerColor: Color = OrbitTheme.colors.gray_800,
- content: @Composable ColumnScope.() -> Unit,
+ strokeColor: Color = OrbitTheme.colors.gray_700,
+ strokeThickness: Dp = 1.dp,
+ content: @Composable () -> Unit,
) {
val scope = rememberCoroutineScope()
if (isSheetOpen) {
@@ -54,7 +61,76 @@ fun OrbitBottomSheet(
containerColor = containerColor,
dragHandle = null,
) {
- content()
+ Box {
+ content()
+ BottomSheetTopRoundedStroke(
+ strokeColor = strokeColor,
+ strokeThickness = strokeThickness,
+ )
+ }
+ }
+ }
+}
+
+@Composable
+fun BottomSheetTopRoundedStroke(
+ modifier: Modifier = Modifier,
+ strokeColor: Color,
+ strokeThickness: Dp = 1.dp,
+ radius: Dp = 30.dp,
+) {
+ Canvas(
+ modifier = modifier
+ .fillMaxWidth()
+ .height(radius + strokeThickness), // Stroke 고려
+ ) {
+ val width = size.width
+ val height = size.height
+ val radiusPx = radius.toPx()
+ val fadeWidth = radiusPx // 양 끝에서 선이 얇아지는 범위
+
+ val path = Path().apply {
+ moveTo(0f, height) // 왼쪽 끝
+ arcTo(
+ rect = Rect(0f, 0f, radiusPx * 2, radiusPx * 2),
+ startAngleDegrees = 180f,
+ sweepAngleDegrees = 90f,
+ forceMoveTo = false,
+ )
+ lineTo(width - radiusPx, 0f)
+ arcTo(
+ rect = Rect(width - radiusPx * 2, 0f, width, radiusPx * 2),
+ startAngleDegrees = 270f,
+ sweepAngleDegrees = 90f,
+ forceMoveTo = false,
+ )
+ }
+
+ val pathMeasure = PathMeasure().apply { setPath(path, false) }
+ val totalLength = pathMeasure.length
+ val segmentCount = 100
+
+ for (i in 0 until segmentCount) {
+ val start = i * (totalLength / segmentCount)
+ val end = (i + 1) * (totalLength / segmentCount)
+
+ val segmentPath = Path()
+ if (pathMeasure.getSegment(start, end, segmentPath, true)) {
+ val minThickness = 0.dp.toPx()
+ val maxThickness = strokeThickness.toPx()
+
+ val thickness = when {
+ start < fadeWidth -> minThickness + (maxThickness - minThickness) * (start / fadeWidth)
+ start > totalLength - fadeWidth -> minThickness + (maxThickness - minThickness) * ((totalLength - start) / fadeWidth)
+ else -> maxThickness
+ }
+
+ drawPath(
+ path = segmentPath,
+ color = strokeColor,
+ style = Stroke(width = thickness),
+ )
+ }
}
}
}
diff --git a/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt
new file mode 100644
index 00000000..bd3a8e8b
--- /dev/null
+++ b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt
@@ -0,0 +1,34 @@
+package com.yapp.ui.component.banner
+
+import android.annotation.SuppressLint
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.viewinterop.AndroidView
+import com.google.android.gms.ads.AdRequest
+import com.google.android.gms.ads.AdSize
+import com.google.android.gms.ads.AdView
+import core.ui.R
+
+@SuppressLint("MissingPermission")
+@Composable
+fun AdsBanner(
+ modifier: Modifier = Modifier,
+) {
+ val adUnitId = stringResource(id = R.string.admob_ad_unit_id)
+
+ AndroidView(
+ modifier = modifier.fillMaxWidth(),
+ factory = { context ->
+ AdView(context).apply {
+ setAdSize(AdSize.BANNER)
+ this.adUnitId = adUnitId
+ loadAd(AdRequest.Builder().build())
+ }
+ },
+ update = { adView ->
+ adView.loadAd(AdRequest.Builder().build())
+ },
+ )
+}
diff --git a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt
index 04c1a925..b1c97a1d 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt
@@ -13,7 +13,10 @@ import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
@@ -21,6 +24,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
@Composable
fun OrbitButton(
@@ -28,6 +33,7 @@ fun OrbitButton(
modifier: Modifier = Modifier,
onClick: () -> Unit,
enabled: Boolean = false,
+ debounceTime: Long = 500L,
height: Dp = 54.dp,
containerColor: Color = OrbitTheme.colors.main,
contentColor: Color = OrbitTheme.colors.gray_900,
@@ -39,6 +45,8 @@ fun OrbitButton(
) {
val interactionSource = remember { MutableInteractionSource() }
val isPressed = interactionSource.collectIsPressedAsState().value
+ val coroutineScope = rememberCoroutineScope()
+ var isClickable by remember { mutableStateOf(true) }
val padding by animateDpAsState(
targetValue = if (isPressed) 2.dp else 0.dp,
@@ -46,9 +54,20 @@ fun OrbitButton(
label = "PaddingAnimation",
)
+ fun handleClick() {
+ if (isClickable) {
+ isClickable = false
+ onClick()
+ coroutineScope.launch {
+ delay(debounceTime)
+ isClickable = true
+ }
+ }
+ }
+
Button(
- onClick = onClick,
- enabled = enabled,
+ onClick = ::handleClick,
+ enabled = enabled && isClickable,
shape = shape,
colors = ButtonDefaults.buttonColors(
containerColor = if (isPressed) pressedContainerColor else containerColor,
diff --git a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt
index f947716f..60c06d43 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt
@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
@@ -26,12 +27,17 @@ fun LottieAnimation(
contentScale: ContentScale = ContentScale.FillWidth,
scaleXAdjustment: Float = 1f,
scaleYAdjustment: Float = 1f,
+ play: Boolean = iterations == 1,
+ restartOnPlay: Boolean = false,
onAnimationEnd: (() -> Unit)? = null,
) {
val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(resId))
- val progress by animateLottieCompositionAsState(
+ val isPlaying = remember { mutableStateOf(iterations == LottieConstants.IterateForever || play) }
+ val animationState = animateLottieCompositionAsState(
composition = composition,
iterations = iterations,
+ isPlaying = isPlaying.value,
+ restartOnPlay = restartOnPlay,
)
val alpha = remember { Animatable(0f) }
@@ -44,9 +50,18 @@ fun LottieAnimation(
}
}
- LaunchedEffect(progress) {
- if (progress == 1f) {
+ LaunchedEffect(play) {
+ if (play) {
+ isPlaying.value = true
+ }
+ }
+
+ LaunchedEffect(animationState.progress) {
+ if (animationState.progress == 1f) {
onAnimationEnd?.invoke()
+ if (iterations == 1) {
+ isPlaying.value = false
+ }
}
}
@@ -62,7 +77,7 @@ fun LottieAnimation(
if (composition != null) {
com.airbnb.lottie.compose.LottieAnimation(
composition = composition,
- progress = { progress },
+ progress = { animationState.progress },
modifier = Modifier.fillMaxSize(),
)
}
diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt
index b1b0d178..a246b5f5 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt
@@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
+import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.LocalTextSelectionColors
import androidx.compose.foundation.text.selection.TextSelectionColors
@@ -47,9 +48,10 @@ fun OrbitTextField(
modifier: Modifier = Modifier,
showWarning: Boolean = false,
isValid: Boolean = false,
- warningMessage: String,
+ warningMessage: String? = null,
focusRequester: FocusRequester? = null,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
+ keyboardActions: KeyboardActions = KeyboardActions.Default,
textAlign: TextAlign = TextAlign.Center,
enabled: Boolean = true,
) {
@@ -87,15 +89,18 @@ fun OrbitTextField(
onFocusChanged = { isFocused = it },
focusRequester = actualFocusRequester,
keyboardOptions = keyboardOptions,
+ keyboardActions = keyboardActions,
isValid = isValid,
isFocused = isFocused,
textAlign = textAlign,
enabled = enabled,
)
- Box {
- if (showWarning) {
- WarningMessage(warningMessage, textAlign)
+ when (showWarning) {
+ true -> warningMessage?.let {
+ WarningMessage(it, textAlign)
+ }
+ false -> {
}
}
}
@@ -134,30 +139,37 @@ private fun TextFieldContainer(
focusRequester: FocusRequester,
onFocusChanged: (Boolean) -> Unit,
keyboardOptions: KeyboardOptions,
+ keyboardActions: KeyboardActions,
textAlign: TextAlign,
enabled: Boolean,
) {
+ val outerBorderColor = when {
+ isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f)
+ isFocused && !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f)
+ isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f)
+ !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f)
+ else -> Color.Transparent
+ }
+
+ val innerBorderColor = when {
+ isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f)
+ isFocused && !isValid -> OrbitTheme.colors.alert
+ isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f)
+ !isValid -> OrbitTheme.colors.alert
+ else -> OrbitTheme.colors.gray_700
+ }
+
Box(
modifier = Modifier
.border(
width = 3.dp,
- color = when {
- isValid -> Color.Transparent
- isFocused && showWarning -> OrbitTheme.colors.alert.copy(alpha = 0.2f)
- isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f)
- else -> Color.Transparent
- },
+ color = outerBorderColor,
shape = RoundedCornerShape(18.dp),
)
.padding(2.dp)
.border(
width = 1.dp,
- color = when {
- isValid -> OrbitTheme.colors.gray_700
- isFocused && showWarning -> OrbitTheme.colors.alert
- isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f)
- else -> OrbitTheme.colors.gray_700
- },
+ color = innerBorderColor,
shape = RoundedCornerShape(16.dp),
)
.background(OrbitTheme.colors.gray_800, shape = RoundedCornerShape(16.dp))
@@ -185,7 +197,9 @@ private fun TextFieldContainer(
},
textAlign = textAlign,
),
+ singleLine = true,
keyboardOptions = keyboardOptions,
+ keyboardActions = keyboardActions,
cursorBrush = SolidColor(OrbitTheme.colors.white),
enabled = enabled,
decorationBox = { innerTextField ->
@@ -224,7 +238,7 @@ private fun TextFieldContainer(
},
)
- if (enabled && text.text.isNotEmpty()) {
+ if (enabled && text.text.isNotEmpty() && isFocused) {
Icon(
painter = painterResource(id = core.designsystem.R.drawable.ic_circle_delete),
contentDescription = "delete",
diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt
index 532c2aff..76ba98d8 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt
@@ -34,7 +34,6 @@ fun OrbitPickerItem(
modifier: Modifier = Modifier,
items: List,
state: PickerState = rememberPickerState(),
- startIndex: Int = 0,
visibleItemsCount: Int,
textModifier: Modifier = Modifier,
infiniteScroll: Boolean = true,
@@ -140,7 +139,7 @@ fun OrbitPickerItem(
0.2f
}
- val scaleY = 1f - (0.4f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f)
+ val scaleY = 1f - (0.2f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f)
Text(
text = getItemForIndex(index, items, infiniteScroll, visibleItemsMiddle),
diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt
index 606d88b8..7d90d39b 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt
@@ -10,13 +10,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.wrapContentHeight
-import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -26,7 +24,6 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
-import kotlinx.coroutines.delay
@Composable
fun OrbitYearMonthPicker(
@@ -35,45 +32,51 @@ fun OrbitYearMonthPicker(
initialLunar: String = "양력",
initialYear: String = "2000",
initialMonth: String = "1",
- initialDay: String = "01",
+ initialDay: String = "1",
onValueChange: (String, Int, Int, Int) -> Unit,
) {
val screenWidth = LocalConfiguration.current.screenWidthDp.dp
+
val lunarState = remember { mutableStateOf(initialLunar) }
- val yearState = remember { mutableStateOf(initialYear.toInt()) }
- val monthState = remember { mutableStateOf(initialMonth.toInt()) }
- val dayState = remember { mutableStateOf(initialDay.toInt()) }
- val dayItems = remember { mutableStateListOf() }
- LaunchedEffect(yearState.value, monthState.value) {
- val maxDay = getMaxDaysInMonth(yearState.value, monthState.value)
- dayItems.clear()
- dayItems.addAll((1..maxDay).map { it.toString().padStart(2, '0') })
+ val yearState = remember { mutableIntStateOf(initialYear.toInt()) }
+ val monthState = remember { mutableIntStateOf(initialMonth.toInt()) }
+
+ val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue)
+ val dayItems = (1..maxDay).map { it.toString() }
+
+ val startIndexYear = (1900..2024).map { it.toString() }.indexOf(initialYear).takeIf { it >= 0 } ?: 0
+ val startIndexMonth = (1..12).map { it.toString() }.indexOf(initialMonth).takeIf { it >= 0 } ?: 0
+ val startIndexDay = dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0
- if (dayState.value > maxDay) {
- dayState.value = maxDay
+ val dayState = remember { mutableIntStateOf(initialDay.toInt()) }
+
+ val yearPickerState = rememberPickerState(startIndex = startIndexYear)
+ val monthPickerState = rememberPickerState(startIndex = startIndexMonth)
+ val dayPickerState = rememberPickerState(startIndex = startIndexDay)
+
+ LaunchedEffect(yearState.intValue, monthState.intValue) {
+ val newMaxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue)
+ if (dayState.intValue > newMaxDay) {
+ dayState.intValue = newMaxDay
}
}
- LaunchedEffect(lunarState.value, yearState.value, monthState.value, dayState.value) {
- delay(300)
- onValueChange(lunarState.value, yearState.value, monthState.value, dayState.value)
+ LaunchedEffect(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue) {
+ onValueChange(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue)
}
Surface(
- modifier = modifier.fillMaxWidth().wrapContentHeight(),
+ modifier = modifier.fillMaxWidth(),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Bottom,
- modifier = Modifier.wrapContentSize().background(OrbitTheme.colors.gray_900),
+ modifier = Modifier.background(OrbitTheme.colors.gray_900),
) {
val lunarItems = listOf("양력", "음력")
val yearItems = (1900..2024).map { it.toString() }
- val startIndex = yearItems.indexOf(initialYear).takeIf { it >= 0 } ?: 0
- val yearPickerState = rememberPickerState(startIndex = startIndex)
val monthItems = (1..12).map { it.toString() }
- val dayStartIndex = remember { dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0 }
- val monthStartIndex = remember { monthItems.indexOf(initialMonth).takeIf { it >= 0 } ?: 0 }
+
Box(
modifier = Modifier.fillMaxWidth(),
) {
@@ -109,29 +112,29 @@ fun OrbitYearMonthPicker(
modifier = Modifier.width(screenWidth * 0.28f),
textModifier = Modifier.padding(8.dp),
infiniteScroll = false,
- onValueChange = { yearState.value = it.toInt() },
+ onValueChange = { yearState.intValue = it.toInt() },
)
OrbitPickerItem(
items = monthItems,
+ state = monthPickerState,
visibleItemsCount = 5,
itemSpacing = itemSpacing,
textStyle = OrbitTheme.typography.title2SemiBold,
modifier = Modifier.width(screenWidth * 0.16f),
textModifier = Modifier.padding(8.dp),
infiniteScroll = false,
- startIndex = monthStartIndex,
- onValueChange = { monthState.value = it.toInt() },
+ onValueChange = { monthState.intValue = it.toInt() },
)
OrbitPickerItem(
items = dayItems,
+ state = dayPickerState,
visibleItemsCount = 5,
itemSpacing = itemSpacing,
textStyle = OrbitTheme.typography.title2SemiBold,
modifier = Modifier.width(screenWidth * 0.16f),
textModifier = Modifier.padding(8.dp),
infiniteScroll = false,
- startIndex = dayStartIndex,
- onValueChange = { dayState.value = it.toInt() },
+ onValueChange = { dayState.intValue = it.toInt() },
)
}
}
diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt
index bd8258d8..120e3398 100644
--- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt
+++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt
@@ -9,7 +9,6 @@ class PickerState(
val lazyListState: LazyListState,
var selectedItem: String,
var startIndex: Int,
- var initialized: Boolean = false,
)
@Composable
diff --git a/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt
new file mode 100644
index 00000000..7f044eff
--- /dev/null
+++ b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt
@@ -0,0 +1,166 @@
+package com.yapp.ui.component.tooltip
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Outline
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Popup
+import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.utils.toPx
+import com.yapp.ui.utils.toRoundPx
+
+@Composable
+fun OrbitToolTip(
+ backgroundColor: Color = OrbitTheme.colors.gray_900,
+ textColor: Color = OrbitTheme.colors.gray_100,
+ textStyle: TextStyle = OrbitTheme.typography.label2SemiBold,
+ offset: IntOffset = IntOffset(0, 0),
+ text: String,
+) {
+ val popupOffset = IntOffset(
+ x = offset.x + 15.dp.toRoundPx(),
+ y = offset.y + 2.dp.toRoundPx(),
+ )
+
+ Popup(
+ alignment = Alignment.Center,
+ offset = popupOffset,
+ ) {
+ Column(
+ horizontalAlignment = Alignment.Start,
+ ) {
+ Row {
+ Spacer(modifier = Modifier.width(15.dp))
+
+ Spacer(
+ modifier = Modifier
+ .width(10.dp)
+ .height(5.dp)
+ .background(
+ color = backgroundColor,
+ shape = RoundedTopTriangleShape(1.dp.toPx()),
+ ),
+ )
+ }
+
+ Surface(
+ shape = RoundedCornerShape(8.dp),
+ color = backgroundColor,
+ ) {
+ Text(
+ modifier = Modifier.padding(
+ vertical = 6.dp,
+ horizontal = 10.dp,
+ ),
+ text = text,
+ style = textStyle,
+ color = textColor,
+ )
+ }
+ }
+ }
+}
+
+class RoundedTopTriangleShape(private val radius: Float) : Shape {
+ override fun createOutline(
+ size: Size,
+ layoutDirection: LayoutDirection,
+ density: Density,
+ ): Outline {
+ val path = Path().apply {
+ val topX = size.width / 2f
+ val topY = 0f
+ val bottomLeftX = 0f
+ val bottomLeftY = size.height
+ val bottomRightX = size.width
+ val bottomRightY = size.height
+
+ // 왼쪽 아래 꼭짓점 시작
+ moveTo(bottomLeftX, bottomLeftY)
+
+ lineTo(topX - radius, topY)
+
+ arcTo(
+ rect = Rect(
+ left = topX - radius,
+ top = topY,
+ right = topX + radius,
+ bottom = topY + (2 * radius),
+ ),
+ startAngleDegrees = 180f,
+ sweepAngleDegrees = 180f,
+ forceMoveTo = false,
+ )
+
+ lineTo(bottomRightX, bottomRightY)
+
+ close()
+ }
+
+ return Outline.Generic(path)
+ }
+}
+
+@Preview
+@Composable
+fun ReversedPopup() {
+ OrbitTheme {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(Color.Gray),
+ ) {
+ Box(
+ modifier = Modifier.align(Alignment.Center),
+ ) {
+ Box(
+ modifier = Modifier
+ .size(32.dp)
+ .clip(CircleShape)
+ .clickable {},
+ contentAlignment = Alignment.Center,
+ ) {
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_mail),
+ contentDescription = "Mail",
+ tint = OrbitTheme.colors.white,
+ )
+ }
+
+ OrbitToolTip(
+ text = "운세 도착",
+ offset = IntOffset(x = 0, y = 32.dp.toRoundPx()),
+ )
+ }
+ }
+ }
+}
diff --git a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt
index 5863a08e..f3ee0b15 100644
--- a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt
+++ b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt
@@ -6,10 +6,14 @@ import androidx.compose.foundation.indication
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput
@Composable
@@ -17,6 +21,8 @@ fun Modifier.customClickable(
rippleEnabled: Boolean = true,
rippleColor: Color? = null,
enabled: Boolean = true,
+ fadeOnPress: Boolean = false,
+ pressedAlpha: Float = 0.5f,
onClick: (() -> Unit)?,
onLongClick: (() -> Unit)? = null,
onPress: (() -> Unit)? = null,
@@ -30,19 +36,28 @@ fun Modifier.customClickable(
null
}
+ var isPressed by remember { mutableStateOf(false) }
+
this.then(
Modifier
.pointerInput(Unit) {
detectTapGestures(
onPress = {
+ isPressed = true
onPress?.invoke()
tryAwaitRelease()
+ isPressed = false
onRelease?.invoke()
},
onTap = { onClick?.invoke() },
onLongPress = { onLongClick?.invoke() },
)
}
+ .graphicsLayer {
+ if (fadeOnPress) {
+ alpha = if (isPressed) pressedAlpha else 1f
+ }
+ }
.indication(interactionSource, rippleIndication),
)
}
diff --git a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt
index f5dc35f7..ee23cd18 100644
--- a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt
+++ b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt
@@ -35,6 +35,7 @@ fun OrbitGenderToggle(
modifier: Modifier = Modifier,
height: Dp = 148.dp,
textStyle: TextStyle = OrbitTheme.typography.heading2SemiBold,
+ shape: RoundedCornerShape = RoundedCornerShape(16.dp),
) {
val interactionSource = remember { MutableInteractionSource() }
val isPressed by interactionSource.collectIsPressedAsState()
@@ -69,9 +70,9 @@ fun OrbitGenderToggle(
.border(
width = if (isPressed) 0.dp else 1.dp,
color = borderColor,
- shape = RoundedCornerShape(16.dp),
+ shape = shape,
)
- .background(backgroundColor, shape = RoundedCornerShape(16.dp))
+ .background(backgroundColor, shape = shape)
.clickable(
interactionSource = interactionSource,
indication = null,
diff --git a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt
index 5733c274..b08f3c85 100644
--- a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt
+++ b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt
@@ -8,3 +8,8 @@ import androidx.compose.ui.unit.Dp
fun Dp.toPx(): Float {
return with(LocalDensity.current) { this@toPx.toPx() }
}
+
+@Composable
+fun Dp.toRoundPx(): Int {
+ return with(LocalDensity.current) { this@toRoundPx.roundToPx() }
+}
diff --git a/data/build.gradle.kts b/data/build.gradle.kts
index 423f4426..f2c52f14 100644
--- a/data/build.gradle.kts
+++ b/data/build.gradle.kts
@@ -14,6 +14,7 @@ dependencies {
implementation(projects.core.network)
implementation(projects.core.datastore)
implementation(projects.core.media)
+ implementation(projects.core.remoteconfig)
ksp(libs.androidx.room.compiler)
implementation(libs.androidx.room.ktx)
diff --git a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt
index 14027c71..ed92d2db 100644
--- a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt
+++ b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt
@@ -2,10 +2,12 @@ package com.yapp.data.remote.di
import com.yapp.data.remote.repositoryimpl.DummyRepositoryImpl
import com.yapp.data.remote.repositoryimpl.FortuneRepositoryImpl
+import com.yapp.data.remote.repositoryimpl.RemoteConfigRepositoryImpl
import com.yapp.data.remote.repositoryimpl.SignUpRepositoryImpl
import com.yapp.data.remote.repositoryimpl.UserInfoRepositoryImpl
import com.yapp.domain.repository.DummyRepository
import com.yapp.domain.repository.FortuneRepository
+import com.yapp.domain.repository.RemoteConfigRepository
import com.yapp.domain.repository.SignUpRepository
import com.yapp.domain.repository.UserInfoRepository
import dagger.Binds
@@ -40,4 +42,10 @@ abstract class RepositoryModule {
abstract fun bindsFortuneRepository(
fortuneRepository: FortuneRepositoryImpl,
): FortuneRepository
+
+ @Binds
+ @Singleton
+ abstract fun bindsRemoteConfigRepository(
+ remoteConfigRepository: RemoteConfigRepositoryImpl,
+ ): RemoteConfigRepository
}
diff --git a/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt
new file mode 100644
index 00000000..e45ae5a1
--- /dev/null
+++ b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt
@@ -0,0 +1,17 @@
+package com.yapp.data.remote.repositoryimpl
+
+import com.yapp.domain.model.MissionType
+import com.yapp.domain.repository.RemoteConfigRepository
+import com.yapp.remoteconfig.FirebaseRemoteConfigManager
+import javax.inject.Inject
+
+class RemoteConfigRepositoryImpl @Inject constructor(
+ private val manager: FirebaseRemoteConfigManager,
+) : RemoteConfigRepository {
+
+ override suspend fun fetchAndActivate(): Boolean = manager.fetchAndActivate()
+
+ override fun getMissionType(): MissionType {
+ return MissionType.fromRemoteValue(manager.getRawMissionType())
+ }
+}
diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts
index de2c4bb0..e5567cb0 100644
--- a/domain/build.gradle.kts
+++ b/domain/build.gradle.kts
@@ -10,5 +10,5 @@ android {
}
dependencies {
- implementation(libs.gson)
+ implementation(libs.kotlinx.serialization.json)
}
diff --git a/domain/src/main/java/com/yapp/domain/model/Alarm.kt b/domain/src/main/java/com/yapp/domain/model/Alarm.kt
index 119a497a..f04d4148 100644
--- a/domain/src/main/java/com/yapp/domain/model/Alarm.kt
+++ b/domain/src/main/java/com/yapp/domain/model/Alarm.kt
@@ -2,11 +2,13 @@ package com.yapp.domain.model
import android.net.Uri
import android.os.Parcelable
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
import kotlinx.parcelize.Parcelize
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
@Parcelize
+@Serializable
data class Alarm(
val id: Long = 0,
@@ -37,11 +39,11 @@ data class Alarm(
companion object {
fun fromJson(json: String): Alarm {
- return Gson().fromJson(json, object : TypeToken() {}.type)
+ return Json.decodeFromString(json)
}
}
- override fun toString(): String = Uri.encode(Gson().toJson(this))
+ override fun toString(): String = Uri.encode(Json.encodeToString(this))
}
fun Alarm.copyFrom(source: Alarm): Alarm {
@@ -58,3 +60,17 @@ fun Alarm.copyFrom(source: Alarm): Alarm {
isAlarmActive = source.isAlarmActive,
)
}
+
+fun Alarm.toTimeString(): String {
+ val displayHour = if (isAm && hour == 12) {
+ 0 // 오전 12시는 0으로 표시
+ } else if (!isAm && hour != 12) {
+ hour + 12 // 오후 1시~11시에는 12를 더함
+ } else {
+ hour // 오전 1시~11시 및 오후 12시는 그대로 사용
+ }
+ val formattedHour = displayHour.toString().padStart(2, '0')
+ val formattedMinute = minute.toString().padStart(2, '0')
+
+ return "$formattedHour:$formattedMinute"
+}
diff --git a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt
index 8ed498de..beaead69 100644
--- a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt
+++ b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt
@@ -12,7 +12,7 @@ enum class AlarmDay(val bitValue: Int) {
}
fun AlarmDay.toDayOfWeek(): java.time.DayOfWeek {
- return java.time.DayOfWeek.of(this.ordinal + 1)
+ return java.time.DayOfWeek.of(((this.ordinal + 6) % 7) + 1)
}
fun Set.toRepeatDays(): Int {
@@ -24,3 +24,8 @@ fun Set.toRepeatDays(): Int {
fun Int.toAlarmDays(): Set {
return AlarmDay.entries.filterTo(mutableSetOf()) { (this and it.bitValue) != 0 }
}
+
+fun Int.toAlarmDayNames(): List {
+ return AlarmDay.entries.filter { (this and it.bitValue) != 0 }
+ .map { it.name.replaceFirstChar { char -> char.uppercase() } }
+}
diff --git a/domain/src/main/java/com/yapp/domain/model/MissionType.kt b/domain/src/main/java/com/yapp/domain/model/MissionType.kt
new file mode 100644
index 00000000..45388ee6
--- /dev/null
+++ b/domain/src/main/java/com/yapp/domain/model/MissionType.kt
@@ -0,0 +1,18 @@
+package com.yapp.domain.model
+
+sealed class MissionType {
+ data object Shake : MissionType()
+ data object Click : MissionType()
+
+ companion object {
+ fun fromRemoteValue(value: String): MissionType {
+ return when (value) {
+ "tap_mission" -> Click
+ "shake_mission" -> Shake
+ else -> {
+ Click
+ }
+ }
+ }
+ }
+}
diff --git a/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt
new file mode 100644
index 00000000..56709c6f
--- /dev/null
+++ b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt
@@ -0,0 +1,8 @@
+package com.yapp.domain.repository
+
+import com.yapp.domain.model.MissionType
+
+interface RemoteConfigRepository {
+ suspend fun fetchAndActivate(): Boolean
+ fun getMissionType(): MissionType
+}
diff --git a/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt
new file mode 100644
index 00000000..9df0611f
--- /dev/null
+++ b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt
@@ -0,0 +1,14 @@
+package com.yapp.domain.usecase
+
+import com.yapp.domain.model.MissionType
+import com.yapp.domain.repository.RemoteConfigRepository
+import javax.inject.Inject
+
+class GetMissionTypeUseCase @Inject constructor(
+ private val repository: RemoteConfigRepository,
+) {
+ suspend fun execute(): MissionType {
+ repository.fetchAndActivate()
+ return repository.getMissionType()
+ }
+}
diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts
index c0b81866..efc6eeec 100644
--- a/feature/alarm-interaction/build.gradle.kts
+++ b/feature/alarm-interaction/build.gradle.kts
@@ -11,13 +11,16 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.alarm)
implementation(projects.core.media)
implementation(projects.domain)
+ implementation(projects.core.datastore)
implementation(libs.orbit.core)
implementation(libs.orbit.compose)
implementation(libs.orbit.viewmodel)
implementation(libs.androidx.material.android)
implementation(libs.androidx.annotation)
- implementation(libs.gson)
+ implementation(libs.play.services.ads)
+ implementation(libs.kotlinx.serialization.json)
}
diff --git a/feature/alarm-interaction/src/main/AndroidManifest.xml b/feature/alarm-interaction/src/main/AndroidManifest.xml
index e1000761..76073216 100644
--- a/feature/alarm-interaction/src/main/AndroidManifest.xml
+++ b/feature/alarm-interaction/src/main/AndroidManifest.xml
@@ -1,4 +1,3 @@
-
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt
index 443027a5..5860eb6d 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt
@@ -16,14 +16,13 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.material3.Surface
import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.core.util.Consumer
import androidx.navigation.compose.NavHost
import com.yapp.alarm.AlarmConstants
import com.yapp.alarm.receivers.AlarmInteractionActivityReceiver
-import com.yapp.common.navigation.destination.AlarmInteractionDestination
import com.yapp.common.navigation.rememberOrbitNavigator
+import com.yapp.common.navigation.route.AlarmInteractionBaseRoute
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.domain.model.Alarm
import dagger.hilt.android.AndroidEntryPoint
@@ -70,11 +69,12 @@ class AlarmInteractionActivity : ComponentActivity() {
) {
NavHost(
navController = navigator.navController,
- startDestination = AlarmInteractionDestination.Route.route,
+ startDestination = AlarmInteractionBaseRoute,
modifier = Modifier.navigationBarsPadding(),
) {
alarmInteractionNavGraph(
navigator = navigator,
+ alarm = alarm,
)
}
}
@@ -89,7 +89,7 @@ class AlarmInteractionActivity : ComponentActivity() {
}
Log.d("AlarmInteractionActivity", "New Intent: $newIntent")
newAlarm?.let { alarm ->
- navigator.navController.navigate("${AlarmInteractionDestination.AlarmAction.route}/$alarm")
+ navigator.navigateToAlarmAction(alarm = alarm)
}
}
@@ -99,13 +99,6 @@ class AlarmInteractionActivity : ComponentActivity() {
this@AlarmInteractionActivity.removeOnNewIntentListener(onNewIntentConsumer)
}
}
-
- LaunchedEffect(Unit) {
- val route = "${AlarmInteractionDestination.AlarmAction.route}/$alarm"
- navigator.navController.navigate(route) {
- popUpTo(AlarmInteractionDestination.Route.route) { inclusive = true }
- }
- }
}
}
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt
index d87492e6..bc8d0035 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt
@@ -1,56 +1,75 @@
package com.yapp.alarm.interaction
+import android.os.Bundle
+import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavGraphBuilder
+import androidx.navigation.NavType
import androidx.navigation.compose.composable
-import androidx.navigation.navArgument
+import androidx.navigation.navOptions
import androidx.navigation.navigation
-import com.google.gson.Gson
import com.yapp.alarm.interaction.action.AlarmActionRoute
import com.yapp.alarm.interaction.snooze.AlarmSnoozeTimerRoute
-import com.yapp.common.navigation.JsonNavType
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.AlarmInteractionDestination
+import com.yapp.common.navigation.route.AlarmInteractionBaseRoute
+import com.yapp.common.navigation.route.AlarmInteractionDestination
import com.yapp.domain.model.Alarm
+import kotlinx.serialization.json.Json
+import kotlin.reflect.typeOf
-class AlarmArgType : JsonNavType() {
- override fun fromJsonParse(value: String): Alarm {
- return Gson().fromJson(value, Alarm::class.java)
+val AlarmArgType = object : NavType(isNullableAllowed = false) {
+ override fun get(bundle: Bundle, key: String): Alarm? {
+ return bundle.getString(key)?.let { Alarm.fromJson(it) }
}
- override fun Alarm.getJsonParse(): String {
- return Gson().toJson(this)
+ override fun parseValue(value: String): Alarm {
+ return Alarm.fromJson(value)
+ }
+
+ override fun put(bundle: Bundle, key: String, value: Alarm) {
+ bundle.putString(key, Json.encodeToString(Alarm.serializer(), value))
}
}
fun NavGraphBuilder.alarmInteractionNavGraph(
navigator: OrbitNavigator,
+ alarm: Alarm?,
) {
- navigation(
- route = AlarmInteractionDestination.Route.route,
- startDestination = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}",
+ navigation(
+ startDestination = AlarmInteractionDestination.Route,
) {
- composable(
- route = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}",
- arguments = listOf(
- navArgument("alarm") {
- type = AlarmArgType()
- defaultValue = Alarm()
- },
- ),
+ composable {
+ LaunchedEffect(Unit) {
+ alarm?.let {
+ navigator.navigateToAlarmAction(
+ it,
+ navOptions {
+ popUpTo(AlarmInteractionBaseRoute) {
+ inclusive = true
+ }
+ },
+ )
+ } ?: run {
+ navigator.navigateToHome(
+ navOptions {
+ popUpTo(AlarmInteractionBaseRoute) {
+ inclusive = true
+ }
+ },
+ )
+ }
+ }
+ }
+
+ composable(
+ typeMap = mapOf(typeOf() to AlarmArgType),
) {
AlarmActionRoute(
navigator = navigator,
)
}
- composable(
- route = "${AlarmInteractionDestination.AlarmSnoozeTimer.route}/{alarm}",
- arguments = listOf(
- navArgument("alarm") {
- type = AlarmArgType()
- defaultValue = Alarm()
- },
- ),
+ composable(
+ typeMap = mapOf(typeOf() to AlarmArgType),
) {
AlarmSnoozeTimerRoute(
navigator = navigator,
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt
index 0deed3a3..470f89c3 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt
@@ -1,5 +1,7 @@
package com.yapp.alarm.interaction.action
+import com.yapp.domain.model.Alarm
+import com.yapp.ui.base.SideEffect
import com.yapp.ui.base.UiState
class AlarmActionContract {
@@ -13,6 +15,7 @@ class AlarmActionContract {
val snoozeEnabled: Boolean = true,
val snoozeInterval: Int = 5,
val snoozeCount: Int = 5,
+ val isFirstMission: Boolean? = null,
) : UiState
sealed class Action {
@@ -21,10 +24,6 @@ class AlarmActionContract {
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
+ data class NavigateToAlarmSnooze(val alarm: Alarm) : SideEffect()
}
}
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt
index f77da04c..4db7ed7b 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Icon
@@ -30,6 +31,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.yapp.common.navigation.OrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.component.banner.AdsBanner
import com.yapp.ui.component.button.OrbitButton
import com.yapp.ui.component.lottie.LottieAnimation
import com.yapp.ui.utils.heightForScreenPercentage
@@ -47,12 +49,8 @@ internal fun AlarmActionRoute(
LaunchedEffect(sideEffect) {
sideEffect.collect { action ->
when (action) {
- is AlarmActionContract.SideEffect.Navigate -> {
- navigator.navigateTo(
- route = action.route,
- popUpTo = action.popUpTo,
- inclusive = action.inclusive,
- )
+ is AlarmActionContract.SideEffect.NavigateToAlarmSnooze -> {
+ navigator.navigateToAlarmSnoozeTimer(action.alarm)
}
}
}
@@ -83,6 +81,7 @@ internal fun AlarmActionScreen(
snoozeEnabled = state.snoozeEnabled,
snoozeInterval = state.snoozeInterval,
snoozeCount = state.snoozeCount,
+ isFirstMission = state.isFirstMission,
onSnoozeClick = { eventDispatcher(AlarmActionContract.Action.Snooze) },
onDismissClick = {
eventDispatcher(AlarmActionContract.Action.Dismiss)
@@ -118,64 +117,77 @@ private fun AlarmActionContent(
snoozeEnabled: Boolean,
snoozeInterval: Int,
snoozeCount: Int,
+ isFirstMission: Boolean?,
onSnoozeClick: () -> Unit,
onDismissClick: () -> Unit,
) {
- Column(
- modifier = Modifier
- .fillMaxSize()
- .background(
- color = Color(0xFF496381),
- ),
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Spacer(
- modifier = Modifier.heightForScreenPercentage(
- 0.17f,
- ),
- )
+ Box(modifier = Modifier.statusBarsPadding()) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(
+ color = Color(0xFF496381),
+ ),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ Spacer(
+ modifier = Modifier.heightForScreenPercentage(
+ 0.17f,
+ ),
+ )
- AlarmTime(
- isAm = isAm,
- hour = hour,
- minute = minute,
- todayDate = todayDate,
- )
+ AlarmTime(
+ isAm = isAm,
+ hour = hour,
+ minute = minute,
+ todayDate = todayDate,
+ )
- Spacer(modifier = Modifier.height(102.dp))
+ Spacer(modifier = Modifier.height(102.dp))
- Icon(
- painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character),
- tint = Color(0xFF07203E),
- contentDescription = "Alarm Action Character",
- )
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character),
+ tint = Color(0xFF07203E),
+ contentDescription = "Alarm Action Character",
+ )
- Spacer(modifier = Modifier.height(56.dp))
+ Spacer(modifier = Modifier.height(56.dp))
- if (snoozeEnabled && snoozeCount != 0) {
- AlarmSnoozeButton(
- snoozeInterval = snoozeInterval,
- snoozeCount = snoozeCount,
- onSnoozeClick = onSnoozeClick,
- )
- } else {
- Spacer(modifier = Modifier.height(54.dp))
- }
+ if (snoozeEnabled && snoozeCount != 0) {
+ AlarmSnoozeButton(
+ snoozeInterval = snoozeInterval,
+ snoozeCount = snoozeCount,
+ onSnoozeClick = onSnoozeClick,
+ )
+ } else {
+ Spacer(modifier = Modifier.height(54.dp))
+ }
- Spacer(modifier = Modifier.weight(1f))
+ Spacer(modifier = Modifier.weight(1f))
- OrbitButton(
- label = stringResource(id = R.string.alarm_off_btn),
- enabled = true,
- modifier = Modifier
- .padding(
- start = 40.dp,
- end = 40.dp,
- bottom = 48.dp,
+ if (isFirstMission != null) {
+ OrbitButton(
+ label = if (isFirstMission) {
+ stringResource(id = R.string.alarm_off_mission_start_btn)
+ } else {
+ stringResource(id = R.string.alarm_off_btn)
+ },
+ enabled = true,
+ modifier = Modifier
+ .padding(
+ start = 40.dp,
+ end = 40.dp,
+ bottom = 48.dp,
+ )
+ .height(62.dp),
+ onClick = onDismissClick,
)
- .height(62.dp),
- onClick = onDismissClick,
- )
+ } else {
+ Spacer(modifier = Modifier.height(62.dp))
+ }
+ }
+
+ AdsBanner()
}
}
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt
index 548c79b0..57e6cd8c 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt
@@ -5,18 +5,25 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent
import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozeIntent
-import com.yapp.common.navigation.Routes
+import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
+import java.time.LocalDate
+import java.time.LocalTime
+import java.time.format.DateTimeFormatter
+import java.time.format.TextStyle
+import java.util.Locale
import javax.inject.Inject
@HiltViewModel
class AlarmActionViewModel @Inject constructor(
private val app: Application,
+ private val userPreferences: UserPreferences,
savedStateHandle: SavedStateHandle,
) : BaseViewModel(
AlarmActionContract.State(),
@@ -25,6 +32,7 @@ class AlarmActionViewModel @Inject constructor(
private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) }
init {
+ fetchIsFirstMission()
updateState {
copy(
snoozeEnabled = alarm?.isSnoozeEnabled ?: false,
@@ -36,12 +44,24 @@ class AlarmActionViewModel @Inject constructor(
startClock()
}
+ private fun fetchIsFirstMission() {
+ viewModelScope.launch {
+ val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull()
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ val isFirstMission = fortuneDate != todayDate
+
+ updateState {
+ copy(isFirstMission = isFirstMission)
+ }
+ }
+ }
+
private fun startClock() {
viewModelScope.launch {
while (isActive) {
- val now = java.time.LocalTime.now()
- val today = java.time.LocalDate.now()
- val dayOfWeek = today.dayOfWeek.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.KOREAN)
+ val now = LocalTime.now()
+ val today = LocalDate.now()
+ val dayOfWeek = today.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN)
updateState {
copy(
@@ -76,13 +96,9 @@ class AlarmActionViewModel @Inject constructor(
},
)
}
- emitSideEffect(
- AlarmActionContract.SideEffect.Navigate(
- route = "${Routes.AlarmInteraction.ALARM_SNOOZE_TIMER}/$alarm",
- popUpTo = Routes.AlarmInteraction.ALARM_ACTION,
- inclusive = true,
- ),
- )
+ alarm?.let {
+ emitSideEffect(AlarmActionContract.SideEffect.NavigateToAlarmSnooze(it))
+ }
}
private fun dismiss() {
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt
index ba6e652e..dcca8639 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt
@@ -9,17 +9,12 @@ class AlarmSnoozeTimerContract {
val alarmTimeStamp: Long = 0L,
val remainingSeconds: Int = 1,
val totalSeconds: Int = 300,
+ val isFirstMission: Boolean? = null,
) : UiState
sealed class Action {
data object Dismiss : Action()
}
- sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
- }
+ sealed class SideEffect : com.yapp.ui.base.SideEffect
}
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt
index a607dd85..e914f506 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt
@@ -57,17 +57,7 @@ internal fun AlarmSnoozeTimerRoute(
val sideEffect = viewModel.container.sideEffectFlow
LaunchedEffect(sideEffect) {
- sideEffect.collect { action ->
- when (action) {
- is AlarmSnoozeTimerContract.SideEffect.Navigate -> {
- navigator.navigateTo(
- route = action.route,
- popUpTo = action.popUpTo,
- inclusive = action.inclusive,
- )
- }
- }
- }
+ sideEffect.collect { }
}
AlarmSnoozeTimerScreen(
@@ -90,6 +80,7 @@ internal fun AlarmSnoozeTimerScreen(
AlarmSnoozeContent(
remainingSeconds = state.remainingSeconds,
totalSeconds = state.totalSeconds,
+ isFirstMission = state.isFirstMission,
onDismissClick = {
eventDispatcher(AlarmSnoozeTimerContract.Action.Dismiss)
(context as? ComponentActivity)?.finish()
@@ -119,6 +110,7 @@ private fun AlarmSnoozeLoadingScreen() {
private fun AlarmSnoozeContent(
remainingSeconds: Int,
totalSeconds: Int,
+ isFirstMission: Boolean?,
onDismissClick: () -> Unit,
) {
Column(
@@ -147,9 +139,14 @@ private fun AlarmSnoozeContent(
)
}
- AlarmOffButton(
- onClick = onDismissClick,
- )
+ if (isFirstMission != null) {
+ AlarmOffButton(
+ onClick = onDismissClick,
+ isFirstMission = isFirstMission,
+ )
+ } else {
+ Spacer(modifier = Modifier.height(58.dp))
+ }
Spacer(modifier = Modifier.height(48.dp))
}
@@ -273,6 +270,7 @@ private fun formatSecondsToTime(seconds: Int): String {
private fun AlarmOffButton(
modifier: Modifier = Modifier,
onClick: () -> Unit,
+ isFirstMission: Boolean,
height: Dp = 58.dp,
containerColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f),
contentColor: Color = OrbitTheme.colors.white,
@@ -291,7 +289,11 @@ private fun AlarmOffButton(
),
) {
Text(
- text = stringResource(id = R.string.alarm_off_btn),
+ text = if (isFirstMission) {
+ stringResource(id = R.string.alarm_off_mission_start_btn)
+ } else {
+ stringResource(id = R.string.alarm_off_btn)
+ },
style = OrbitTheme.typography.headline2SemiBold,
)
}
diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt
index 5ec0c4cd..6076cf8c 100644
--- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt
+++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt
@@ -4,14 +4,18 @@ import android.app.Application
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent
+import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
+import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
+import java.time.format.DateTimeFormatter
import javax.inject.Inject
import kotlin.math.max
@@ -19,6 +23,7 @@ import kotlin.math.max
class AlarmSnoozeTimerViewModel @Inject constructor(
private val app: Application,
savedStateHandle: SavedStateHandle,
+ private val userPreferences: UserPreferences,
) : BaseViewModel(
AlarmSnoozeTimerContract.State(),
) {
@@ -26,9 +31,22 @@ class AlarmSnoozeTimerViewModel @Inject constructor(
private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) }
init {
+ fetchIsFirstMission()
startClock()
}
+ private fun fetchIsFirstMission() {
+ viewModelScope.launch {
+ val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull()
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ val isFirstMission = fortuneDate != todayDate
+
+ updateState {
+ copy(isFirstMission = isFirstMission)
+ }
+ }
+ }
+
private fun startClock() {
viewModelScope.launch {
val nowMillis = System.currentTimeMillis()
diff --git a/feature/alarm-interaction/src/main/res/values/strings.xml b/feature/alarm-interaction/src/main/res/values/strings.xml
index f7e9dc83..0c4fd8b9 100644
--- a/feature/alarm-interaction/src/main/res/values/strings.xml
+++ b/feature/alarm-interaction/src/main/res/values/strings.xml
@@ -2,6 +2,7 @@
%d분 미루기
알람끄기
+ 미션 시작
알람 미루기
남은 시간
diff --git a/feature/fortune/build.gradle.kts b/feature/fortune/build.gradle.kts
index d82201b5..ac291d36 100644
--- a/feature/fortune/build.gradle.kts
+++ b/feature/fortune/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.datastore)
implementation(libs.orbit.core)
implementation(libs.orbit.compose)
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt
index 0083828d..6c7528e0 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt
@@ -25,11 +25,9 @@ sealed class FortuneContract {
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
+ data object NavigateToFortuneReward : SideEffect()
+
+ data object NavigateToHome : SideEffect()
data object NavigateBack : SideEffect()
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt
index d0a0b1d2..5f1b5133 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt
@@ -1,74 +1,94 @@
package com.yapp.fortune
import androidx.compose.material3.SnackbarHostState
-import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.rememberCoroutineScope
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
+import androidx.navigation.navOptions
import androidx.navigation.navigation
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.FortuneDestination
import com.yapp.common.navigation.extensions.sharedHiltViewModel
+import com.yapp.common.navigation.route.FortuneBaseRoute
+import com.yapp.common.navigation.route.FortuneDestination
import com.yapp.ui.component.snackbar.showCustomSnackBar
+import kotlinx.coroutines.CoroutineScope
fun NavGraphBuilder.fortuneNavGraph(
navigator: OrbitNavigator,
snackBarHostState: SnackbarHostState,
) {
- navigation(
- route = FortuneDestination.Route.route,
- startDestination = FortuneDestination.Fortune.route,
- ) {
- FortuneDestination.routes.forEach { destination ->
- composable(destination.route) { backStackEntry ->
- val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
- val coroutineScope = rememberCoroutineScope()
+ navigation(startDestination = FortuneDestination.Fortune) {
+ composable { backStackEntry ->
+ val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
+ val coroutineScope = rememberCoroutineScope()
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- when (sideEffect) {
- is FortuneContract.SideEffect.Navigate -> navigator.navigateTo(
- route = sideEffect.route,
- popUpTo = sideEffect.popUpTo,
- inclusive = sideEffect.inclusive,
- )
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collect { sideEffect ->
+ handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope)
+ }
+ }
- FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack()
+ FortuneRoute(
+ viewModel = viewModel,
+ navigator = navigator,
+ )
+ }
- is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar(
- scope = coroutineScope,
- snackBarHostState = snackBarHostState,
- message = sideEffect.message,
- actionLabel = sideEffect.label,
- iconRes = sideEffect.iconRes,
- bottomPadding = sideEffect.bottomPadding,
- durationMillis = sideEffect.durationMillis,
- onDismiss = sideEffect.onDismiss,
- onAction = sideEffect.onAction,
- )
- }
- }
- }
+ composable { backStackEntry ->
+ val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
+ val coroutineScope = rememberCoroutineScope()
- when (destination) {
- FortuneDestination.Fortune -> FortuneRoute(viewModel)
- FortuneDestination.Reward -> FortuneRewardRoute(viewModel)
- else -> {}
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collect { sideEffect ->
+ handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope)
}
}
+
+ FortuneRewardRoute(
+ viewModel = viewModel,
+ )
}
}
}
-@Composable
-private fun handleFortuneSideEffect(
+private suspend fun handleSideEffect(
sideEffect: FortuneContract.SideEffect,
navigator: OrbitNavigator,
snackBarHostState: SnackbarHostState,
+ coroutineScope: CoroutineScope,
) {
- val coroutineScope = rememberCoroutineScope()
+ when (sideEffect) {
+ FortuneContract.SideEffect.NavigateToFortuneReward -> {
+ navigator.navigateToFortuneReward(
+ navOptions = navOptions {
+ popUpTo(FortuneDestination.Fortune) {
+ inclusive = true
+ }
+ },
+ )
+ }
+
+ FortuneContract.SideEffect.NavigateToHome -> navigator.navigateToHome(
+ navOptions = navOptions {
+ popUpTo(FortuneBaseRoute) {
+ inclusive = true
+ }
+ },
+ )
+
+ FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack()
- LaunchedEffect(sideEffect) {
+ is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar(
+ scope = coroutineScope,
+ snackBarHostState = snackBarHostState,
+ message = sideEffect.message,
+ actionLabel = sideEffect.label,
+ iconRes = sideEffect.iconRes,
+ bottomPadding = sideEffect.bottomPadding,
+ durationMillis = sideEffect.durationMillis,
+ onDismiss = sideEffect.onDismiss,
+ onAction = sideEffect.onAction,
+ )
}
}
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt
index 0997bfcd..868464e8 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt
@@ -28,6 +28,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.fortune.component.FortuneTopAppBar
import com.yapp.ui.component.button.OrbitButton
@@ -37,9 +39,16 @@ import com.yapp.ui.utils.heightForScreenPercentage
fun FortuneRewardRoute(
viewModel: FortuneViewModel = hiltViewModel(),
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
val state = viewModel.container.stateFlow.collectAsStateWithLifecycle()
LaunchedEffect(state.value.fortuneImageId) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_talisman_view",
+ ),
+ )
+
val imageId = state.value.fortuneImageId ?: viewModel.getRandomImage()
viewModel.saveFortuneImageIdIfNeeded(imageId)
}
@@ -48,7 +57,14 @@ fun FortuneRewardRoute(
state = state,
onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) },
onCompleteClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) },
- onSaveImage = { viewModel.onAction(FortuneContract.Action.SaveImage(it)) },
+ onSaveImage = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_talisman_save",
+ ),
+ )
+ viewModel.onAction(FortuneContract.Action.SaveImage(it))
+ },
)
}
@@ -97,7 +113,7 @@ fun FortuneRewardScreen(
.fillMaxWidth()
.padding(start = 30.dp)
.align(Alignment.Start),
- text = "$nickName\n부적에 소원을 적으면\n이루어질거야!",
+ text = "$nickName\n부적을 가지고 있으면\n행운이 찾아올거야",
style = OrbitTheme.typography.H1,
color = OrbitTheme.colors.white,
)
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt
index 79929d26..0b7357bc 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt
@@ -1,16 +1,22 @@
package com.yapp.fortune
+import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding
+import androidx.compose.foundation.layout.size
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -20,15 +26,23 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
+import com.yapp.common.navigation.OrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.fortune.component.FortuneTopAppBar
import com.yapp.fortune.component.SlidingIndicator
import com.yapp.fortune.page.FortunePager
+import com.yapp.ui.component.lottie.LottieAnimation
+import java.math.BigDecimal
+import java.math.RoundingMode
@Composable
fun FortuneRoute(
viewModel: FortuneViewModel = hiltViewModel(),
+ navigator: OrbitNavigator,
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
val pagerState = rememberPagerState(
@@ -36,7 +50,60 @@ fun FortuneRoute(
pageCount = { state.fortunePages.size + 2 },
)
+ var startTime by remember { mutableLongStateOf(System.currentTimeMillis()) }
+ var previousPage by remember { mutableIntStateOf(pagerState.currentPage) }
+
+ BackHandler {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_exit",
+ properties = mapOf(
+ AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1,
+ ),
+ ),
+ )
+ navigator.navigateBack()
+ }
+
LaunchedEffect(pagerState.currentPage) {
+ val eventType = when (pagerState.currentPage) {
+ 0 -> "fortune_view_today"
+ 1 -> "fortune_view_category1"
+ 2 -> "fortune_view_category2"
+ 3 -> "fortune_view_style"
+ 4 -> "fortune_view_refer"
+ 5 -> "fortune_view_end"
+ else -> ""
+ }
+
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = eventType,
+ properties = mapOf(
+ AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1,
+ ),
+ ),
+ )
+
+ if (pagerState.currentPage != previousPage) {
+ val endTime = System.currentTimeMillis()
+ val duration = ((endTime - startTime).toDouble() / 1000) // 초 단위로 변환
+ val truncatedDuration = BigDecimal(duration).setScale(2, RoundingMode.DOWN).toDouble()
+
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_time_spent",
+ properties = mapOf(
+ AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to previousPage + 1,
+ AnalyticsEvent.FortunePropertiesKeys.DURATION to truncatedDuration,
+ ),
+ ),
+ )
+
+ startTime = endTime
+ previousPage = pagerState.currentPage
+ }
+
if (state.currentStep != pagerState.currentPage) {
viewModel.onAction(FortuneContract.Action.UpdateStep(pagerState.currentPage))
}
@@ -46,7 +113,18 @@ fun FortuneRoute(
state = state,
pagerState = pagerState,
onNextStep = { viewModel.onAction(FortuneContract.Action.NextStep) },
- onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) },
+ onNavigateToHome = { viewModel.onAction(FortuneContract.Action.NavigateToHome) },
+ onCloseClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_exit",
+ properties = mapOf(
+ AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1,
+ ),
+ ),
+ )
+ viewModel.onAction(FortuneContract.Action.NavigateToHome)
+ },
)
}
@@ -55,6 +133,7 @@ fun FortuneScreen(
state: FortuneContract.State,
pagerState: PagerState,
onNextStep: () -> Unit,
+ onNavigateToHome: () -> Unit,
onCloseClick: () -> Unit,
) {
val backgroundRes = when (state.currentStep) {
@@ -69,35 +148,56 @@ fun FortuneScreen(
.background(Color(0xFF4891F0))
.navigationBarsPadding(),
) {
- Image(
- painter = painterResource(id = backgroundRes),
- contentDescription = null,
- contentScale = ContentScale.Crop,
- modifier = Modifier.matchParentSize(),
- )
- Column(
- modifier = Modifier.fillMaxSize(),
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- FortuneTopAppBar(
- titleLabel = "미래에서 온 편지",
- onCloseClick = onCloseClick,
+ if (state.isLoading) {
+ FortuneLoadingScreen()
+ } else {
+ Image(
+ painter = painterResource(id = backgroundRes),
+ contentDescription = null,
+ contentScale = ContentScale.Crop,
+ modifier = Modifier.matchParentSize(),
)
- SlidingIndicator(
- currentIndex = pagerState.currentPage,
- count = 6,
- dotHeight = 5.dp,
- spacing = 4.dp,
- inactiveColor = OrbitTheme.colors.white.copy(0.2f),
- activeColor = OrbitTheme.colors.white,
- )
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ FortuneTopAppBar(
+ titleLabel = "미래에서 온 편지",
+ onCloseClick = onCloseClick,
+ )
+
+ SlidingIndicator(
+ currentIndex = pagerState.currentPage,
+ count = 6,
+ dotHeight = 5.dp,
+ spacing = 4.dp,
+ inactiveColor = OrbitTheme.colors.white.copy(0.2f),
+ activeColor = OrbitTheme.colors.white,
+ )
- FortunePager(state, pagerState, onNextStep)
+ FortunePager(state, pagerState, onNextStep, onNavigateToHome)
+ }
}
}
}
+@Composable
+fun FortuneLoadingScreen() {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)),
+ contentAlignment = Alignment.Center,
+ ) {
+ LottieAnimation(
+ modifier = Modifier
+ .size(70.dp),
+ resId = core.designsystem.R.raw.star_loading,
+ )
+ }
+}
+
@Composable
@Preview
fun FortuneRoutePreview() {
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt
index 56f13f00..b4890bfb 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt
@@ -4,8 +4,6 @@ import android.app.Application
import android.util.Log
import androidx.annotation.DrawableRes
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.FortuneDestination
-import com.yapp.common.navigation.destination.HomeDestination
import com.yapp.datastore.UserPreferences
import com.yapp.domain.repository.FortuneRepository
import com.yapp.domain.repository.ImageRepository
@@ -18,6 +16,8 @@ import kotlinx.coroutines.launch
import org.orbitmvi.orbit.syntax.simple.intent
import org.orbitmvi.orbit.syntax.simple.postSideEffect
import org.orbitmvi.orbit.syntax.simple.reduce
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
import javax.inject.Inject
@HiltViewModel
@@ -33,11 +33,12 @@ class FortuneViewModel @Inject constructor(
init {
viewModelScope.launch {
val fortuneId = userPreferences.fortuneIdFlow.firstOrNull()
- fortuneId?.let { getFortune(it) }
+ val firstDismissedAlarmId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull()
+ val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull()
+ fortuneId?.let { getFortune(it, firstDismissedAlarmId, fortuneDate) }
}
}
-
- private fun getFortune(fortuneId: Long) = intent {
+ private fun getFortune(fortuneId: Long, firstDismissedAlarmId: Long?, fortuneDate: String?) = intent {
updateState { copy(isLoading = true) }
fortuneRepository.getFortune(fortuneId).onSuccess { fortune ->
@@ -45,6 +46,8 @@ class FortuneViewModel @Inject constructor(
val imageId = savedImageId ?: getRandomImage()
val formattedTitle = fortune.dailyFortuneTitle.replace(",", ",\n").trim()
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+ val hasReward = (fortuneDate == todayDate) && (firstDismissedAlarmId != null)
updateState {
copy(
isLoading = false,
@@ -53,6 +56,7 @@ class FortuneViewModel @Inject constructor(
avgFortuneScore = fortune.avgFortuneScore,
fortunePages = fortune.toFortunePages(),
fortuneImageId = imageId,
+ hasReward = hasReward,
)
}
}.onFailure { error ->
@@ -72,13 +76,7 @@ class FortuneViewModel @Inject constructor(
when (action) {
is FortuneContract.Action.NextStep -> {
if (state.hasReward) {
- postSideEffect(
- FortuneContract.SideEffect.Navigate(
- route = FortuneDestination.Reward.route,
- popUpTo = FortuneDestination.Fortune.route,
- inclusive = true,
- ),
- )
+ postSideEffect(FortuneContract.SideEffect.NavigateToFortuneReward)
} else {
reduce { state.copy(currentStep = (state.currentStep + 1).coerceAtMost(5)) }
}
@@ -96,13 +94,7 @@ class FortuneViewModel @Inject constructor(
}
private fun navigateToHome() {
- emitSideEffect(
- FortuneContract.SideEffect.Navigate(
- route = HomeDestination.Route.route,
- popUpTo = FortuneDestination.Route.route,
- inclusive = true,
- ),
- )
+ emitSideEffect(FortuneContract.SideEffect.NavigateToHome)
}
private fun saveImage(@DrawableRes resId: Int) = viewModelScope.launch {
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt
index 4ff5b412..ff64e917 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt
@@ -23,7 +23,7 @@ fun CodyBox(
clothsNameLabel: String,
) {
Column(
- modifier = Modifier.width(120.dp),
+ modifier = Modifier.width(110.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt
index dddca249..d5d5cf5c 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt
@@ -2,13 +2,10 @@ package com.yapp.fortune.component
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
-import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -37,25 +34,18 @@ fun DetailHoroScopeText(
.paddingForScreenPercentage(horizontalPercentage = 0.055f),
horizontalAlignment = Alignment.CenterHorizontally,
) {
- Row(
- modifier = Modifier.fillMaxWidth(),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.Center,
- ) {
- Image(
- painter = painterResource(id = iconRes),
- contentDescription = null,
- modifier = Modifier
- .size(24.dp)
- .padding(end = 4.dp),
- )
- Text(
- text = fortuneTitleText,
- style = OrbitTheme.typography.label1SemiBold,
- color = color,
- textAlign = TextAlign.Start,
- )
- }
+ Image(
+ painter = painterResource(id = iconRes),
+ contentDescription = null,
+ modifier = Modifier.size(24.dp),
+ )
+ Spacer(modifier = Modifier.height(3.dp))
+ Text(
+ text = fortuneTitleText,
+ style = OrbitTheme.typography.label1SemiBold,
+ color = color,
+ textAlign = TextAlign.Start,
+ )
Spacer(modifier = Modifier.height(8.dp))
Text(
text = fortuneSubTitleText,
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt
index ed9489ed..0282f8fb 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt
@@ -35,7 +35,12 @@ fun FortuneTopAppBar(
painter = painterResource(id = core.designsystem.R.drawable.ic_close),
contentDescription = "Close",
modifier = Modifier
- .customClickable(onClick = onCloseClick),
+ .customClickable(
+ rippleEnabled = false,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onCloseClick,
+ ),
tint = OrbitTheme.colors.white,
)
Spacer(modifier = Modifier.padding(end = 12.dp))
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt
index e7c8300f..02add410 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt
@@ -19,7 +19,6 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
-import feature.fortune.R
@Composable
fun SpeechBubble(
@@ -27,7 +26,7 @@ fun SpeechBubble(
text: String,
backGroundColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f),
textColor: Color = OrbitTheme.colors.white,
- textStyle: TextStyle = OrbitTheme.typography.body1Medium,
+ textStyle: TextStyle = OrbitTheme.typography.H3,
verticalPadding: Dp = 10.dp,
horizontalPadding: Dp = 16.dp,
) {
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt
index 2494c929..6dee0040 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt
@@ -14,6 +14,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.fortune.component.HillWithGradient
import com.yapp.ui.component.button.OrbitButton
@@ -27,7 +29,10 @@ import com.yapp.ui.utils.paddingForScreenPercentage
fun FortuneCompletePage(
hasReward: Boolean,
onCompleteClick: () -> Unit,
+ onNavigateToHome: () -> Unit,
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
val message = if (hasReward) {
"첫 알람에 잘 일어났네!\n보상으로 행운 부적을 줄게"
} else {
@@ -80,7 +85,18 @@ fun FortuneCompletePage(
OrbitButton(
label = if (hasReward) "부적 보러가기" else "완료",
modifier = Modifier.padding(horizontal = 20.dp, vertical = 12.dp),
- onClick = onCompleteClick,
+ onClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "fortune_complete",
+ ),
+ )
+ if (hasReward) {
+ onCompleteClick()
+ } else {
+ onNavigateToHome()
+ }
+ },
enabled = true,
)
}
@@ -90,5 +106,5 @@ fun FortuneCompletePage(
@Composable
@Preview
fun FortuneCompletePagePreview() {
- FortuneCompletePage(hasReward = true, onCompleteClick = {})
+ FortuneCompletePage(hasReward = true, onCompleteClick = {}, onNavigateToHome = {})
}
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt
index c86296d2..08b7cfc5 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt
@@ -16,6 +16,7 @@ fun FortunePager(
state: FortuneContract.State,
pagerState: PagerState,
onNextStep: () -> Unit,
+ onNavigateToHome: () -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
HorizontalPager(
@@ -53,6 +54,7 @@ fun FortunePager(
5 -> FortuneCompletePage(
hasReward = state.hasReward,
onCompleteClick = onNextStep,
+ onNavigateToHome = onNavigateToHome,
)
else -> {}
}
diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt
index e3336cb7..3f9abb42 100644
--- a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt
+++ b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt
@@ -35,7 +35,6 @@ fun CodyContent(
) {
codyList.chunked(2).forEach { rowItems ->
Row(
- horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
rowItems.forEach { item ->
diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts
index 61e15919..b8a4b12d 100644
--- a/feature/home/build.gradle.kts
+++ b/feature/home/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.alarm)
implementation(projects.core.media)
implementation(projects.core.datastore)
diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt
index 2f9c710f..de6da472 100644
--- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt
+++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt
@@ -95,12 +95,6 @@ sealed class AlarmAddEditContract {
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
-
data object NavigateBack : SideEffect()
data class SaveAlarm(val id: Long) : SideEffect()
diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt
index 156b8a66..d479e3f6 100644
--- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt
+++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt
@@ -19,14 +19,19 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalRippleConfiguration
+import androidx.compose.material3.RippleConfiguration
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
+import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
@@ -63,6 +68,7 @@ import com.yapp.ui.component.snackbar.showCustomSnackBar
import com.yapp.ui.component.switch.OrbitSwitch
import com.yapp.ui.component.timepicker.OrbitPicker
import feature.home.R
+import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Composable
@@ -77,18 +83,11 @@ fun AlarmAddEditRoute(
val coroutineScope = rememberCoroutineScope()
LaunchedEffect(sideEffect) {
- sideEffect.collect { effect ->
+ sideEffect.collectLatest { effect ->
when (effect) {
is AlarmAddEditContract.SideEffect.NavigateBack -> {
navigator.navigateBack()
}
- is AlarmAddEditContract.SideEffect.Navigate -> {
- navigator.navigateTo(
- route = effect.route,
- popUpTo = effect.popUpTo,
- inclusive = effect.inclusive,
- )
- }
is AlarmAddEditContract.SideEffect.SaveAlarm -> {
navigator.navController.previousBackStackEntry
?.savedStateHandle
@@ -456,7 +455,14 @@ private fun AlarmAddEditSettingsSection(
}.title
}"
}
- state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) { AlarmSound("", Uri.EMPTY) }.title
+
+ state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) {
+ AlarmSound(
+ "",
+ Uri.EMPTY,
+ )
+ }.title
+
state.soundState.isVibrationEnabled -> stringResource(id = R.string.alarm_add_edit_vibration)
else -> stringResource(id = R.string.alarm_add_edit_alarm_selected_option_none)
},
@@ -471,44 +477,63 @@ private fun AlarmAddEditSettingsSection(
}
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun AlarmAddEditSettingItem(
label: String,
description: String,
onClick: () -> Unit,
) {
- Row(
- modifier = Modifier
- .fillMaxWidth()
- .clickable {
- onClick()
- }
- .padding(
- horizontal = 20.dp,
- vertical = 14.dp,
+ val interactionSource = remember { MutableInteractionSource() }
+
+ CompositionLocalProvider(
+ LocalRippleConfiguration provides RippleConfiguration(
+ rippleAlpha = RippleAlpha(
+ pressedAlpha = 1f,
+ focusedAlpha = 1f,
+ hoveredAlpha = 1f,
+ draggedAlpha = 1f,
),
- verticalAlignment = Alignment.CenterVertically,
+ ),
) {
- Text(
- label,
- modifier = Modifier.width(80.dp),
- style = OrbitTheme.typography.body1SemiBold,
- color = OrbitTheme.colors.white,
- )
- Text(
- description,
- modifier = Modifier.weight(1f),
- style = OrbitTheme.typography.body2Regular,
- color = OrbitTheme.colors.gray_50,
- maxLines = 1,
- overflow = TextOverflow.Ellipsis,
- textAlign = TextAlign.End,
- )
- Icon(
- painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right),
- contentDescription = "Arrow",
- tint = OrbitTheme.colors.gray_300,
- )
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable(
+ interactionSource = interactionSource,
+ indication = ripple(
+ color = OrbitTheme.colors.gray_700,
+ ),
+ ) {
+ onClick()
+ }
+ .padding(
+ horizontal = 20.dp,
+ vertical = 14.dp,
+ ),
+ verticalAlignment = Alignment.CenterVertically,
+ ) {
+ Text(
+ label,
+ modifier = Modifier.width(80.dp),
+ style = OrbitTheme.typography.body1SemiBold,
+ color = OrbitTheme.colors.white,
+ )
+ Text(
+ description,
+ modifier = Modifier.weight(1f),
+ style = OrbitTheme.typography.body2Regular,
+ color = OrbitTheme.colors.gray_50,
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis,
+ textAlign = TextAlign.End,
+ )
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right),
+ contentDescription = "Arrow",
+ tint = OrbitTheme.colors.gray_300,
+ )
+ }
}
}
diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt
index c1ecb0f1..08713ebd 100644
--- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt
+++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt
@@ -5,11 +5,14 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.yapp.alarm.AlarmHelper
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.AnalyticsHelper
import com.yapp.common.util.ResourceProvider
import com.yapp.domain.model.Alarm
import com.yapp.domain.model.AlarmDay
import com.yapp.domain.model.AlarmSound
import com.yapp.domain.model.copyFrom
+import com.yapp.domain.model.toAlarmDayNames
import com.yapp.domain.model.toAlarmDays
import com.yapp.domain.model.toDayOfWeek
import com.yapp.domain.usecase.AlarmUseCase
@@ -20,10 +23,12 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import feature.home.R
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
+import java.time.LocalTime
import javax.inject.Inject
@HiltViewModel
class AlarmAddEditViewModel @Inject constructor(
+ private val analyticsHelper: AnalyticsHelper,
private val alarmUseCase: AlarmUseCase,
private val resourceProvider: ResourceProvider,
private val hapticFeedbackManager: HapticFeedbackManager,
@@ -57,9 +62,23 @@ class AlarmAddEditViewModel @Inject constructor(
alarmUseCase.initializeSoundPlayer(defaultSound.uri)
+ val now = LocalTime.now()
+ val initialAmPm = if (now.hour < 12) "오전" else "오후"
+ val initialHour = if (now.hour == 0 || now.hour == 12) 12 else now.hour % 12
+ val initialMinute = now.minute
+
updateState {
copy(
initialLoading = false,
+ timeState = timeState.copy(
+ initialAmPm = initialAmPm,
+ initialHour = "$initialHour",
+ initialMinute = initialMinute.toString().padStart(2, '0'),
+ currentAmPm = initialAmPm,
+ currentHour = initialHour,
+ currentMinute = initialMinute,
+ alarmMessage = getAlarmMessage(initialAmPm, initialHour, initialMinute, emptySet()),
+ ),
soundState = soundState.copy(sounds = sounds, soundIndex = defaultSoundIndex),
)
}
@@ -239,6 +258,16 @@ class AlarmAddEditViewModel @Inject constructor(
private suspend fun createNewAlarm(alarm: Alarm) {
alarmUseCase.insertAlarm(alarm)
.onSuccess {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "alarm_create",
+ properties = mapOf(
+ AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${it.id}",
+ AnalyticsEvent.AlarmPropertiesKeys.REPEAT_DAYS to it.repeatDays.toAlarmDayNames(),
+ AnalyticsEvent.AlarmPropertiesKeys.SNOOZE_OPTION to listOf(it.snoozeInterval, it.snoozeCount),
+ ),
+ ),
+ )
alarmHelper.scheduleAlarm(it)
emitSideEffect(AlarmAddEditContract.SideEffect.SaveAlarm(it.id))
}
@@ -480,6 +509,7 @@ class AlarmAddEditViewModel @Inject constructor(
return when {
days > 0 -> "${days}일 ${hours}시간 후에 울려요"
hours > 0 -> "${hours}시간 ${minutes}분 후에 울려요"
+ minutes == 0L -> "곧 울려요"
else -> "${minutes}분 후에 울려요"
}
}
@@ -505,6 +535,11 @@ class AlarmAddEditViewModel @Inject constructor(
val currentDayOfWeek = now.dayOfWeek.value
val selectedDaysOfWeek = selectedDays.map { it.toDayOfWeek().value }.sorted()
+
+ if (selectedDaysOfWeek.contains(currentDayOfWeek) && now.toLocalTime().isBefore(alarmTimeToday.toLocalTime())) {
+ return alarmTimeToday
+ }
+
val nextDay = selectedDaysOfWeek.firstOrNull { it > currentDayOfWeek }
?: selectedDaysOfWeek.first()
val daysToAdd = if (nextDay > currentDayOfWeek) {
@@ -512,6 +547,7 @@ class AlarmAddEditViewModel @Inject constructor(
} else {
7 - (currentDayOfWeek - nextDay)
}
+
val nextAlarmDate = now.toLocalDate().plusDays(daysToAdd.toLong())
return nextAlarmDate.atTime(alarmTimeToday.toLocalTime())
}
diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt
index d3aaa522..900d7e96 100644
--- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt
+++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt
@@ -38,7 +38,6 @@ internal fun AlarmCheckItem(
text = label,
style = OrbitTheme.typography.label1Medium,
color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_400,
- modifier = Modifier.padding(start = 4.dp),
textAlign = TextAlign.Center,
)
}
diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt
index 5bd10a47..a590bd8e 100644
--- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt
+++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt
@@ -1,49 +1,81 @@
package com.yapp.alarm.component
+import android.os.Handler
+import android.os.Looper
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
+import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.ripple.RippleAlpha
+import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalRippleConfiguration
+import androidx.compose.material3.RippleConfiguration
+import androidx.compose.material3.Surface
+import androidx.compose.material3.SwipeToDismissBox
+import androidx.compose.material3.SwipeToDismissBoxValue
import androidx.compose.material3.Text
+import androidx.compose.material3.rememberSwipeToDismissBoxState
+import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.IntOffset
+import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.domain.model.AlarmDay
import com.yapp.domain.model.toRepeatDays
import com.yapp.ui.component.checkbox.OrbitCheckBox
import com.yapp.ui.component.switch.OrbitSwitch
+import feature.home.R
import java.time.LocalDateTime
import java.time.LocalTime
import java.time.format.DateTimeFormatter
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
@Composable
internal fun AlarmListItem(
modifier: Modifier = Modifier,
id: Long,
repeatDays: Int,
isHolidayAlarmOff: Boolean,
+ swipeable: Boolean = true,
selectable: Boolean = false,
selected: Boolean = false,
onClick: (Long) -> Unit,
+ onLongPress: (Long, Float, Float) -> Unit,
onToggleSelect: (Long) -> Unit,
+ onSwipe: (Long) -> Unit,
isAm: Boolean,
hour: Int,
minute: Int,
@@ -51,53 +83,133 @@ internal fun AlarmListItem(
onToggleActive: (Long) -> Unit,
) {
val interactionSource = remember { MutableInteractionSource() }
- val isPressed by interactionSource.collectIsPressedAsState()
-
- Row(
- modifier = modifier
- .fillMaxWidth()
- .background(
- when {
- isPressed || selected -> OrbitTheme.colors.gray_800
- else -> OrbitTheme.colors.gray_900
- },
- )
- .padding(horizontal = 24.dp, vertical = 20.dp)
- .clickable(
- interactionSource = interactionSource,
- indication = null,
- ) {
- if (selectable) {
- onToggleSelect(id)
- } else {
- onClick(id)
+ val density = LocalDensity.current
+ val configuration = LocalConfiguration.current
+ val screenHeightPx = with(density) { configuration.screenHeightDp.dp.toPx() }
+
+ var itemPosition by remember { mutableStateOf(Pair(0f, 0f)) }
+ var itemSize by remember { mutableStateOf(IntSize(0, 0)) }
+
+ val dismissState = rememberSwipeToDismissBoxState(
+ confirmValueChange = {
+ if (it == SwipeToDismissBoxValue.EndToStart) {
+ Handler(Looper.getMainLooper()).postDelayed({
+ onSwipe(id)
+ }, 200,)
+ }
+ return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart
+ },
+ positionalThreshold = {
+ itemSize.width * 0.8f
+ },
+ )
+
+ CompositionLocalProvider(
+ LocalRippleConfiguration provides RippleConfiguration(
+ rippleAlpha = RippleAlpha(
+ pressedAlpha = 1f,
+ focusedAlpha = 1f,
+ hoveredAlpha = 1f,
+ draggedAlpha = 1f,
+ ),
+ ),
+ ) {
+ SwipeToDismissBox(
+ state = dismissState,
+ modifier = modifier,
+ enableDismissFromStartToEnd = false,
+ enableDismissFromEndToStart = swipeable,
+ gesturesEnabled = swipeable,
+ backgroundContent = {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(OrbitTheme.colors.gray_500)
+ .onGloballyPositioned {
+ itemSize = it.size
+ itemPosition = Pair(
+ it.positionInRoot().x,
+ it.positionInRoot().y,
+ )
+ },
+ contentAlignment = Alignment.CenterStart,
+ ) {
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_trash),
+ contentDescription = "Delete",
+ tint = Color.White,
+ modifier = Modifier
+ .size(24.dp)
+ .offset {
+ val offsetX = itemSize.width * (1 - dismissState.progress * 0.5f) - 12.dp.toPx()
+
+ IntOffset(
+ x = offsetX.toInt(),
+ y = 0,
+ )
+ },
+ )
}
},
- verticalAlignment = Alignment.CenterVertically,
- ) {
- if (selectable) {
- OrbitCheckBox(
- checked = selected,
- onCheckedChange = { onToggleSelect(id) },
- )
- Spacer(modifier = Modifier.width(26.dp))
- }
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(
+ if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900,
+ )
+ .combinedClickable(
+ interactionSource = interactionSource,
+ indication = ripple(
+ color = OrbitTheme.colors.gray_800,
+ ),
+ onLongClick = {
+ if (selectable) return@combinedClickable
- AlarmListItemContent(
- repeatDays = repeatDays,
- isActive = isActive,
- isHolidayAlarmOff = isHolidayAlarmOff,
- isAm = isAm,
- hour = hour,
- minute = minute,
- )
+ val minRequiredSpace = itemSize.height + with(density) { 42.dp.toPx() }
+ val adjustedY = if (itemPosition.second + minRequiredSpace > screenHeightPx) {
+ screenHeightPx - minRequiredSpace
+ } else {
+ itemPosition.second
+ }
- if (!selectable) {
- Spacer(modifier = Modifier.weight(1f))
- OrbitSwitch(
- isChecked = isActive,
+ onLongPress(id, itemPosition.first, adjustedY)
+ },
+ ) {
+ if (selectable) {
+ onToggleSelect(id)
+ } else {
+ onClick(id)
+ }
+ }
+ .padding(horizontal = 24.dp, vertical = 20.dp),
+ verticalAlignment = Alignment.CenterVertically,
) {
- onToggleActive(id)
+ if (selectable) {
+ OrbitCheckBox(
+ checked = selected,
+ onCheckedChange = { onToggleSelect(id) },
+ )
+ Spacer(modifier = Modifier.width(26.dp))
+ }
+
+ AlarmListItemContent(
+ repeatDays = repeatDays,
+ isActive = isActive,
+ isHolidayAlarmOff = isHolidayAlarmOff,
+ isAm = isAm,
+ hour = hour,
+ minute = minute,
+ )
+
+ if (!selectable) {
+ Spacer(modifier = Modifier.weight(1f))
+ OrbitSwitch(
+ isChecked = isActive,
+ ) {
+ onToggleActive(id)
+ }
+ }
}
}
}
@@ -159,6 +271,7 @@ private fun AlarmListItemContent(
text = ":",
style = OrbitTheme.typography.title2Medium,
color = if (isActive) OrbitTheme.colors.white else OrbitTheme.colors.gray_500,
+ modifier = Modifier.offset(y = (-2).dp),
)
Spacer(modifier = Modifier.width(3.dp))
@@ -220,6 +333,65 @@ private fun getNextAlarmDateWithTime(isAm: Boolean, hour: Int, minute: Int): Str
return nextAlarmDate.format(DateTimeFormatter.ofPattern("M월 d일"))
}
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+internal fun AlarmListItemMenu(
+ text: String,
+ @DrawableRes iconRes: Int,
+ onClick: () -> Unit,
+) {
+ val interactionSource = remember { MutableInteractionSource() }
+
+ CompositionLocalProvider(
+ LocalRippleConfiguration provides RippleConfiguration(
+ rippleAlpha = RippleAlpha(
+ pressedAlpha = 1f,
+ focusedAlpha = 1f,
+ hoveredAlpha = 1f,
+ draggedAlpha = 1f,
+ ),
+ ),
+ ) {
+ Surface(
+ modifier = Modifier
+ .width(120.dp)
+ .height(42.dp)
+ .clip(RoundedCornerShape(12.dp))
+ .clickable(
+ interactionSource = interactionSource,
+ indication = ripple(
+ bounded = false,
+ color = OrbitTheme.colors.gray_600,
+ ),
+ onClick = onClick,
+ ),
+ color = OrbitTheme.colors.gray_700,
+ shape = RoundedCornerShape(12.dp),
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ ) {
+ Text(
+ text = text,
+ style = OrbitTheme.typography.body1SemiBold,
+ color = OrbitTheme.colors.alert,
+ )
+
+ Icon(
+ modifier = Modifier.size(20.dp),
+ painter = painterResource(id = iconRes),
+ contentDescription = "Icon",
+ tint = OrbitTheme.colors.alert,
+ )
+ }
+ }
+ }
+}
+
@Preview
@Composable
private fun AlarmListItemPreview() {
@@ -234,18 +406,21 @@ private fun AlarmListItemPreview() {
repeatDays = selectedDays,
isHolidayAlarmOff = true,
selectable = true,
+ swipeable = false,
selected = selected,
isAm = true,
hour = 6,
minute = 0,
isActive = isActive,
onClick = { },
+ onLongPress = { _, _, _ -> },
onToggleActive = {
isActive = !isActive
},
onToggleSelect = {
selected = !selected
},
+ onSwipe = { },
)
Spacer(
modifier = Modifier
@@ -260,16 +435,54 @@ private fun AlarmListItemPreview() {
isHolidayAlarmOff = false,
selectable = false,
selected = false,
+ swipeable = true,
isAm = true,
hour = 6,
minute = 0,
isActive = isActive,
onClick = { },
+ onLongPress = { _, _, _ -> },
onToggleActive = {
isActive = !isActive
},
onToggleSelect = { },
+ onSwipe = { },
)
}
}
}
+
+@Preview
+@Composable
+private fun AlarmListItemMenuPreview() {
+ OrbitTheme {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(16.dp),
+ ) {
+ AlarmListItem(
+ id = 0,
+ repeatDays = 0,
+ isHolidayAlarmOff = false,
+ selectable = false,
+ swipeable = false,
+ selected = false,
+ isAm = true,
+ hour = 6,
+ minute = 0,
+ isActive = true,
+ onClick = { },
+ onLongPress = { _, _, _ -> },
+ onToggleActive = { },
+ onToggleSelect = { },
+ onSwipe = { },
+ )
+
+ AlarmListItemMenu(
+ text = stringResource(id = R.string.alarm_delete_dialog_btn_delete),
+ iconRes = core.designsystem.R.drawable.ic_trash,
+ ) {
+ }
+ }
+ }
+}
diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt
index a6ea0717..ee3f5dd1 100644
--- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt
+++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt
@@ -3,6 +3,7 @@ package com.yapp.home
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.yapp.domain.model.Alarm
+import com.yapp.ui.base.SideEffect
import com.yapp.ui.base.UiState
sealed class HomeContract {
@@ -12,28 +13,44 @@ sealed class HomeContract {
val alarms: List = emptyList(),
val lastAddedAlarmIndex: Int? = null,
val dropdownMenuExpanded: Boolean = false,
+ val sortDropDownMenuExpanded: Boolean = false,
val selectedAlarmIds: Set = emptySet(),
val isSelectionMode: Boolean = false,
val isDeleteDialogVisible: Boolean = false,
val isNoActivatedAlarmDialogVisible: Boolean = false,
val isNoDailyFortuneDialogVisible: Boolean = false,
+ val hasNewFortune: Boolean = false,
+ val isToolTipVisible: Boolean = false,
val pendingAlarmToggle: Pair? = null,
val lastFortuneScore: Int = -1,
val deliveryTime: String = "받을 수 있는 운세가 없어요",
- val name: String = "동현",
+ val name: String = "",
+ val activeItemMenu: Long? = null,
+ val activeItemMenuPosition: Pair? = null,
+ val sortOrder: AlarmSortOrder = AlarmSortOrder.DEFAULT,
) : UiState {
val isAllSelected: Boolean
get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size
+
val hasActivatedAlarm: Boolean
get() = alarms.any { it.isAlarmActive }
+
+ val sortedAlarms: List
+ get() = when (sortOrder) {
+ AlarmSortOrder.DEFAULT -> alarms
+ AlarmSortOrder.ACTIVATION -> alarms.sortedByDescending { it.isAlarmActive }
+ }
}
sealed class Action {
data object NavigateToAlarmCreation : Action()
data object ToggleMultiSelectionMode : Action()
- data object ToggleDropdownMenuVisibility : Action()
+ data object ShowDropDownMenu : Action()
+ data object ShowSortDropDownMenu : Action()
+ data object HideDropDownMenu : Action()
data class ToggleAlarmSelection(val alarmId: Long) : Action()
data class ToggleAlarmActivation(val alarmId: Long) : Action()
+ data class SwipeToDeleteAlarm(val id: Long) : Action()
data object ToggleAllAlarmSelection : Action()
data object ShowDeleteDialog : Action()
data object HideDeleteDialog : Action()
@@ -41,6 +58,7 @@ sealed class HomeContract {
data object HideNoActivatedAlarmDialog : Action()
data object ShowNoDailyFortuneDialog : Action()
data object HideNoDailyFortuneDialog : Action()
+ data object HideToolTip : Action()
data object RollbackPendingAlarmToggle : Action()
data object ConfirmDeletion : Action()
data class DeleteSingleAlarm(val alarmId: Long) : Action()
@@ -49,16 +67,19 @@ sealed class HomeContract {
data class EditAlarm(val alarmId: Long) : Action()
data object ShowDailyFortune : Action()
data object NavigateToSetting : Action()
+ data class ShowItemMenu(val alarmId: Long, val x: Float, val y: Float) : Action()
+ data object HideItemMenu : Action()
+ data class SetSortOrder(val sortOrder: AlarmSortOrder) : Action()
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
+ data object NavigateToAddAlarm : SideEffect()
+
+ data class NavigateToEditAlarm(val alarmId: Long) : SideEffect()
- data object NavigateBack : SideEffect()
+ data object NavigateToFortune : SideEffect()
+
+ data object NavigateToSetting : SideEffect()
data class ShowSnackBar(
val message: String,
@@ -70,4 +91,9 @@ sealed class HomeContract {
val onAction: () -> Unit,
) : SideEffect()
}
+
+ enum class AlarmSortOrder {
+ DEFAULT,
+ ACTIVATION,
+ }
}
diff --git a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt
index ec43adbe..b044e9de 100644
--- a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt
+++ b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt
@@ -2,13 +2,12 @@ package com.yapp.home
import androidx.compose.material3.SnackbarHostState
import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
-import androidx.navigation.navArgument
import com.yapp.alarm.addedit.AlarmAddEditRoute
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.HomeDestination
+import com.yapp.common.navigation.route.HomeBaseRoute
+import com.yapp.common.navigation.route.HomeDestination
const val ADD_ALARM_RESULT_KEY = "addAlarmResult"
const val UPDATE_ALARM_RESULT_KEY = "updateAlarmResult"
@@ -18,26 +17,17 @@ fun NavGraphBuilder.homeNavGraph(
navigator: OrbitNavigator,
snackBarHostState: SnackbarHostState,
) {
- navigation(
- route = HomeDestination.Route.route,
- startDestination = HomeDestination.Home.route,
+ navigation(
+ startDestination = HomeDestination.Route,
) {
- composable(route = HomeDestination.Home.route) {
+ composable {
HomeRoute(
navigator = navigator,
snackBarHostState = snackBarHostState,
)
}
- composable(
- route = "${HomeDestination.AlarmAddEdit.route}?id={alarmId}",
- arguments = listOf(
- navArgument("alarmId") {
- type = NavType.LongType
- defaultValue = -1
- },
- ),
- ) {
+ composable {
AlarmAddEditRoute(
navigator = navigator,
snackBarHostState = snackBarHostState,
diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt
index f37909de..b8a4dc46 100644
--- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt
+++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt
@@ -1,14 +1,15 @@
package com.yapp.home
-import android.util.Log
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
@@ -17,6 +18,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
@@ -40,6 +42,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.blur
import androidx.compose.ui.draw.clip
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
@@ -50,23 +53,31 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.layout
import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.zIndex
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.alarm.component.AlarmListItem
+import com.yapp.alarm.component.AlarmListItemMenu
import com.yapp.common.navigation.OrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.domain.model.Alarm
import com.yapp.home.component.bottomsheet.AlarmListBottomSheet
import com.yapp.ui.component.dialog.OrbitDialog
import com.yapp.ui.component.lottie.LottieAnimation
import com.yapp.ui.component.snackbar.showCustomSnackBar
+import com.yapp.ui.component.tooltip.OrbitToolTip
import com.yapp.ui.utils.heightForScreenPercentage
import com.yapp.ui.utils.toPx
import feature.home.R
+import kotlinx.coroutines.flow.collectLatest
@Composable
fun HomeRoute(
@@ -110,18 +121,24 @@ fun HomeRoute(
}
LaunchedEffect(sideEffect) {
- sideEffect.collect { effect ->
+ sideEffect.collectLatest { effect ->
when (effect) {
- is HomeContract.SideEffect.NavigateBack -> {
- navigator.navigateBack()
+ is HomeContract.SideEffect.NavigateToAddAlarm -> {
+ navigator.navigateToAddAlarm()
}
- is HomeContract.SideEffect.Navigate -> {
- navigator.navigateTo(
- route = effect.route,
- popUpTo = effect.popUpTo,
- inclusive = effect.inclusive,
- )
+
+ is HomeContract.SideEffect.NavigateToEditAlarm -> {
+ navigator.navigateToEditAlarm(effect.alarmId)
+ }
+
+ is HomeContract.SideEffect.NavigateToFortune -> {
+ navigator.navigateToFortune()
}
+
+ is HomeContract.SideEffect.NavigateToSetting -> {
+ navigator.navigateToSetting()
+ }
+
is HomeContract.SideEffect.ShowSnackBar -> {
val result = showCustomSnackBar(
scope = coroutineScope,
@@ -163,12 +180,13 @@ fun HomeScreen(
eventDispatcher(HomeContract.Action.NavigateToSetting)
},
onMailClick = {
- Log.d("HomeScreen", "ShowDailyFortune")
eventDispatcher(HomeContract.Action.ShowDailyFortune)
},
onAddClick = {
eventDispatcher(HomeContract.Action.NavigateToAlarmCreation)
},
+ hasNewFortune = state.hasNewFortune,
+ isTooltipVisible = state.isToolTipVisible,
)
} else {
HomeContent(
@@ -264,107 +282,166 @@ private fun HomeContent(
}
}
- Box {
- AlarmListBottomSheet(
- alarms = state.alarms,
- menuExpanded = state.dropdownMenuExpanded,
- isAllSelected = state.isAllSelected,
- isSelectionMode = state.isSelectionMode,
- selectedAlarmIds = state.selectedAlarmIds,
- halfExpandedHeight = sheetHalfExpandHeight,
- isLoading = false,
- hasMoreData = false,
- listState = listState,
- onClickAlarm = { alarmId ->
- eventDispatcher(HomeContract.Action.EditAlarm(alarmId))
- },
- onClickAdd = {
- eventDispatcher(HomeContract.Action.NavigateToAlarmCreation)
- },
- onClickMore = {
- eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility)
- },
- onClickCheckAll = {
- eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection)
- },
- onClickClose = {
- eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode)
- },
- onClickEdit = {
- eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode)
- },
- onDismissRequest = {
- eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility)
- },
- onToggleSelect = { alarmId ->
- eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId))
- },
- onToggleActive = { alarmId ->
- eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId))
- },
- onLoadMore = {
- eventDispatcher(HomeContract.Action.LoadMoreAlarms)
+ Box(
+ modifier = Modifier
+ .clickable(
+ interactionSource = remember { MutableInteractionSource() },
+ indication = null,
+ ) {
+ eventDispatcher(HomeContract.Action.HideToolTip)
},
- ) {
+ ) {
+ if (state.activeItemMenu != null) {
Box(
modifier = Modifier
.fillMaxSize()
- .background(Color(0xFF1F3B64)),
- ) {
- HillWithGradient()
-
- SkyImage()
-
- val characterY = (screenHeight * 0.28f) - 130.dp
+ .clickable(
+ interactionSource = remember { MutableInteractionSource() },
+ indication = null,
+ ) {
+ eventDispatcher(HomeContract.Action.HideItemMenu)
+ }
+ .zIndex(1f),
+ )
+ }
- Column(
+ Box(
+ modifier = if (state.activeItemMenu != null) {
+ Modifier
+ .background(color = Color(0xFF1F3B64))
+ .blur(10.dp)
+ } else {
+ Modifier
+ },
+ ) {
+ AlarmListBottomSheet(
+ alarms = state.sortedAlarms,
+ menuExpanded = state.dropdownMenuExpanded,
+ sortDropDownMenuExpanded = state.sortDropDownMenuExpanded,
+ sortOrder = state.sortOrder,
+ isAllSelected = state.isAllSelected,
+ isSelectionMode = state.isSelectionMode,
+ selectedAlarmIds = state.selectedAlarmIds,
+ halfExpandedHeight = sheetHalfExpandHeight,
+ listState = listState,
+ onClickAlarm = { alarmId ->
+ eventDispatcher(HomeContract.Action.EditAlarm(alarmId))
+ },
+ onLongPressAlarm = { alarmId, x, y ->
+ eventDispatcher(HomeContract.Action.ShowItemMenu(alarmId, x, y))
+ },
+ onClickAdd = {
+ eventDispatcher(HomeContract.Action.NavigateToAlarmCreation)
+ },
+ onClickMore = {
+ if (state.dropdownMenuExpanded || state.sortDropDownMenuExpanded) {
+ eventDispatcher(HomeContract.Action.HideDropDownMenu)
+ } else {
+ eventDispatcher(HomeContract.Action.ShowDropDownMenu)
+ }
+ },
+ onClickCheckAll = {
+ eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection)
+ },
+ onClickClose = {
+ eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode)
+ },
+ onClickEdit = {
+ eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode)
+ },
+ onClickSort = {
+ eventDispatcher(HomeContract.Action.ShowSortDropDownMenu)
+ },
+ onSetSortOrder = { sortOrder ->
+ eventDispatcher(HomeContract.Action.SetSortOrder(sortOrder))
+ },
+ onDismissRequest = {
+ eventDispatcher(HomeContract.Action.HideDropDownMenu)
+ },
+ onToggleSelect = { alarmId ->
+ eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId))
+ },
+ onToggleActive = { alarmId ->
+ eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId))
+ },
+ onSwipe = { alarmId ->
+ eventDispatcher(HomeContract.Action.SwipeToDeleteAlarm(alarmId))
+ },
+ ) {
+ Box(
modifier = Modifier
- .fillMaxWidth()
- .layout { measurable, constraints ->
- val placeable = measurable.measure(constraints)
- sheetHalfExpandHeight = screenHeight - placeable.height.toDp()
- layout(placeable.width, placeable.height) {
- placeable.placeRelative(0, 0)
- }
- },
- horizontalAlignment = Alignment.CenterHorizontally,
+ .fillMaxSize()
+ .background(Color(0xFF1F3B64)),
) {
- Spacer(modifier = Modifier.height(characterY))
+ HillWithGradient()
+
+ SkyImage()
+
+ val characterY = (screenHeight * 0.28f) - 130.dp
+
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ sheetHalfExpandHeight = screenHeight - placeable.height.toDp()
+ layout(placeable.width, placeable.height) {
+ placeable.placeRelative(0, 0)
+ }
+ },
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ Spacer(modifier = Modifier.height(characterY))
+
+ HomeCharacterAnimation(
+ fortuneScore = state.lastFortuneScore,
+ hasActivatedAlarm = state.hasActivatedAlarm,
+ )
+ Spacer(modifier = Modifier.height(8.dp))
+ HomeFortuneDescription(
+ fortuneScore = state.lastFortuneScore,
+ hasActivatedAlarm = state.hasActivatedAlarm,
+ name = state.name,
+ deliveryTime = state.deliveryTime,
+ )
+ }
- HomeCharacterAnimation(
- fortuneScore = state.lastFortuneScore,
- hasActivatedAlarm = state.hasActivatedAlarm,
- eventDispatcher = eventDispatcher,
- )
- Spacer(modifier = Modifier.height(8.dp))
- HomeFortuneDescription(
- fortuneScore = state.lastFortuneScore,
- hasActivatedAlarm = state.hasActivatedAlarm,
- name = state.name,
- deliveryTime = state.deliveryTime,
+ HomeTopBar(
+ onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) },
+ onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) },
+ hasNewFortune = state.hasNewFortune,
+ isShowTooltip = state.isToolTipVisible,
)
}
+ }
- HomeTopBar(
- onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) },
- onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) },
+ BottomGradient(modifier = Modifier.align(Alignment.BottomCenter))
+
+ if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) {
+ DeleteAlarmButton(
+ modifier = Modifier
+ .widthIn(min = 130.dp)
+ .align(Alignment.BottomCenter)
+ .padding(bottom = 26.dp),
+ selectedAlarmCount = state.selectedAlarmIds.size,
+ onClick = {
+ eventDispatcher(HomeContract.Action.ShowDeleteDialog)
+ },
)
}
}
- BottomGradient(modifier = Modifier.align(Alignment.BottomCenter))
-
- if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) {
- DeleteAlarmButton(
- modifier = Modifier
- .widthIn(min = 130.dp)
- .align(Alignment.BottomCenter)
- .padding(bottom = 26.dp),
- selectedAlarmCount = state.selectedAlarmIds.size,
- onClick = {
- eventDispatcher(HomeContract.Action.ShowDeleteDialog)
- },
- )
+ if (state.activeItemMenu != null) {
+ state.alarms.find { it.id == state.activeItemMenu }?.let {
+ AlarmWithMenu(
+ activeItemMenu = it,
+ activeItemMenuPosition = state.activeItemMenuPosition,
+ selectedAlarmIds = state.selectedAlarmIds,
+ onDelete = { alarmId ->
+ eventDispatcher(HomeContract.Action.DeleteSingleAlarm(alarmId))
+ },
+ )
+ }
}
}
}
@@ -373,6 +450,8 @@ private fun HomeContent(
private fun HomeTopBar(
onSettingClick: () -> Unit,
onMailClick: () -> Unit,
+ hasNewFortune: Boolean,
+ isShowTooltip: Boolean,
) {
Box(
modifier = Modifier.statusBarsPadding(),
@@ -386,20 +465,46 @@ private fun HomeTopBar(
) {
Spacer(modifier = Modifier.weight(1f))
- Box(
- modifier = Modifier
- .size(32.dp)
- .clip(CircleShape)
- .clickable {
- onMailClick()
- },
- contentAlignment = Alignment.Center,
- ) {
- Icon(
- painter = painterResource(id = core.designsystem.R.drawable.ic_mail),
- contentDescription = "Mail",
- tint = OrbitTheme.colors.white,
- )
+ Box {
+ Box(contentAlignment = Alignment.BottomEnd) {
+ Box(
+ modifier = Modifier
+ .size(32.dp)
+ .clip(CircleShape)
+ .clickable {
+ onMailClick()
+ },
+ contentAlignment = Alignment.Center,
+ ) {
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_mail),
+ contentDescription = "Mail",
+ tint = OrbitTheme.colors.white,
+ )
+ }
+
+ if (hasNewFortune) {
+ Spacer(
+ modifier = Modifier
+ .padding(
+ end = 4.dp,
+ bottom = 6.dp,
+ )
+ .size(7.dp)
+ .background(
+ color = OrbitTheme.colors.alert,
+ shape = CircleShape,
+ ),
+ )
+ }
+ }
+
+ if (isShowTooltip) {
+ OrbitToolTip(
+ text = stringResource(id = R.string.home_tool_tip_fortune_arrived),
+ offset = IntOffset(x = 0, y = 32.dp.toPx().toInt()),
+ )
+ }
}
Spacer(modifier = Modifier.width(12.dp))
@@ -479,11 +584,10 @@ private fun HomeCharacterAnimation(
modifier: Modifier = Modifier,
fortuneScore: Int,
hasActivatedAlarm: Boolean,
- eventDispatcher: (HomeContract.Action) -> Unit,
) {
val (bubbleRes, starRes) = when {
!hasActivatedAlarm -> {
- Pair(null, core.designsystem.R.raw.fortune_preload)
+ Pair(null, core.designsystem.R.drawable.ic_character_no_alarm)
}
fortuneScore in 0..49 -> {
Pair(
@@ -523,10 +627,23 @@ private fun HomeCharacterAnimation(
)
Spacer(modifier = Modifier.height(16.dp))
} ?: Spacer(modifier = Modifier.height(62.dp))
- LottieAnimation(
- modifier = Modifier.size(110.dp),
- resId = starRes,
- )
+ if (hasActivatedAlarm) {
+ LottieAnimation(
+ modifier = Modifier.size(110.dp),
+ resId = starRes,
+ )
+ } else {
+ Image(
+ painter = painterResource(id = starRes),
+ contentDescription = "IMG_MAIN_STAR_GRAY",
+ modifier = Modifier
+ .size(110.dp)
+ .graphicsLayer {
+ scaleX = 1.25f
+ scaleY = 1.25f
+ },
+ )
+ }
}
}
@@ -574,6 +691,8 @@ private fun HomeAlarmEmptyScreen(
onSettingClick: () -> Unit,
onMailClick: () -> Unit,
onAddClick: () -> Unit,
+ hasNewFortune: Boolean,
+ isTooltipVisible: Boolean,
) {
Column(
modifier = Modifier
@@ -584,6 +703,8 @@ private fun HomeAlarmEmptyScreen(
HomeTopBar(
onSettingClick = onSettingClick,
onMailClick = onMailClick,
+ hasNewFortune = hasNewFortune,
+ isShowTooltip = isTooltipVisible,
)
Spacer(modifier = Modifier.heightForScreenPercentage(0.13f))
@@ -745,6 +866,58 @@ private fun BottomGradient(
)
}
+@Composable
+private fun AlarmWithMenu(
+ activeItemMenu: Alarm,
+ activeItemMenuPosition: Pair?,
+ selectedAlarmIds: Set,
+ onDelete: (Long) -> Unit = {},
+) {
+ val density = LocalDensity.current
+
+ Column(
+ modifier = Modifier.offset(
+ x = with(density) { (activeItemMenuPosition?.first ?: 0f).toDp() },
+ y = with(density) { (activeItemMenuPosition?.second ?: 0f).toDp() },
+ ).zIndex(2f),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(16.dp),
+ ) {
+ AlarmListItem(
+ modifier = Modifier
+ .padding(horizontal = 20.dp)
+ .clip(RoundedCornerShape(24.dp))
+ .border(
+ width = 1.dp,
+ shape = RoundedCornerShape(24.dp),
+ color = OrbitTheme.colors.gray_700,
+ ),
+ id = activeItemMenu.id,
+ repeatDays = activeItemMenu.repeatDays,
+ isHolidayAlarmOff = activeItemMenu.isHolidayAlarmOff,
+ swipeable = false,
+ selectable = false,
+ selected = selectedAlarmIds.contains(activeItemMenu.id),
+ isAm = activeItemMenu.isAm,
+ hour = activeItemMenu.hour,
+ minute = activeItemMenu.minute,
+ isActive = activeItemMenu.isAlarmActive,
+ onClick = { },
+ onLongPress = { _, _, _ -> },
+ onToggleActive = { },
+ onToggleSelect = { },
+ onSwipe = { },
+ )
+
+ AlarmListItemMenu(
+ text = stringResource(id = R.string.alarm_delete_dialog_btn_delete),
+ iconRes = core.designsystem.R.drawable.ic_trash,
+ ) {
+ onDelete(activeItemMenu.id)
+ }
+ }
+}
+
@Preview(
showBackground = true,
backgroundColor = 0xFF000000,
@@ -753,7 +926,17 @@ private fun BottomGradient(
fun HomeScreenPreview() {
OrbitTheme {
HomeScreen(
- stateProvider = { HomeContract.State() },
+ stateProvider = {
+ HomeContract.State()
+ .copy(
+ initialLoading = false,
+ alarms = listOf(
+ Alarm(),
+ ),
+ activeItemMenu = 0L,
+ activeItemMenuPosition = Pair(0f, 0f),
+ )
+ },
eventDispatcher = {},
)
}
diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt
index 0b8de16d..9c5dccc6 100644
--- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt
+++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt
@@ -3,9 +3,6 @@ package com.yapp.home
import android.util.Log
import androidx.lifecycle.viewModelScope
import com.yapp.alarm.AlarmHelper
-import com.yapp.common.navigation.destination.FortuneDestination
-import com.yapp.common.navigation.destination.HomeDestination
-import com.yapp.common.navigation.destination.SettingDestination
import com.yapp.common.util.ResourceProvider
import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
@@ -15,6 +12,7 @@ import com.yapp.domain.usecase.AlarmUseCase
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import feature.home.R
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import java.time.LocalDate
@@ -34,22 +32,28 @@ class HomeViewModel @Inject constructor(
) {
init {
loadAllAlarms()
+ loadDailyFortuneState()
+ loadUserName()
}
fun processAction(action: HomeContract.Action) {
when (action) {
HomeContract.Action.NavigateToAlarmCreation -> navigateToAlarmCreation()
HomeContract.Action.ToggleMultiSelectionMode -> toggleMultiSelectionMode()
- HomeContract.Action.ToggleDropdownMenuVisibility -> toggleDropdownMenuVisibility()
+ HomeContract.Action.ShowDropDownMenu -> showDropDownMenu()
+ HomeContract.Action.ShowSortDropDownMenu -> showSortDropDownMenu()
+ HomeContract.Action.HideDropDownMenu -> hideDropDownMenu()
is HomeContract.Action.ToggleAlarmSelection -> toggleAlarmSelection(action.alarmId)
HomeContract.Action.ToggleAllAlarmSelection -> toggleAllAlarmSelection()
is HomeContract.Action.ToggleAlarmActivation -> toggleAlarmActivation(action.alarmId)
+ is HomeContract.Action.SwipeToDeleteAlarm -> deleteSingleAlarm(action.id)
HomeContract.Action.ShowDeleteDialog -> showDeleteDialog()
HomeContract.Action.HideDeleteDialog -> hideDeleteDialog()
HomeContract.Action.ShowNoActivatedAlarmDialog -> showNoActivatedAlarmDialog()
HomeContract.Action.HideNoActivatedAlarmDialog -> hideNoActivatedAlarmDialog()
HomeContract.Action.ShowNoDailyFortuneDialog -> showNoDailyFortuneDialog()
HomeContract.Action.HideNoDailyFortuneDialog -> hideNoDailyFortuneDialog()
+ HomeContract.Action.HideToolTip -> hideToolTip()
HomeContract.Action.RollbackPendingAlarmToggle -> rollbackAlarmActivation()
HomeContract.Action.ConfirmDeletion -> confirmDeletion()
is HomeContract.Action.DeleteSingleAlarm -> deleteSingleAlarm(action.alarmId)
@@ -58,6 +62,9 @@ class HomeViewModel @Inject constructor(
is HomeContract.Action.EditAlarm -> editAlarm(action.alarmId)
HomeContract.Action.ShowDailyFortune -> loadDailyFortune()
HomeContract.Action.NavigateToSetting -> navigateToSetting()
+ is HomeContract.Action.ShowItemMenu -> showItemMenu(action.alarmId, action.x, action.y)
+ HomeContract.Action.HideItemMenu -> hideItemMenu()
+ is HomeContract.Action.SetSortOrder -> setSortOrder(action.sortOrder)
}
}
@@ -93,7 +100,7 @@ class HomeViewModel @Inject constructor(
}
private fun navigateToAlarmCreation() {
- emitSideEffect(HomeContract.SideEffect.Navigate(HomeDestination.AlarmAddEdit.route))
+ emitSideEffect(HomeContract.SideEffect.NavigateToAddAlarm)
}
private fun toggleMultiSelectionMode() {
@@ -106,8 +113,26 @@ class HomeViewModel @Inject constructor(
}
}
- private fun toggleDropdownMenuVisibility() {
- updateState { copy(dropdownMenuExpanded = !currentState.dropdownMenuExpanded) }
+ private fun showDropDownMenu() {
+ updateState { copy(dropdownMenuExpanded = true) }
+ }
+
+ private fun showSortDropDownMenu() {
+ updateState {
+ copy(
+ dropdownMenuExpanded = false,
+ sortDropDownMenuExpanded = true,
+ )
+ }
+ }
+
+ private fun hideDropDownMenu() {
+ updateState {
+ copy(
+ dropdownMenuExpanded = false,
+ sortDropDownMenuExpanded = false,
+ )
+ }
}
private fun toggleAlarmSelection(alarmId: Long) {
@@ -170,6 +195,12 @@ class HomeViewModel @Inject constructor(
private fun confirmDeletion() {
deleteAlarms(currentState.selectedAlarmIds)
+ updateState {
+ copy(
+ selectedAlarmIds = emptySet(),
+ isDeleteDialogVisible = false,
+ )
+ }
}
private fun showNoActivatedAlarmDialog() {
@@ -225,49 +256,39 @@ class HomeViewModel @Inject constructor(
private fun deleteAlarms(alarmIds: Set) {
if (alarmIds.isEmpty()) return
- val alarmsWithIndex = currentState.alarms.withIndex()
- .filter { it.value.id in alarmIds }
- .map { it.index to it.value }
+ val alarmsToDelete = currentState.alarms
+ .filter { it.id in alarmIds }
- val alarmsToDelete = alarmsWithIndex.map { it.second }
+ viewModelScope.launch {
+ alarmsToDelete.forEach { alarm ->
+ alarmUseCase.deleteAlarm(alarm.id)
+ alarmHelper.unScheduleAlarm(alarm)
+ }
+ }
- updateState {
- copy(
- alarms = currentState.alarms - alarmsToDelete.toSet(),
- selectedAlarmIds = emptySet(),
- isDeleteDialogVisible = false,
- isSelectionMode = false,
- )
+ if (currentState.activeItemMenu != null) {
+ hideItemMenu()
}
- Log.d("HomeViewModel", "Deleting alarms: $alarmsToDelete")
emitSideEffect(
HomeContract.SideEffect.ShowSnackBar(
message = resourceProvider.getString(R.string.alarm_deleted),
label = resourceProvider.getString(R.string.alarm_delete_dialog_btn_cancel),
iconRes = resourceProvider.getDrawable(core.designsystem.R.drawable.ic_check_green),
- onDismiss = {
- viewModelScope.launch {
- alarmsToDelete.forEach { alarm ->
- alarmUseCase.deleteAlarm(alarm.id)
- alarmHelper.unScheduleAlarm(alarm)
- }
- }
- },
+ onDismiss = { },
onAction = {
- restoreDeletedAlarms(alarmsWithIndex)
+ restoreDeletedAlarms(alarmsToDelete)
},
),
)
}
- private fun restoreDeletedAlarms(alarmsWithIndex: List>) {
- updateState {
- val restoredAlarms = currentState.alarms.toMutableList()
- alarmsWithIndex.forEach { (index, alarm) ->
- restoredAlarms.add(index, alarm)
+ private fun restoreDeletedAlarms(alarmsWithIndex: List) {
+ viewModelScope.launch {
+ alarmsWithIndex.forEach { alarm ->
+ alarmUseCase.insertAlarm(alarm)
+ alarmHelper.scheduleAlarm(alarm)
}
- copy(alarms = restoredAlarms)
}
}
@@ -292,7 +313,7 @@ class HomeViewModel @Inject constructor(
}
private fun editAlarm(alarmId: Long) {
- emitSideEffect(HomeContract.SideEffect.Navigate("${HomeDestination.AlarmAddEdit.route}?id=$alarmId"))
+ emitSideEffect(HomeContract.SideEffect.NavigateToEditAlarm(alarmId))
}
private fun updateDeliveryTime(alarms: List) {
@@ -349,6 +370,8 @@ class HomeViewModel @Inject constructor(
val tomorrow = today.plusDays(1)
return when {
+ inputDateTime.toLocalDate() == today ->
+ resourceProvider.getString(R.string.home_fortune_delivery_today, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm")))
inputDateTime.toLocalDate() == tomorrow ->
resourceProvider.getString(R.string.home_fortune_delivery_tomorrow, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm")))
inputDateTime.year == now.year ->
@@ -377,9 +400,41 @@ class HomeViewModel @Inject constructor(
if (fortuneDate != todayDate) {
processAction(HomeContract.Action.ShowNoDailyFortuneDialog)
} else {
- emitSideEffect(
- HomeContract.SideEffect.Navigate(FortuneDestination.Fortune.route),
- )
+ userPreferences.markFortuneAsChecked()
+ emitSideEffect(HomeContract.SideEffect.NavigateToFortune)
+ }
+ }
+ }
+
+ private fun loadDailyFortuneState() {
+ viewModelScope.launch {
+ val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)
+
+ combine(
+ userPreferences.fortuneDateFlow,
+ userPreferences.fortuneScoreFlow,
+ userPreferences.hasNewFortuneFlow,
+ ) { fortuneDate, fortuneScore, hasNewFortune ->
+ val isTodayFortuneAvailable = fortuneDate == todayDate
+ val finalFortuneScore = if (isTodayFortuneAvailable) fortuneScore ?: -1 else -1
+
+ Pair(finalFortuneScore, hasNewFortune)
+ }.collect { (finalFortuneScore, hasNewFortune) ->
+ updateState {
+ copy(
+ lastFortuneScore = finalFortuneScore,
+ hasNewFortune = hasNewFortune,
+ isToolTipVisible = hasNewFortune,
+ )
+ }
+ }
+ }
+ }
+
+ private fun loadUserName() {
+ viewModelScope.launch {
+ userPreferences.userNameFlow.collect { userName ->
+ updateState { copy(name = userName ?: "") }
}
}
}
@@ -392,52 +447,34 @@ class HomeViewModel @Inject constructor(
updateState { copy(isNoDailyFortuneDialogVisible = false) }
}
- private fun navigateToSetting() {
- emitSideEffect(
- HomeContract.SideEffect.Navigate(
- route = SettingDestination.Route.route,
- ),
- )
+ private fun hideToolTip() {
+ updateState { copy(isToolTipVisible = false) }
}
- /*
- private fun loadMoreAlarms() {
- val currentPage = currentState.paginationState.currentPage
- if (currentState.paginationState.isLoading || !currentState.paginationState.hasMoreData) return
-
- val pageSize = 10
- val offset = currentPage * pageSize
+ private fun navigateToSetting() {
+ emitSideEffect(HomeContract.SideEffect.NavigateToSetting)
+ }
+ private fun showItemMenu(alarmId: Long, x: Float, y: Float) {
updateState {
copy(
- paginationState = currentState.paginationState.copy(isLoading = true),
+ activeItemMenu = alarmId,
+ activeItemMenuPosition = x to y,
)
}
+ }
- viewModelScope.launch {
- alarmUseCase.getPagedAlarms(limit = pageSize, offset = offset)
- .onSuccess {
- updateState {
- copy(
- alarms = currentState.alarms + it,
- paginationState = currentState.paginationState.copy(
- currentPage = currentPage + 1,
- isLoading = false,
- hasMoreData = it.size == pageSize,
- ),
- initialLoading = false,
- )
- }
- }
- .onFailure {
- Log.e("HomeViewModel", "Failed to get paged alarms", it)
- updateState {
- copy(
- paginationState = currentState.paginationState.copy(isLoading = false),
- initialLoading = false,
- )
- }
- }
+ private fun hideItemMenu() {
+ updateState {
+ copy(
+ activeItemMenu = null,
+ activeItemMenuPosition = null,
+ )
}
- }*/
+ }
+
+ private fun setSortOrder(sortOrder: HomeContract.AlarmSortOrder) {
+ updateState { copy(sortOrder = sortOrder) }
+ hideDropDownMenu()
+ }
}
diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt
index 174bcd34..ed262d7c 100644
--- a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt
+++ b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt
@@ -3,29 +3,36 @@ package com.yapp.home.component
import android.util.Log
import androidx.annotation.DrawableRes
import androidx.compose.foundation.BorderStroke
-import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.ripple.RippleAlpha
import androidx.compose.material3.Button
import androidx.compose.material3.DropdownMenu
+import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalRippleConfiguration
+import androidx.compose.material3.RippleConfiguration
+import androidx.compose.material3.Surface
import androidx.compose.material3.Text
+import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
@@ -39,6 +46,7 @@ internal fun AlarmListDropDownMenu(
expanded: Boolean,
onDismissRequest: () -> Unit,
onClickEdit: () -> Unit,
+ onClickSort: () -> Unit,
) {
DropdownMenu(
modifier = modifier.padding(horizontal = 8.dp),
@@ -54,9 +62,16 @@ internal fun AlarmListDropDownMenu(
) {
onClickEdit()
}
+ AlarmListDropDownMenuItem(
+ text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort),
+ iconRes = core.designsystem.R.drawable.ic_filter,
+ ) {
+ onClickSort()
+ }
}
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun AlarmListDropDownMenuItem(
text: String,
@@ -64,36 +79,53 @@ private fun AlarmListDropDownMenuItem(
onClick: () -> Unit,
) {
val interactionSource = remember { MutableInteractionSource() }
- val isPressed by interactionSource.collectIsPressedAsState()
- Row(
- modifier = Modifier
- .width(120.dp)
- .background(
- color = if (isPressed) OrbitTheme.colors.gray_600 else OrbitTheme.colors.gray_700,
- shape = RoundedCornerShape(12.dp),
- )
- .clickable(
- interactionSource = interactionSource,
- indication = null,
- onClick = onClick,
- )
- .padding(horizontal = 14.dp, vertical = 8.dp),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween,
+ CompositionLocalProvider(
+ LocalRippleConfiguration provides RippleConfiguration(
+ rippleAlpha = RippleAlpha(
+ pressedAlpha = 1f,
+ focusedAlpha = 1f,
+ hoveredAlpha = 1f,
+ draggedAlpha = 1f,
+ ),
+ ),
) {
- Text(
- text = text,
- style = OrbitTheme.typography.body1SemiBold,
- color = OrbitTheme.colors.white,
- )
+ Surface(
+ modifier = Modifier
+ .width(120.dp)
+ .clip(RoundedCornerShape(12.dp))
+ .clickable(
+ interactionSource = interactionSource,
+ indication = ripple(
+ bounded = false,
+ color = OrbitTheme.colors.gray_600,
+ ),
+ onClick = onClick,
+ ),
+ color = OrbitTheme.colors.gray_700,
+ shape = RoundedCornerShape(12.dp),
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ ) {
+ Text(
+ text = text,
+ style = OrbitTheme.typography.body1SemiBold,
+ color = OrbitTheme.colors.white,
+ )
- Icon(
- modifier = Modifier.size(20.dp),
- painter = painterResource(id = iconRes),
- contentDescription = "Icon",
- tint = OrbitTheme.colors.white,
- )
+ Icon(
+ modifier = Modifier.size(20.dp),
+ painter = painterResource(id = iconRes),
+ contentDescription = "Icon",
+ tint = OrbitTheme.colors.white,
+ )
+ }
+ }
}
}
@@ -118,6 +150,9 @@ private fun AlarmListDropDownMenuPreview() {
onClickEdit = {
Log.d("AlarmListDropDownMenu", "Edit Clicked")
},
+ onClickSort = {
+ Log.d("AlarmListDropDownMenu", "Sort Clicked")
+ },
)
}
}
diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt
new file mode 100644
index 00000000..56c3cad6
--- /dev/null
+++ b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt
@@ -0,0 +1,140 @@
+package com.yapp.home.component
+
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.ripple.RippleAlpha
+import androidx.compose.material3.DropdownMenu
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalRippleConfiguration
+import androidx.compose.material3.RippleConfiguration
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.ripple
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.home.HomeContract
+import feature.home.R
+
+@Composable
+internal fun AlarmSortDropDownMenu(
+ modifier: Modifier = Modifier,
+ expanded: Boolean,
+ sortOrder: HomeContract.AlarmSortOrder,
+ onDismissRequest: () -> Unit,
+ onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit,
+) {
+ DropdownMenu(
+ modifier = modifier.padding(horizontal = 8.dp),
+ expanded = expanded,
+ onDismissRequest = onDismissRequest,
+ containerColor = OrbitTheme.colors.gray_700,
+ shape = RoundedCornerShape(16.dp),
+ border = BorderStroke(1.dp, OrbitTheme.colors.gray_600),
+ ) {
+ AlarmSortDropDownMenuItem(
+ text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_default),
+ checked = sortOrder == HomeContract.AlarmSortOrder.DEFAULT,
+ onClick = {
+ onSetSortOrder(HomeContract.AlarmSortOrder.DEFAULT)
+ },
+ )
+ AlarmSortDropDownMenuItem(
+ text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_activation),
+ checked = sortOrder == HomeContract.AlarmSortOrder.ACTIVATION,
+ onClick = {
+ onSetSortOrder(HomeContract.AlarmSortOrder.ACTIVATION)
+ },
+ )
+ }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun AlarmSortDropDownMenuItem(
+ text: String,
+ checked: Boolean,
+ onClick: () -> Unit,
+) {
+ val interactionSource = remember { MutableInteractionSource() }
+
+ CompositionLocalProvider(
+ LocalRippleConfiguration provides RippleConfiguration(
+ rippleAlpha = RippleAlpha(
+ pressedAlpha = 1f,
+ focusedAlpha = 1f,
+ hoveredAlpha = 1f,
+ draggedAlpha = 1f,
+ ),
+ ),
+ ) {
+ Surface(
+ modifier = Modifier
+ .width(162.dp)
+ .clip(RoundedCornerShape(12.dp))
+ .clickable(
+ interactionSource = interactionSource,
+ indication = ripple(
+ bounded = false,
+ color = OrbitTheme.colors.gray_600,
+ ),
+ onClick = onClick,
+ ),
+ color = OrbitTheme.colors.gray_700,
+ shape = RoundedCornerShape(12.dp),
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 14.dp, vertical = 8.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.SpaceBetween,
+ ) {
+ Text(
+ text = text,
+ style = OrbitTheme.typography.body1SemiBold,
+ color = OrbitTheme.colors.white,
+ )
+
+ if (checked) {
+ Icon(
+ modifier = Modifier.size(20.dp),
+ painter = painterResource(id = core.designsystem.R.drawable.ic_check),
+ contentDescription = "Icon",
+ tint = OrbitTheme.colors.white,
+ )
+ }
+ }
+ }
+ }
+}
+
+@Preview
+@Composable
+fun AlarmSortDropDownMenuPreview() {
+ OrbitTheme {
+ AlarmSortDropDownMenu(
+ expanded = true,
+ sortOrder = HomeContract.AlarmSortOrder.DEFAULT,
+ onDismissRequest = {},
+ onSetSortOrder = {},
+ )
+ }
+}
diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt
index fef4ba66..20b00907 100644
--- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt
+++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt
@@ -1,6 +1,7 @@
package com.yapp.home.component.bottomsheet
import androidx.annotation.DrawableRes
+import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
@@ -50,9 +51,10 @@ import androidx.compose.ui.unit.dp
import com.yapp.alarm.component.AlarmListItem
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.domain.model.Alarm
+import com.yapp.home.HomeContract
import com.yapp.home.component.AlarmListDropDownMenu
+import com.yapp.home.component.AlarmSortDropDownMenu
import com.yapp.ui.component.checkbox.OrbitCheckBox
-import com.yapp.ui.utils.OnLoadMore
import feature.home.R
import kotlinx.coroutines.launch
@@ -65,23 +67,26 @@ enum class BottomSheetExpandState {
internal fun AlarmListBottomSheet(
alarms: List,
menuExpanded: Boolean = false,
+ sortDropDownMenuExpanded: Boolean = false,
+ sortOrder: HomeContract.AlarmSortOrder,
isAllSelected: Boolean,
isSelectionMode: Boolean,
selectedAlarmIds: Set,
halfExpandedHeight: Dp = 0.dp,
- isLoading: Boolean,
- hasMoreData: Boolean,
listState: LazyListState,
onClickAlarm: (Long) -> Unit,
+ onLongPressAlarm: (Long, Float, Float) -> Unit,
onClickAdd: () -> Unit,
onClickMore: () -> Unit,
onClickCheckAll: () -> Unit,
onClickClose: () -> Unit,
onClickEdit: () -> Unit,
+ onClickSort: () -> Unit,
+ onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit,
onDismissRequest: () -> Unit,
onToggleSelect: (Long) -> Unit,
onToggleActive: (Long) -> Unit,
- onLoadMore: () -> Unit,
+ onSwipe: (Long) -> Unit,
content: @Composable () -> Unit,
) {
var expandedType by remember { mutableStateOf(BottomSheetExpandState.HALF_EXPANDED) }
@@ -102,9 +107,9 @@ internal fun AlarmListBottomSheet(
val nestedScrollConnection = remember {
object : androidx.compose.ui.input.nestedscroll.NestedScrollConnection {
override fun onPreScroll(
- available: Offset, // 변경된 부분
+ available: Offset,
source: androidx.compose.ui.input.nestedscroll.NestedScrollSource,
- ): Offset { // 변경된 부분
+ ): Offset {
if (available.y < 0 && sheetState.currentValue == SheetValue.PartiallyExpanded) {
coroutineScope.launch { sheetState.expand() }
}
@@ -126,24 +131,27 @@ internal fun AlarmListBottomSheet(
AlarmBottomSheetContent(
modifier = Modifier.nestedScroll(nestedScrollConnection),
alarms = alarms,
- menuExpanded = menuExpanded,
+ dropDownMenuExpanded = menuExpanded,
+ sortDropDownMenuExpanded = sortDropDownMenuExpanded,
+ sortOrder = sortOrder,
isSelectionMode = isSelectionMode,
isAllSelected = isAllSelected,
selectedAlarmIds = selectedAlarmIds,
listState = listState,
onClickAlarm = onClickAlarm,
+ onLongPressAlarm = onLongPressAlarm,
onClickAdd = onClickAdd,
onClickMore = onClickMore,
onClickCheckAll = onClickCheckAll,
onClickClose = onClickClose,
onClickEdit = onClickEdit,
+ onClickSort = onClickSort,
+ onSetSortOrder = onSetSortOrder,
expandedType = expandedType,
onDismissRequest = onDismissRequest,
onToggleSelect = onToggleSelect,
onToggleActive = onToggleActive,
- isLoading = isLoading,
- hasMoreData = hasMoreData,
- onLoadMore = onLoadMore,
+ onSwipe = onSwipe,
)
},
sheetShadowElevation = 0.dp,
@@ -164,37 +172,33 @@ internal fun AlarmListBottomSheet(
internal fun AlarmBottomSheetContent(
modifier: Modifier = Modifier,
alarms: List,
- menuExpanded: Boolean,
+ dropDownMenuExpanded: Boolean,
+ sortDropDownMenuExpanded: Boolean,
+ sortOrder: HomeContract.AlarmSortOrder,
isSelectionMode: Boolean,
isAllSelected: Boolean,
selectedAlarmIds: Set,
listState: LazyListState,
onClickAlarm: (Long) -> Unit,
+ onLongPressAlarm: (Long, Float, Float) -> Unit,
onClickAdd: () -> Unit,
onClickMore: () -> Unit,
onClickCheckAll: () -> Unit,
onClickClose: () -> Unit,
onClickEdit: () -> Unit,
+ onClickSort: () -> Unit,
+ onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit,
onDismissRequest: () -> Unit,
onToggleSelect: (Long) -> Unit,
onToggleActive: (Long) -> Unit,
+ onSwipe: (Long) -> Unit,
expandedType: BottomSheetExpandState,
- isLoading: Boolean,
- hasMoreData: Boolean,
- onLoadMore: () -> Unit,
) {
val statusBarHeight = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
val cornerRadius = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 16.dp else 0.dp
val topPadding = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 14.dp else 14.dp + statusBarHeight
- listState.OnLoadMore(
- hasMoreData = hasMoreData,
- isLoading = isLoading,
- ) {
- onLoadMore()
- }
-
Column(
modifier = modifier
.fillMaxSize()
@@ -214,39 +218,60 @@ internal fun AlarmBottomSheetContent(
)
} else {
AlarmListTopBar(
- menuExpanded = menuExpanded,
+ menuExpanded = dropDownMenuExpanded,
+ sortDropDownMenuExpanded = sortDropDownMenuExpanded,
+ sortOrder = sortOrder,
onClickAdd = onClickAdd,
onClickMore = onClickMore,
onDismissRequest = onDismissRequest,
onClickEdit = onClickEdit,
+ onClickSort = onClickSort,
+ onSetSortOrder = onSetSortOrder,
)
}
LazyColumn(
state = listState,
) {
- itemsIndexed(alarms) { index, alarm ->
+ itemsIndexed(
+ items = alarms,
+ key = { _, alarm -> alarm.id },
+ ) { index, alarm ->
AlarmListItem(
+ modifier = Modifier
+ .animateItem(
+ fadeInSpec = null,
+ placementSpec = tween(durationMillis = 300),
+ fadeOutSpec = null,
+ ),
id = alarm.id,
repeatDays = alarm.repeatDays,
isHolidayAlarmOff = alarm.isHolidayAlarmOff,
+ swipeable = !isSelectionMode,
selectable = isSelectionMode,
selected = selectedAlarmIds.contains(alarm.id),
onClick = onClickAlarm,
+ onLongPress = onLongPressAlarm,
onToggleSelect = onToggleSelect,
isAm = alarm.isAm,
hour = alarm.hour,
minute = alarm.minute,
isActive = alarm.isAlarmActive,
onToggleActive = onToggleActive,
+ onSwipe = onSwipe,
)
if (index != alarms.size - 1) {
Spacer(
modifier = Modifier
+ .padding(horizontal = 24.dp)
.fillMaxWidth()
.height(1.dp)
.background(OrbitTheme.colors.gray_800)
- .padding(horizontal = 24.dp),
+ .animateItem(
+ fadeInSpec = null,
+ placementSpec = tween(durationMillis = 300),
+ fadeOutSpec = null,
+ ),
)
}
}
@@ -262,10 +287,14 @@ internal fun AlarmBottomSheetContent(
private fun AlarmListTopBar(
modifier: Modifier = Modifier,
menuExpanded: Boolean,
+ sortDropDownMenuExpanded: Boolean,
+ sortOrder: HomeContract.AlarmSortOrder,
onClickAdd: () -> Unit,
onClickMore: () -> Unit,
onDismissRequest: () -> Unit,
onClickEdit: () -> Unit,
+ onClickSort: () -> Unit,
+ onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit,
) {
Row(
modifier = modifier
@@ -301,6 +330,16 @@ private fun AlarmListTopBar(
expanded = menuExpanded,
onDismissRequest = onDismissRequest,
onClickEdit = onClickEdit,
+ onClickSort = onClickSort,
+ )
+ }
+
+ if (sortDropDownMenuExpanded) {
+ AlarmSortDropDownMenu(
+ expanded = sortDropDownMenuExpanded,
+ sortOrder = sortOrder,
+ onDismissRequest = onDismissRequest,
+ onSetSortOrder = onSetSortOrder,
)
}
}
diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml
index 2554cf1f..cfe4c73c 100644
--- a/feature/home/src/main/res/values/strings.xml
+++ b/feature/home/src/main/res/values/strings.xml
@@ -4,6 +4,8 @@
기상 알람이 없어요
알람을 추가하고\n운세 편지를 받아보세요
+ 운세 도착
+
운세 편지를 받고 싶다면\n기상 알람을 켜줘
미래에서 운세 편지를\n작성 중이야!
오늘 %s의 하루는\n주의가 필요해
@@ -53,6 +55,10 @@
알람
편집
+ 정렬
+
+ 기본
+ 켜진 알람 우선
전체 선택
%d개 삭제
diff --git a/feature/mission/build.gradle.kts b/feature/mission/build.gradle.kts
index 1648c0a3..95ffd72c 100644
--- a/feature/mission/build.gradle.kts
+++ b/feature/mission/build.gradle.kts
@@ -11,7 +11,9 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.media)
+ implementation(projects.core.alarm)
implementation(projects.domain)
implementation(projects.core.datastore)
implementation(libs.orbit.core)
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt
index d246e6ef..f1812c49 100644
--- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt
@@ -1,14 +1,18 @@
package com.yapp.mission
+import com.yapp.domain.model.MissionType
+
sealed class MissionContract {
data class State(
- val showOverlayText: Boolean = false,
- val showOverlay: Boolean = true,
- val missionProgress: Int = 0,
+ val missionType: MissionType = MissionType.Click,
+ val isMissionTypeLoading: Boolean = true,
val isMissionCompleted: Boolean = false,
- val isFlipped: Boolean = false,
+ val shakeCount: Int = 0,
val clickCount: Int = 0,
+ val playWhenClick: Boolean = false,
+ val showFinalAnimation: Boolean = false,
+ val isFlipped: Boolean = false,
val rotationY: Float = 0f,
val rotationZ: Float = 0f,
val showExitDialog: Boolean = false,
@@ -16,22 +20,15 @@ sealed class MissionContract {
) : com.yapp.ui.base.UiState
sealed class Action {
- data object NextStep : Action()
- data object PreviousStep : Action()
- object StartOverlayTimer : Action()
- object ShakeCard : Action()
- object ClickCard : Action()
- object ShowExitDialog : Action()
- object HideExitDialog : Action()
- object RetryPostFortune : Action()
+ data object ShakeCard : Action()
+ data object ClickCard : Action()
+ data object ShowExitDialog : Action()
+ data object HideExitDialog : Action()
+ data object RetryPostFortune : Action()
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
+ data object NavigateToFortune : SideEffect()
data object NavigateBack : SideEffect()
}
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt
index 81f0776c..a24f0545 100644
--- a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt
@@ -4,64 +4,41 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
-import androidx.navigation.navigation
+import androidx.navigation.navOptions
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.MissionDestination
import com.yapp.common.navigation.extensions.sharedHiltViewModel
+import com.yapp.common.navigation.route.MissionRoute
-fun NavGraphBuilder.missionNavGraph(
+fun NavGraphBuilder.missionScreen(
navigator: OrbitNavigator,
) {
- navigation(
- route = MissionDestination.Route.route,
- startDestination = MissionDestination.Mission.route,
+ composable(
+ deepLinks = listOf(
+ navDeepLink {
+ uriPattern = "orbitapp://mission?notificationId={notificationId}"
+ },
+ ),
) {
- composable(
- route = MissionDestination.Mission.route,
- deepLinks = listOf(
- navDeepLink {
- uriPattern = "orbitapp://mission"
- },
- ),
- ) { backStackEntry ->
- val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
-
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleMissionSideEffect(sideEffect, navigator, viewModel)
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collect { sideEffect ->
+ when (sideEffect) {
+ MissionContract.SideEffect.NavigateToFortune -> {
+ navigator.navigateToFortune(
+ navOptions = navOptions {
+ popUpTo(MissionRoute) {
+ inclusive = true
+ }
+ },
+ )
+ }
+
+ MissionContract.SideEffect.NavigateBack -> navigator.navigateBack()
}
}
-
- MissionRoute(viewModel)
}
- composable(MissionDestination.Progress.route) { backStackEntry ->
- val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
-
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleMissionSideEffect(sideEffect, navigator, viewModel)
- }
- }
-
- MissionProgressRoute(viewModel)
- }
- }
-}
-
-private fun handleMissionSideEffect(
- sideEffect: MissionContract.SideEffect,
- navigator: OrbitNavigator,
- viewModel: MissionViewModel,
-) {
- when (sideEffect) {
- is MissionContract.SideEffect.Navigate -> navigator.navigateTo(
- route = sideEffect.route,
- popUpTo = sideEffect.popUpTo,
- inclusive = sideEffect.inclusive,
- )
-
- MissionContract.SideEffect.NavigateBack -> navigator.navigateBack()
-// MissionContract.SideEffect.MissionCompleted -> onFinishMission()
+ MissionRoute(viewModel)
}
}
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt
deleted file mode 100644
index 27774149..00000000
--- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.yapp.mission
-
-import androidx.activity.compose.BackHandler
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.core.FastOutSlowInEasing
-import androidx.compose.animation.core.tween
-import androidx.compose.animation.fadeIn
-import androidx.compose.animation.scaleIn
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.material3.Icon
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.alpha
-import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.layout.ContentScale
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import androidx.hilt.navigation.compose.hiltViewModel
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import com.yapp.designsystem.theme.OrbitTheme
-import com.yapp.mission.component.FlipCard
-import com.yapp.mission.component.MissionProgressBar
-import com.yapp.ui.component.dialog.OrbitDialog
-import com.yapp.ui.component.lottie.LottieAnimation
-import com.yapp.ui.utils.heightForScreenPercentage
-import com.yapp.ui.utils.paddingForScreenPercentage
-
-@Composable
-fun MissionProgressRoute(viewModel: MissionViewModel = hiltViewModel()) {
- val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
- val context = LocalContext.current
- val shakeDetector = remember { ShakeDetector(context) { viewModel.processAction(MissionContract.Action.ShakeCard) } }
-
- LaunchedEffect(Unit) {
- shakeDetector.start()
- viewModel.processAction(MissionContract.Action.StartOverlayTimer)
- }
-
- DisposableEffect(Unit) {
- onDispose { shakeDetector.stop() }
- }
-
- MissionProgressScreen(
- stateProvider = { state },
- eventDispatcher = viewModel::processAction,
- )
-}
-
-@Composable
-fun MissionProgressScreen(
- stateProvider: () -> MissionContract.State,
- eventDispatcher: (MissionContract.Action) -> Unit,
-) {
- val state = stateProvider()
- val context = LocalContext.current
-
- BackHandler {
- if (state.showExitDialog) {
- eventDispatcher(MissionContract.Action.HideExitDialog)
- } else {
- eventDispatcher(MissionContract.Action.ShowExitDialog)
- }
- }
-
- Box(
- modifier = Modifier.fillMaxSize(),
- ) {
- Image(
- painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background),
- contentDescription = null,
- contentScale = ContentScale.Crop,
- modifier = Modifier.matchParentSize(),
- )
-
- Column(
- modifier = Modifier.fillMaxSize(),
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Column(
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Spacer(modifier = Modifier.heightForScreenPercentage(0.066f))
- Box(
- modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 20.dp),
- contentAlignment = Alignment.TopEnd,
- ) {
- Row(
- modifier = Modifier
- .clickable {
- eventDispatcher(MissionContract.Action.ShowExitDialog)
- },
- ) {
- Icon(
- painter = painterResource(id = core.designsystem.R.drawable.ic_cancel),
- contentDescription = null,
- tint = OrbitTheme.colors.white,
- modifier = Modifier.size(24.dp),
- )
- Text(
- text = "나가기",
- color = OrbitTheme.colors.white,
- style = OrbitTheme.typography.body1SemiBold,
- modifier = Modifier
- .padding(start = 4.dp)
- .align(Alignment.CenterVertically),
- )
- }
- }
-
- Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f))
- MissionProgressBar(
- currentProgress = state.clickCount,
- totalProgress = 10,
- modifier = Modifier
- .fillMaxWidth()
- .height(5.dp)
- .padding(horizontal = 20.dp)
- .alpha(if (state.showOverlay) 0f else 1f),
- )
- Spacer(modifier = Modifier.heightForScreenPercentage(0.06f))
- Text(
- text = "10회를 흔들어야 운세를 받아요",
- color = OrbitTheme.colors.white,
- style = OrbitTheme.typography.heading2SemiBold,
- modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f),
- )
- Spacer(modifier = Modifier.heightForScreenPercentage(0.005f))
- Text(
- text = state.clickCount.toString(),
- color = OrbitTheme.colors.white,
- style = OrbitTheme.typography.displaySemiBold,
- modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f),
- )
- Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f))
- FlipCard(
- state = state,
- eventDispatcher = eventDispatcher,
- )
- }
- }
-
- if (state.showOverlay) {
- Column(
- modifier = Modifier
- .fillMaxSize()
- .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f))
- .pointerInput(Unit) {
- awaitPointerEventScope {
- while (true) {
- awaitPointerEvent()
- }
- }
- },
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Spacer(modifier = Modifier.heightForScreenPercentage(0.226f))
-
- AnimatedVisibility(
- visible = state.showOverlayText,
- enter = scaleIn(
- initialScale = 0.8f,
- animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing),
- ) + fadeIn(animationSpec = tween(durationMillis = 300)),
- ) {
- Text(
- text = "흔들기 시작!",
- color = OrbitTheme.colors.white,
- style = OrbitTheme.typography.title1Bold,
- )
- }
- }
- }
-
- if (state.showExitDialog) {
- OrbitDialog(
- title = "나가면 운세를 받을 수 없어요",
- message = "미션을 수행하지 않고 나가시겠어요?",
- confirmText = "나가기",
- cancelText = "취소",
- onConfirm = {
- (context as? androidx.activity.ComponentActivity)?.finish()
- },
- onCancel = {
- eventDispatcher(MissionContract.Action.HideExitDialog)
- },
- )
- }
-
- if (state.isMissionCompleted) {
- Box(
- modifier = Modifier
- .fillMaxSize()
- .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f))
- .pointerInput(Unit) {
- awaitPointerEventScope {
- while (true) {
- awaitPointerEvent()
- }
- }
- },
- contentAlignment = Alignment.Center,
- ) {
- Box(
- modifier = Modifier.fillMaxSize(),
- ) {
- LottieAnimation(
- modifier = Modifier
- .matchParentSize(),
- scaleXAdjustment = 1.3f,
- scaleYAdjustment = 1.3f,
- resId = core.designsystem.R.raw.mission_success,
- iterations = 1,
- )
- Text(
- text = "미션 성공!",
- color = OrbitTheme.colors.white,
- style = OrbitTheme.typography.title1Bold,
- modifier = Modifier
- .align(Alignment.TopCenter)
- .paddingForScreenPercentage(topPercentage = 0.564f),
- )
- }
- }
- }
-
- if (state.errorMessage != null) {
- OrbitDialog(
- title = "오류",
- message = state.errorMessage,
- confirmText = "확인",
- onConfirm = {
- eventDispatcher(MissionContract.Action.RetryPostFortune)
- },
- )
- }
- }
-}
-
-@Composable
-@Preview
-fun MissionProgressRoutePreview() {
- MissionProgressScreen(
- stateProvider = { MissionContract.State() },
- eventDispatcher = {},
- )
-}
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt
index c974eb47..cd42cdd1 100644
--- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt
@@ -1,179 +1,416 @@
package com.yapp.mission
+import androidx.activity.ComponentActivity
import androidx.activity.compose.BackHandler
+import androidx.compose.animation.Crossfade
+import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
+import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.AnalyticsHelper
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
-import com.yapp.ui.component.button.OrbitButton
+import com.yapp.domain.model.MissionType
+import com.yapp.mission.component.FlipCard
+import com.yapp.mission.component.MissionProgressBar
import com.yapp.ui.component.dialog.OrbitDialog
+import com.yapp.ui.component.lottie.LottieAnimation
+import com.yapp.ui.extensions.customClickable
import com.yapp.ui.utils.heightForScreenPercentage
+import com.yapp.ui.utils.paddingForScreenPercentage
@Composable
fun MissionRoute(viewModel: MissionViewModel = hiltViewModel()) {
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+ val context = LocalContext.current
+
+ val shakeDetector = remember {
+ ShakeDetector(context) {
+ viewModel.processAction(MissionContract.Action.ShakeCard)
+ }
+ }
+
+ LaunchedEffect(Unit) {
+ shakeDetector.start()
+ }
+
+ DisposableEffect(Unit) {
+ onDispose { shakeDetector.stop() }
+ }
MissionScreen(
stateProvider = { state },
eventDispatcher = viewModel::processAction,
- onNext = { viewModel.processAction(MissionContract.Action.NextStep) },
+ onFinish = {
+ (context as? ComponentActivity)?.finish()
+ },
)
}
+/**
+ * Mission 상태에 따라 적절한 화면을 구성하는 메인 컨테이너.
+ * 로딩, 콘텐츠, 성공 오버레이, 다이얼로그 등 분기 처리 포함.
+ */
@Composable
fun MissionScreen(
stateProvider: () -> MissionContract.State,
eventDispatcher: (MissionContract.Action) -> Unit,
- onNext: () -> Unit,
+ onFinish: () -> Unit,
) {
val state = stateProvider()
- val context = LocalContext.current
+ val analytics = LocalAnalyticsHelper.current
BackHandler {
- if (state.showExitDialog) {
- eventDispatcher(MissionContract.Action.HideExitDialog)
- } else {
- eventDispatcher(MissionContract.Action.ShowExitDialog)
- }
+ eventDispatcher(
+ if (state.showExitDialog) {
+ MissionContract.Action.HideExitDialog
+ } else {
+ MissionContract.Action.ShowExitDialog
+ },
+ )
}
- Box(
- modifier = Modifier.fillMaxSize(),
- ) {
+ Box(modifier = Modifier.fillMaxSize()) {
+ if (state.isMissionTypeLoading) {
+ MissionLoadingScreen()
+ return
+ }
+
Image(
- painter = painterResource(id = core.designsystem.R.drawable.img_mission_main_background),
+ painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.matchParentSize(),
)
- Column(
- modifier = Modifier
- .fillMaxSize(),
- horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.SpaceBetween,
- ) {
- Column(
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Spacer(modifier = Modifier.heightForScreenPercentage(0.110f))
- MissionTag(label = "기상미션")
- Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f))
- MissionLabel(label = "10회를 흔들어", style = OrbitTheme.typography.headline2Medium)
- Spacer(modifier = Modifier.heightForScreenPercentage(0.01f))
- MissionLabel(label = "부적을 뒤집어줘", style = OrbitTheme.typography.title2Bold)
+ MissionContent(state, eventDispatcher)
+
+ if (state.showExitDialog) {
+ ExitDialog(state, eventDispatcher, onFinish, analytics)
+ }
+
+ if (state.isMissionCompleted) {
+ MissionSuccessOverlay()
+ }
+
+ state.errorMessage?.let {
+ ErrorDialog(message = it) {
+ eventDispatcher(MissionContract.Action.RetryPostFortune)
}
- Column(
- modifier = Modifier
- .fillMaxWidth(),
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Image(
- painter = painterResource(id = core.designsystem.R.drawable.img_mission_main),
- contentDescription = "",
- modifier = Modifier
- .fillMaxWidth()
- .scale(1.1f),
- )
+ }
+ }
+}
+
+/**
+ * 미션 콘텐츠 본문. TopBar, 진행 바, 상태별 게임 포함.
+ */
+@Composable
+fun MissionContent(
+ state: MissionContract.State,
+ eventDispatcher: (MissionContract.Action) -> Unit,
+) {
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+ MissionTopAppBar(onExit = { eventDispatcher(MissionContract.Action.ShowExitDialog) })
+ MissionProgressBarSection(state)
+ MissionLabel(state)
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f))
+
+ when (state.missionType) {
+ is MissionType.Shake -> {
+ if (state.shakeCount == 0) {
+ MissionShakeInitialImage()
+ } else {
+ FlipCard(state = state, eventDispatcher = eventDispatcher)
+ }
}
- Column(
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- OrbitButton(
- modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 20.dp),
- label = "미션 시작",
- onClick = onNext,
- enabled = true,
- )
- Spacer(modifier = Modifier.heightForScreenPercentage(0.027f))
- MissionLabel(
- label = "미션하지 않기",
- style = OrbitTheme.typography.body1SemiBold,
- clickable = true,
- onClick = {
- eventDispatcher(MissionContract.Action.ShowExitDialog)
- },
- )
- Spacer(modifier = Modifier.heightForScreenPercentage(0.0714f))
+
+ is MissionType.Click -> {
+ MissionClickCard(state, eventDispatcher)
}
}
}
+}
+
+/**
+ * '나가기' 버튼이 포함된 미션 상단 앱바 영역.
+ */
+@Composable
+fun MissionTopAppBar(onExit: () -> Unit) {
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.066f))
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 20.dp),
+ contentAlignment = Alignment.TopEnd,
+ ) {
+ Row(
+ modifier = Modifier.customClickable(
+ rippleEnabled = false,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onExit,
+ ),
+ ) {
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_cancel),
+ contentDescription = null,
+ tint = OrbitTheme.colors.white,
+ modifier = Modifier.size(24.dp),
+ )
+ Text(
+ text = "나가기",
+ color = OrbitTheme.colors.white,
+ style = OrbitTheme.typography.body1SemiBold,
+ modifier = Modifier
+ .padding(start = 4.dp)
+ .align(Alignment.CenterVertically),
+ )
+ }
+ }
+}
+
+/**
+ * 미션 진행도 ProgressBar 섹션.
+ */
+@Composable
+fun MissionProgressBarSection(state: MissionContract.State) {
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f))
+ MissionProgressBar(
+ currentProgress = when (state.missionType) {
+ is MissionType.Shake -> state.shakeCount
+ is MissionType.Click -> state.clickCount
+ },
+ totalProgress = 10,
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(5.dp)
+ .padding(horizontal = 20.dp),
+ )
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.06f))
+}
+
+/**
+ * 미션 안내 문구 및 현재 카운트.
+ */
+@Composable
+fun MissionLabel(state: MissionContract.State) {
+ val instruction =
+ if (state.missionType is MissionType.Shake) "10회를 흔들어 부적을 뒤집어줘" else "10회를 눌러 편지를 열어줘"
+ val count = if (state.missionType is MissionType.Shake) state.shakeCount else state.clickCount
+
+ Text(
+ text = instruction,
+ color = OrbitTheme.colors.white,
+ style = OrbitTheme.typography.heading2SemiBold,
+ )
+ Spacer(modifier = Modifier.heightForScreenPercentage(0.005f))
+ Text(
+ text = count.toString(),
+ color = OrbitTheme.colors.white,
+ style = OrbitTheme.typography.displaySemiBold,
+ )
+}
- if (state.showExitDialog) {
- OrbitDialog(
- title = "나가면 운세를 받을 수 없어요",
- message = "미션을 수행하지 않고 나가시겠어요?",
- confirmText = "나가기",
- cancelText = "취소",
- onConfirm = { (context as? androidx.activity.ComponentActivity)?.finish() },
- onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) },
+/**
+ * 흔들기 미션 초기 이미지.
+ */
+@Composable
+fun MissionShakeInitialImage() {
+ Image(
+ painter = painterResource(id = core.designsystem.R.drawable.img_mission_main),
+ contentDescription = null,
+ modifier = Modifier
+ .fillMaxWidth()
+ .scale(1.1f),
+ )
+}
+
+/**
+ * 클릭 미션 카드. 클릭 시 애니메이션 및 상태 변화.
+ */
+@Composable
+fun MissionClickCard(
+ state: MissionContract.State,
+ eventDispatcher: (MissionContract.Action) -> Unit,
+) {
+ if (state.clickCount == 0) {
+ Image(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_mission_main_letter),
+ contentDescription = null,
+ modifier = Modifier
+ .fillMaxWidth()
+ .scale(1.0f)
+ .pointerInput(Unit) {
+ detectTapGestures { eventDispatcher(MissionContract.Action.ClickCard) }
+ },
)
+ } else {
+ Crossfade(targetState = state.showFinalAnimation, animationSpec = tween(500)) { showFinal ->
+ LottieAnimation(
+ modifier = Modifier
+ .aspectRatio(12f / 9f)
+ .pointerInput(Unit) {
+ detectTapGestures {
+ if (!showFinal) eventDispatcher(MissionContract.Action.ClickCard)
+ }
+ },
+ resId = if (showFinal) core.designsystem.R.raw.mission_letter_open else core.designsystem.R.raw.mission_letter_tap,
+ play = state.playWhenClick || showFinal,
+ restartOnPlay = true,
+ iterations = 1,
+ )
+ }
}
}
+/**
+ * 미션 종료 시 나가기 다이얼로그.
+ */
@Composable
-fun MissionTag(label: String) {
+fun ExitDialog(
+ state: MissionContract.State,
+ eventDispatcher: (MissionContract.Action) -> Unit,
+ onFinish: () -> Unit,
+ analytics: AnalyticsHelper,
+) {
+ OrbitDialog(
+ title = "나가면 운세를 받을 수 없어요",
+ message = "미션을 수행하지 않고 나가시겠어요?",
+ confirmText = "나가기",
+ cancelText = "취소",
+ onConfirm = {
+ analytics.logEvent(
+ AnalyticsEvent(
+ type = "mission_fail",
+ properties = mapOf(
+ AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) {
+ is MissionType.Shake -> "shake"
+ is MissionType.Click -> "click"
+ },
+ ),
+ ),
+ )
+ onFinish()
+ },
+ onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) },
+ )
+}
+
+/**
+ * 미션 성공 시 오버레이 화면.
+ */
+@Composable
+fun MissionSuccessOverlay() {
Box(
modifier = Modifier
- .background(
- color = OrbitTheme.colors.main.copy(alpha = 0.1f),
- shape = RoundedCornerShape(30.dp),
- )
- .padding(vertical = 4.dp, horizontal = 12.dp),
+ .fillMaxSize()
+ .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f))
+ .pointerInput(Unit) {
+ awaitPointerEventScope {
+ while (true) awaitPointerEvent()
+ }
+ },
+ contentAlignment = Alignment.Center,
) {
- Text(
- text = label,
- color = OrbitTheme.colors.main,
- style = OrbitTheme.typography.body2Medium,
- )
+ Box(modifier = Modifier.fillMaxSize()) {
+ LottieAnimation(
+ modifier = Modifier.matchParentSize(),
+ scaleXAdjustment = 1.3f,
+ scaleYAdjustment = 1.3f,
+ resId = core.designsystem.R.raw.mission_success,
+ iterations = 1,
+ play = true,
+ )
+ Text(
+ text = "미션 성공!",
+ color = OrbitTheme.colors.white,
+ style = OrbitTheme.typography.title1Bold,
+ modifier = Modifier
+ .align(Alignment.TopCenter)
+ .paddingForScreenPercentage(topPercentage = 0.564f),
+ )
+ }
}
}
+/**
+ * 오류 발생 시 다이얼로그.
+ */
@Composable
-fun MissionLabel(
- label: String,
- style: TextStyle,
- clickable: Boolean = false,
- onClick: () -> Unit = { },
-) {
- Text(
- text = label,
- color = OrbitTheme.colors.white,
- style = style,
- modifier = if (clickable) { Modifier.clickable { onClick() } } else Modifier,
+fun ErrorDialog(message: String, onConfirm: () -> Unit) {
+ OrbitDialog(
+ title = "오류",
+ message = message,
+ confirmText = "확인",
+ onConfirm = onConfirm,
)
}
+/**
+ * 로딩 화면. 미션 타입 로딩 중에 표시.
+ */
+@Composable
+fun MissionLoadingScreen() {
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ contentAlignment = Alignment.Center,
+ ) {
+ LottieAnimation(
+ modifier = Modifier.size(70.dp),
+ resId = core.designsystem.R.raw.star_loading,
+ )
+ }
+}
+
@Composable
@Preview
-fun MissionRoutePreview() {
+private fun MissionRoutePreview() {
MissionScreen(
- stateProvider = { MissionContract.State() },
- eventDispatcher = { },
- onNext = { },
+ stateProvider = {
+ MissionContract.State(
+ isMissionTypeLoading = false,
+ missionType = MissionType.Shake,
+ shakeCount = 0,
+ clickCount = 0,
+ showFinalAnimation = false,
+ playWhenClick = false,
+ showExitDialog = false,
+ isMissionCompleted = false,
+ )
+ },
+ eventDispatcher = {},
+ onFinish = {},
)
}
diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt
index 861a2f1c..38512436 100644
--- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt
+++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt
@@ -1,17 +1,22 @@
package com.yapp.mission
+import android.app.Application
import android.util.Log
+import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.FortuneDestination
-import com.yapp.common.navigation.destination.HomeDestination
-import com.yapp.common.navigation.destination.MissionDestination
+import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.AnalyticsHelper
import com.yapp.datastore.UserPreferences
+import com.yapp.domain.model.MissionType
import com.yapp.domain.repository.FortuneRepository
+import com.yapp.domain.usecase.GetMissionTypeUseCase
import com.yapp.media.haptic.HapticFeedbackManager
import com.yapp.media.haptic.HapticType
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -19,76 +24,111 @@ import javax.inject.Inject
@HiltViewModel
class MissionViewModel @Inject constructor(
+ private val analyticsHelper: AnalyticsHelper,
private val hapticFeedbackManager: HapticFeedbackManager,
private val fortuneRepository: FortuneRepository,
private val userPreferences: UserPreferences,
+ private val getMissionTypeUseCase: GetMissionTypeUseCase,
+ private val app: Application,
+ savedStateHandle: SavedStateHandle,
) : BaseViewModel(
MissionContract.State(),
) {
+ init {
+ savedStateHandle.get("notificationId")?.toLong()?.let {
+ sendAlarmDismissIntent(it)
+ }
+ loadRemoteMissionType()
+ }
- fun processAction(action: MissionContract.Action) {
- when (action) {
- is MissionContract.Action.NextStep -> {
- emitSideEffect(
- MissionContract.SideEffect.Navigate(route = MissionDestination.Progress.route),
+ private fun loadRemoteMissionType() {
+ viewModelScope.launch {
+ val missionType = getMissionTypeUseCase.execute()
+ updateState {
+ copy(
+ missionType = missionType,
+ isMissionTypeLoading = false,
)
}
+ }
+ }
- is MissionContract.Action.PreviousStep -> {
- emitSideEffect(MissionContract.SideEffect.NavigateBack)
- }
+ fun processAction(action: MissionContract.Action) {
+ when (action) {
+ is MissionContract.Action.ShakeCard -> handleShake()
+ is MissionContract.Action.ClickCard -> handleClick()
+ is MissionContract.Action.ShowExitDialog -> showExitDialog()
+ is MissionContract.Action.HideExitDialog -> hideExitDialog()
+ is MissionContract.Action.RetryPostFortune -> retryPostFortune()
+ }
+ }
- is MissionContract.Action.StartOverlayTimer -> startOverlayTimer()
+ private fun showExitDialog() {
+ updateState { copy(showExitDialog = true) }
+ }
- is MissionContract.Action.ShakeCard, is MissionContract.Action.ClickCard -> handleIncreaseCount()
+ private fun hideExitDialog() {
+ updateState { copy(showExitDialog = false) }
+ }
- is MissionContract.Action.ShowExitDialog -> updateState { copy(showExitDialog = true) }
- is MissionContract.Action.HideExitDialog -> updateState { copy(showExitDialog = false) }
- is MissionContract.Action.RetryPostFortune -> retryPostFortune()
+ private fun handleShake() = viewModelScope.launch {
+ if (currentState.missionType !is MissionType.Shake) return@launch
+
+ val currentCount = currentState.shakeCount
+ if (currentCount < 9) {
+ performHapticSuccess()
+ updateState { copy(shakeCount = currentCount + 1) }
+ } else if (!currentState.isFlipped) {
+ completeMission(type = "shake")
+ updateState {
+ copy(
+ isMissionCompleted = true,
+ shakeCount = 10,
+ isFlipped = true,
+ )
+ }
+ delay(500)
}
}
- private fun handleIncreaseCount() = viewModelScope.launch {
- if (currentState.showOverlay) updateState { copy(showOverlay = false) }
- if (currentState.showOverlayText) updateState { copy(showOverlayText = false) }
+ private fun handleClick() = viewModelScope.launch {
+ if (currentState.missionType !is MissionType.Click) return@launch
val currentCount = currentState.clickCount
if (currentCount < 9) {
- hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS)
- updateState { copy(clickCount = currentCount + 1) }
- } else if (currentCount == 9 && !currentState.isFlipped) {
- hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS)
- postFortune()
+ performHapticSuccess()
+ logMissionSuccess("click")
+ updateState { copy(clickCount = currentCount + 1, playWhenClick = true) }
+ delay(500)
+ updateState { copy(playWhenClick = false) }
+ } else {
updateState {
copy(
- isMissionCompleted = true,
clickCount = 10,
- isFlipped = true,
+ showFinalAnimation = true,
)
}
- kotlinx.coroutines.delay(500)
+ postFortune()
+ delay(500)
+ updateState { copy(isMissionCompleted = true) }
}
}
private fun postFortune() {
viewModelScope.launch {
val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch
- val fortuneResult = runCatching {
+ val result = runCatching {
withContext(Dispatchers.IO) {
fortuneRepository.postFortune(userId)
}
}
- fortuneResult.onSuccess { fortune ->
- val fortuneData = fortune.getOrThrow()
- userPreferences.saveFortuneId(fortuneData.id)
-
- emitSideEffect(
- MissionContract.SideEffect.Navigate(
- route = FortuneDestination.Route.route,
- popUpTo = MissionDestination.Route.route,
- inclusive = true,
- ),
- )
+
+ result.onSuccess {
+ val data = it.getOrThrow()
+ userPreferences.saveFortuneId(data.id)
+ userPreferences.saveFortuneScore(data.avgFortuneScore)
+
+ emitSideEffect(MissionContract.SideEffect.NavigateToFortune)
}.onFailure { error ->
Log.e("MissionViewModel", "운세 데이터 요청 실패: ${error.message}")
updateState { copy(errorMessage = error.message) }
@@ -99,45 +139,55 @@ class MissionViewModel @Inject constructor(
private fun retryPostFortune() {
viewModelScope.launch {
val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch
- val fortuneResult = runCatching {
+ val result = runCatching {
withContext(Dispatchers.IO) {
fortuneRepository.postFortune(userId)
}
}
- fortuneResult.onSuccess { fortune ->
- val fortuneData = fortune.getOrThrow()
- userPreferences.saveFortuneId(fortuneData.id)
+ result.onSuccess {
+ val data = it.getOrThrow()
+ userPreferences.saveFortuneId(data.id)
+ userPreferences.saveFortuneScore(data.avgFortuneScore)
- emitSideEffect(
- MissionContract.SideEffect.Navigate(
- route = FortuneDestination.Route.route,
- popUpTo = MissionDestination.Route.route,
- inclusive = true,
- ),
- )
+ emitSideEffect(MissionContract.SideEffect.NavigateToFortune)
}.onFailure {
- Log.e("MissionViewModel", "운세 데이터 재요청 실패: ${it.message}")
+ Log.e("MissionViewModel", "운세 재요청 실패: ${it.message}")
navigateToHome()
}
}
}
- private fun navigateToHome() {
- emitSideEffect(
- MissionContract.SideEffect.Navigate(
- route = HomeDestination.Route.route,
- popUpTo = MissionDestination.Route.route,
- inclusive = true,
+ private fun completeMission(type: String) {
+ performHapticSuccess()
+ logMissionSuccess(type)
+ postFortune()
+ }
+
+ private fun performHapticSuccess() {
+ hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS)
+ }
+
+ private fun logMissionSuccess(type: String) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "mission_success",
+ properties = mapOf(
+ AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to type,
+ ),
),
)
}
- private fun startOverlayTimer() = viewModelScope.launch {
- updateState { copy(showOverlay = true) }
- kotlinx.coroutines.delay(1000)
- updateState { copy(showOverlayText = true) }
- kotlinx.coroutines.delay(2000)
- updateState { copy(showOverlay = false, showOverlayText = false) }
+ private fun navigateToHome() {
+ emitSideEffect(MissionContract.SideEffect.NavigateToFortune)
+ }
+
+ private fun sendAlarmDismissIntent(id: Long) {
+ val alarmDismissIntent = createAlarmDismissIntent(
+ context = app,
+ notificationId = id,
+ )
+ app.sendBroadcast(alarmDismissIntent)
}
}
diff --git a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt
index 7b88dded..630ba25a 100644
--- a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt
+++ b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt
@@ -6,7 +6,6 @@ import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.wrapContentSize
@@ -50,8 +49,8 @@ fun FlipCard(
}
}
- LaunchedEffect(state.clickCount) {
- if (state.clickCount in 1..9) {
+ LaunchedEffect(state.shakeCount) {
+ if (state.shakeCount in 1..9) {
rotationZ.animateTo(
targetValue = -20f,
animationSpec = tween(durationMillis = 66, easing = LinearEasing),
@@ -76,8 +75,7 @@ fun FlipCard(
rotationY = rotationY.value,
scaleX = scale.value,
scaleY = scale.value,
- )
- .clickable { eventDispatcher(MissionContract.Action.ClickCard) },
+ ),
contentAlignment = Alignment.Center,
) {
if (rotationY.value <= 90f) {
diff --git a/feature/navigator/build.gradle.kts b/feature/navigator/build.gradle.kts
index 5d85544d..a8db6273 100644
--- a/feature/navigator/build.gradle.kts
+++ b/feature/navigator/build.gradle.kts
@@ -10,9 +10,11 @@ android {
dependencies {
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(libs.orbit.core)
implementation(libs.orbit.compose)
implementation(libs.orbit.viewmodel)
+ implementation(libs.kotlin.reflect)
implementation(projects.feature.home)
implementation(projects.feature.alarmInteraction)
implementation(projects.feature.onboarding)
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
index 5863eb31..7728e44f 100644
--- a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
+++ b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt
@@ -7,12 +7,20 @@ import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
+import androidx.compose.runtime.CompositionLocalProvider
+import com.yapp.analytics.AnalyticsHelper
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.common.navigation.rememberOrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
+
+ @Inject
+ lateinit var analyticsHelper: AnalyticsHelper
+
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -31,9 +39,11 @@ class MainActivity : ComponentActivity() {
val navigator = rememberOrbitNavigator()
OrbitTheme {
- OrbitNavHost(
- navigator = navigator,
- )
+ CompositionLocalProvider(LocalAnalyticsHelper provides analyticsHelper) {
+ OrbitNavHost(
+ navigator = navigator,
+ )
+ }
}
}
}
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt
deleted file mode 100644
index 60d481ba..00000000
--- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.yapp.navigator
-
-import androidx.annotation.DrawableRes
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.RowScope
-import androidx.compose.foundation.layout.fillMaxHeight
-import androidx.compose.foundation.layout.height
-import androidx.compose.material3.HorizontalDivider
-import androidx.compose.material3.Icon
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.res.stringResource
-import androidx.compose.ui.unit.dp
-import com.yapp.common.navigation.destination.TopLevelDestination
-import kotlinx.collections.immutable.ImmutableList
-
-@Composable
-internal fun OrbitBottomNavigationBar(
- modifier: Modifier = Modifier,
- visible: Boolean,
- currentTab: TopLevelDestination?,
- entries: ImmutableList,
- onClickItem: (TopLevelDestination) -> Unit,
-) {
- AnimatedVisibility(visible = visible) {
- Column {
- HorizontalDivider(color = Color.Black, thickness = 1.dp)
- Row(
- modifier = Modifier
- .height(56.dp)
- .background(color = Color.White),
- ) {
- entries.forEach { tab ->
- NavItem(
- selected = tab == currentTab,
- label = stringResource(id = tab.titleId),
- iconId = tab.iconId,
- onClick = { onClickItem(tab) },
- )
- }
- }
- }
- }
-}
-
-@Composable
-fun RowScope.NavItem(
- modifier: Modifier = Modifier,
- selected: Boolean,
- label: String,
- @DrawableRes iconId: Int,
- onClick: () -> Unit,
-) {
- Column(
- modifier = modifier
- .weight(1f)
- .fillMaxHeight()
- .clickable(onClick = onClick),
- horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.Center,
- ) {
- Icon(
- painter = painterResource(id = iconId),
- contentDescription = label,
- tint = if (selected) Color.Blue else Color.Gray,
- )
- Text(text = label, color = if (selected) Color.Blue else Color.Black)
- }
-}
diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
index 69cc2889..082c2ca5 100644
--- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
+++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt
@@ -16,22 +16,18 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.navigation.compose.NavHost
-import androidx.navigation.compose.composable
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.SplashDestination
-import com.yapp.common.navigation.destination.TopLevelDestination
import com.yapp.common.navigation.rememberOrbitNavigator
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.fortune.fortuneNavGraph
import com.yapp.home.homeNavGraph
-import com.yapp.mission.missionNavGraph
+import com.yapp.mission.missionScreen
import com.yapp.onboarding.onboardingNavGraph
import com.yapp.setting.settingNavGraph
-import com.yapp.splash.SplashRoute
+import com.yapp.splash.splashScreen
import com.yapp.ui.component.snackbar.CustomSnackBarVisuals
import com.yapp.ui.component.snackbar.OrbitSnackBar
-import com.yapp.webview.webViewNavGraph
-import kotlinx.collections.immutable.toImmutableList
+import com.yapp.webview.webViewScreen
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
@@ -43,14 +39,6 @@ internal fun OrbitNavHost(
Scaffold(
modifier = modifier,
- bottomBar = {
- OrbitBottomNavigationBar(
- visible = false,
- currentTab = navigator.currentTab,
- entries = TopLevelDestination.entries.toImmutableList(),
- onClickItem = navigator::navigateToTopLevelDestination,
- )
- },
snackbarHost = {
OrbitSnackBarHost(snackBarHostState = snackBarHostState)
},
@@ -58,27 +46,22 @@ internal fun OrbitNavHost(
) {
NavHost(
navController = navigator.navController,
- startDestination = SplashDestination.Route.route,
+ startDestination = navigator.startDestination,
modifier = Modifier.navigationBarsPadding(),
) {
- composable(SplashDestination.Route.route) {
- SplashRoute(navigator)
- }
- onboardingNavGraph(
- navigator = navigator,
- onFinishOnboarding = { navigator.navigateToTopLevelDestination(TopLevelDestination.HOME) },
- )
+ splashScreen(navigator = navigator)
+ onboardingNavGraph(navigator = navigator)
homeNavGraph(
navigator = navigator,
snackBarHostState = snackBarHostState,
)
- missionNavGraph(navigator = navigator)
+ missionScreen(navigator = navigator)
fortuneNavGraph(
navigator = navigator,
snackBarHostState = snackBarHostState,
)
settingNavGraph(navigator = navigator)
- webViewNavGraph(navigator = navigator)
+ webViewScreen(navigator = navigator)
}
}
}
diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts
index 94065df8..6c1d22e0 100644
--- a/feature/onboarding/build.gradle.kts
+++ b/feature/onboarding/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.media)
implementation(projects.domain)
implementation(projects.core.datastore)
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt
index 7f823f1a..abc83d5c 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt
@@ -49,7 +49,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus
import com.google.accompanist.permissions.shouldShowRationale
-import com.yapp.common.navigation.OrbitNavigator
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.onboarding.component.OnBoardingTopAppBar
import com.yapp.ui.component.button.OrbitButton
@@ -61,10 +62,12 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun OnboardingAccessRoute(
- navigator: OrbitNavigator,
viewModel: OnboardingViewModel,
) {
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+
+ val analyticsHelper = LocalAnalyticsHelper.current
+
val context = LocalContext.current
val coroutineScope = rememberCoroutineScope()
@@ -93,6 +96,15 @@ fun OnboardingAccessRoute(
val notificationPermissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestPermission(),
onResult = { granted ->
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_permission_request",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.IS_PERMISSION_GRANTED to granted,
+ ),
+ ),
+ )
+
isNotificationPermissionGranted = granted
if (!granted) hasRequestedPermission = true
},
@@ -115,7 +127,7 @@ fun OnboardingAccessRoute(
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
isAlarmPermissionGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
- val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as android.app.AlarmManager
+ val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.canScheduleExactAlarms()
} else {
true
@@ -127,6 +139,15 @@ fun OnboardingAccessRoute(
}
LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_permission_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "권한 설정1",
+ ),
+ ),
+ )
+
delay(1000)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt
index b5c4812a..963b03ba 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt
@@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.ui.component.timepicker.OrbitPicker
import com.yapp.ui.utils.heightForScreenPercentage
@@ -24,15 +25,37 @@ import feature.onboarding.R
fun OnboardingAlarmTimeSelectionRoute(
viewModel: OnboardingViewModel,
) {
- val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+ val analyticsHelper = LocalAnalyticsHelper.current
+
BackHandler {
- viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리
+ viewModel.processAction(OnboardingContract.Action.PreviousStep)
+ }
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_alarm_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성",
+ ),
+ ),
+ )
}
+
OnboardingAlarmTimeSelectionScreen(
- state = state,
currentStep = 1,
totalSteps = 6,
- onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) },
+ onNextClick = {
+ viewModel.processAction(OnboardingContract.Action.NextStep)
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_alarm_create",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성",
+ ),
+ ),
+ )
+ },
onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) },
setAlarmTime = { isAm, hour, minute ->
viewModel.processAction(OnboardingContract.Action.SetAlarmTime(isAm, hour, minute))
@@ -42,7 +65,6 @@ fun OnboardingAlarmTimeSelectionRoute(
@Composable
fun OnboardingAlarmTimeSelectionScreen(
- state: OnboardingContract.State,
currentStep: Int,
totalSteps: Int,
onNextClick: () -> Unit,
@@ -90,7 +112,6 @@ fun OnboardingAlarmTimeSelectionScreen(
fun OnboardingAlarmTimeSelectionScreenPreview() {
OrbitTheme {
OnboardingAlarmTimeSelectionScreen(
- state = OnboardingContract.State(),
currentStep = 0,
totalSteps = 0,
onNextClick = {},
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt
index 139316df..39868a89 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt
@@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -30,7 +31,8 @@ import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.onboarding.component.OnBoardingTopAppBar
import com.yapp.ui.component.button.OrbitButton
@@ -40,15 +42,37 @@ import feature.onboarding.R
@Composable
fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) {
- val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+ val analyticsHelper = LocalAnalyticsHelper.current
+
BackHandler {
viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_birthdate_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일",
+ ),
+ ),
+ )
+ }
+
OnboardingBirthdayScreen(
- state = state,
currentStep = 2,
totalSteps = 6,
- onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) },
+ onNextClick = {
+ viewModel.processAction(OnboardingContract.Action.NextStep)
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_birthdate_next",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일",
+ ),
+ ),
+ )
+ },
onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) },
onBirthDateChange = { lunar, year, month, day ->
viewModel.processAction(OnboardingContract.Action.UpdateBirthDate(lunar, year, month, day))
@@ -68,7 +92,6 @@ fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) {
@Composable
fun OnboardingBirthdayScreen(
- state: OnboardingContract.State,
currentStep: Int,
totalSteps: Int,
onNextClick: () -> Unit,
@@ -188,7 +211,6 @@ fun AnnotatedTermsText(
fun OnboardingBirthdayScreenPreview() {
OrbitTheme {
OnboardingBirthdayScreen(
- state = OnboardingContract.State(),
currentStep = 3,
totalSteps = 3,
onNextClick = {},
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt
index c51a632e..fcc8b744 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
@@ -18,6 +19,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.ui.component.lottie.LottieAnimation
import com.yapp.ui.utils.heightForScreenPercentage
@@ -27,10 +30,25 @@ import feature.onboarding.R
fun OnboardingCompleteRoute(
viewModel: OnboardingViewModel,
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_welcome1_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영1",
+ ),
+ ),
+ )
+ }
+
BackHandler {
- viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리
+ viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
+
OnboardingCompleteScreen1(
state = state,
onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) },
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt
index 7a77ad88..f99e8771 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt
@@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
@@ -23,7 +22,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.onboarding.component.OnBoardingTopAppBar
import com.yapp.ui.component.button.OrbitButton
@@ -35,12 +33,11 @@ import feature.onboarding.R
fun OnboardingCompleteRoute2(
viewModel: OnboardingViewModel,
) {
- val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
BackHandler {
- viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리
+ viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
+
OnboardingCompleteScreen2(
- state = state,
onNextClick = {
viewModel.processAction(OnboardingContract.Action.CompleteOnboarding)
viewModel.processAction(OnboardingContract.Action.CreateAlarm)
@@ -51,7 +48,6 @@ fun OnboardingCompleteRoute2(
@Composable
fun OnboardingCompleteScreen2(
- state: OnboardingContract.State,
onNextClick: () -> Unit,
onBackClick: () -> Unit,
currentStep: Int = 0,
@@ -122,7 +118,6 @@ fun OnboardingCompleteScreen2(
fun OnboardingCompleteScreen2Preview() {
OrbitTheme {
OnboardingCompleteScreen2(
- state = OnboardingContract.State(),
onNextClick = {},
onBackClick = {},
)
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt
index 0a987a74..5e8b83c2 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt
@@ -19,6 +19,7 @@ sealed class OnboardingContract {
val isBirthTimeValid: Boolean = false,
val isValid: Boolean = false,
val isBottomSheetOpen: Boolean = false,
+ val isShowWarningDialog: Boolean = false,
) : UiState {
val birthDateFormatted: String
get() {
@@ -61,6 +62,8 @@ sealed class OnboardingContract {
data object ToggleBottomSheet : Action()
data object CompleteOnboarding : Action()
data class OpenWebView(val url: String) : Action()
+ data object ShowWarningDialog : Action()
+ data object HideWarningDialog : Action()
}
enum class FieldType(val validationRegex: Regex) {
@@ -69,14 +72,30 @@ sealed class OnboardingContract {
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
+ data class NavigateToNextStep(val currentStep: Int) : SideEffect()
data object NavigateBack : SideEffect()
+
data object OnboardingCompleted : SideEffect()
+
data class OpenWebView(val url: String) : SideEffect()
}
+
+ companion object {
+ fun truncateTextToLimit(text: String, maxLength: Int = 12): String {
+ var totalLength = 0
+ val result = StringBuilder()
+
+ for (char in text) {
+ val charWeight = if (char in '가'..'힣') 2 else 1
+
+ if (totalLength + charWeight > maxLength) break
+
+ totalLength += charWeight
+ result.append(char)
+ }
+
+ return result.toString()
+ }
+ }
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt
index b18ba0a5..412d9677 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt
@@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.onboarding.component.GifImage
import com.yapp.ui.utils.heightForScreenPercentage
@@ -25,24 +26,45 @@ import feature.onboarding.R
fun OnboardingExplainRoute(
viewModel: OnboardingViewModel,
) {
- val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+ val analyticsHelper = LocalAnalyticsHelper.current
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_intro_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개",
+ ),
+ ),
+ )
+ }
OnboardingExplainScreen(
- state = state,
onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) },
)
}
@Composable
fun OnboardingExplainScreen(
- state: OnboardingContract.State,
onNextClick: () -> Unit,
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
OnboardingScreen(
currentStep = 0,
totalSteps = 0,
isButtonEnabled = true,
- onNextClick = onNextClick,
+ onNextClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_intro_next",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개",
+ ),
+ ),
+ )
+ onNextClick()
+ },
onBackClick = null,
showTopAppBar = false,
buttonLabel = "다음",
@@ -80,7 +102,6 @@ fun OnboardingExplainScreen(
fun OnboardingExplainScreenPreview() {
OrbitTheme {
OnboardingExplainScreen(
- state = OnboardingContract.State(),
onNextClick = {},
)
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt
index 24ca5151..c9ba857d 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt
@@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@@ -20,8 +21,11 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.onboarding.component.UserInfoBottomSheet
+import com.yapp.ui.component.dialog.OrbitDialog
import com.yapp.ui.toggle.OrbitGenderToggle
import com.yapp.ui.utils.heightForScreenPercentage
import com.yapp.ui.utils.paddingForScreenPercentage
@@ -32,9 +36,24 @@ fun OnboardingGenderRoute(
viewModel: OnboardingViewModel,
) {
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+
+ val analyticsHelper = LocalAnalyticsHelper.current
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_gender_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "성별",
+ ),
+ ),
+ )
+ }
+
BackHandler {
viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
+
OnboardingGenderScreen(
state = state,
currentStep = 5,
@@ -42,11 +61,18 @@ fun OnboardingGenderRoute(
onNextClick = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) },
onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) },
onGenderSelect = { gender ->
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_gender_select",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.GENDER to gender,
+ ),
+ ),
+ )
viewModel.processAction(OnboardingContract.Action.UpdateGender(gender))
},
onDismissRequest = {
viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet)
- viewModel.processAction(OnboardingContract.Action.PreviousStep)
},
onConfirmRequest = {
viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet)
@@ -113,6 +139,17 @@ fun OnboardingGenderScreen(
}
}
+ if (state.isShowWarningDialog) {
+ OrbitDialog(
+ title = stringResource(id = R.string.onboarding_warning_dialog_title),
+ message = stringResource(id = R.string.onboarding_warning_dialog_message),
+ confirmText = stringResource(id = R.string.onboarding_warning_dialog_btn_confirm),
+ onConfirm = {
+ onConfirmRequest()
+ },
+ )
+ }
+
UserInfoBottomSheet(
isSheetOpen = state.isBottomSheetOpen,
onDismissRequest = onDismissRequest,
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt
index db135bea..4c0b0692 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt
@@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -22,6 +23,8 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
import com.yapp.ui.component.textfield.OrbitTextField
import com.yapp.ui.extensions.customClickable
@@ -36,11 +39,22 @@ fun OnboardingNameRoute(
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
val focusRequester = remember { FocusRequester() }
- LaunchedEffect(key1 = Unit) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
+ LaunchedEffect(Unit) {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_name_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름",
+ ),
+ ),
+ )
focusRequester.requestFocus()
}
+
BackHandler {
- viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리
+ viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
OnboardingNameScreen(
@@ -48,10 +62,25 @@ fun OnboardingNameRoute(
currentStep = 4,
totalSteps = 6,
focusRequester = focusRequester,
- onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) },
+ onNextClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_name_next",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름",
+ ),
+ ),
+ )
+ viewModel.processAction(OnboardingContract.Action.NextStep)
+ },
onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) },
onTextChange = { value ->
- viewModel.processAction(OnboardingContract.Action.UpdateField(value, OnboardingContract.FieldType.NAME))
+ viewModel.processAction(
+ OnboardingContract.Action.UpdateField(
+ value,
+ OnboardingContract.FieldType.NAME,
+ ),
+ )
},
)
}
@@ -105,10 +134,13 @@ fun OnboardingNameScreen(
OrbitTextField(
text = textFieldValue,
onTextChange = { newValue ->
+ val truncatedText = OnboardingContract.truncateTextToLimit(newValue.text)
+
textFieldValue = newValue.copy(
- selection = TextRange(newValue.text.length),
+ text = truncatedText,
+ selection = TextRange(truncatedText.length),
)
- onTextChange(newValue.text)
+ onTextChange(truncatedText)
},
hint = "이름 입력",
isValid = state.isValid,
@@ -117,7 +149,15 @@ fun OnboardingNameScreen(
focusRequester = focusRequester,
modifier = Modifier
.fillMaxWidth()
- .paddingForScreenPercentage(horizontalPercentage = 0.192f, topPercentage = 0.086f),
+ .paddingForScreenPercentage(
+ horizontalPercentage = 0.192f,
+ topPercentage = 0.086f,
+ ),
+ keyboardActions = KeyboardActions(
+ onDone = {
+ focusManager.clearFocus()
+ },
+ ),
)
}
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt
index e2c9ac62..ee57af2e 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt
@@ -4,60 +4,106 @@ import android.net.Uri
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
+import androidx.navigation.navOptions
import androidx.navigation.navigation
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.OnboardingDestination
-import com.yapp.common.navigation.destination.WebViewDestination
import com.yapp.common.navigation.extensions.sharedHiltViewModel
+import com.yapp.common.navigation.route.OnboardingBaseRoute
+import com.yapp.common.navigation.route.OnboardingDestination
+import kotlinx.coroutines.flow.collectLatest
fun NavGraphBuilder.onboardingNavGraph(
navigator: OrbitNavigator,
- onFinishOnboarding: () -> Unit,
) {
- navigation(
- route = OnboardingDestination.Route.route,
- startDestination = OnboardingDestination.Explain.route,
- ) {
- OnboardingDestination.routes.forEach { destination ->
- composable(destination.route) { backStackEntry ->
- val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController)
+ navigation(startDestination = OnboardingDestination.Explain) {
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingExplainRoute(viewModel)
+ }
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleSideEffect(sideEffect, navigator, viewModel, onFinishOnboarding)
- }
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
}
+ }
+ OnboardingAlarmTimeSelectionRoute(viewModel)
+ }
- when (destination) {
- OnboardingDestination.Route, OnboardingDestination.Explain -> {
- OnboardingExplainRoute(viewModel)
- }
- OnboardingDestination.AlarmTimeSelection -> {
- OnboardingAlarmTimeSelectionRoute(viewModel)
- }
- OnboardingDestination.Birthday -> {
- OnboardingBirthdayRoute(viewModel)
- }
- OnboardingDestination.TimeOfBirth -> {
- OnboardingTimeOfBirthRoute(viewModel)
- }
- OnboardingDestination.Name -> {
- OnboardingNameRoute(viewModel)
- }
- OnboardingDestination.Gender -> {
- OnboardingGenderRoute(viewModel)
- }
- OnboardingDestination.Access -> {
- OnboardingAccessRoute(navigator, viewModel)
- }
- OnboardingDestination.Complete1 -> {
- OnboardingCompleteRoute(viewModel)
- }
- OnboardingDestination.Complete2 -> {
- OnboardingCompleteRoute2(viewModel)
- }
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingBirthdayRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingTimeOfBirthRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingNameRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingGenderRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingAccessRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
+ }
+ }
+ OnboardingCompleteRoute(viewModel)
+ }
+
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator, viewModel)
}
}
+ OnboardingCompleteRoute2(viewModel)
}
}
}
@@ -66,22 +112,29 @@ private fun handleSideEffect(
sideEffect: OnboardingContract.SideEffect,
navigator: OrbitNavigator,
viewModel: OnboardingViewModel,
- onFinishOnboarding: () -> Unit,
) {
when (sideEffect) {
- is OnboardingContract.SideEffect.Navigate -> navigator.navigateTo(
- route = sideEffect.route,
- popUpTo = sideEffect.popUpTo,
- inclusive = sideEffect.inclusive,
- )
+ is OnboardingContract.SideEffect.NavigateToNextStep -> {
+ navigator.navigateToOnboardingNextStep(sideEffect.currentStep)
+ }
+
OnboardingContract.SideEffect.NavigateBack -> {
viewModel.processAction(OnboardingContract.Action.Reset)
navigator.navigateBack()
}
- OnboardingContract.SideEffect.OnboardingCompleted -> onFinishOnboarding()
+
+ OnboardingContract.SideEffect.OnboardingCompleted -> {
+ navigator.navigateToHome(
+ navOptions = navOptions {
+ popUpTo(OnboardingBaseRoute) {
+ inclusive = true
+ }
+ },
+ )
+ }
is OnboardingContract.SideEffect.OpenWebView -> {
- navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}")
+ navigator.navigateToWebView(Uri.encode(sideEffect.url))
}
}
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt
index f08e098e..ece77336 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt
@@ -1,14 +1,13 @@
package com.yapp.onboarding
+import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -22,7 +21,6 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.SoftwareKeyboardController
-import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.KeyboardType
@@ -32,7 +30,10 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.LocalAnalyticsHelper
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.onboarding.component.UnknownBirthTimeButton
import com.yapp.ui.component.textfield.OrbitTextField
import com.yapp.ui.extensions.customClickable
import com.yapp.ui.utils.heightForScreenPercentage
@@ -48,8 +49,22 @@ fun OnboardingTimeOfBirthRoute(
val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current
val focusRequester = remember { FocusRequester() }
- LaunchedEffect(key1 = Unit) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
+ LaunchedEffect(Unit) {
focusRequester.requestFocus()
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_birthtime_view",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간",
+ ),
+ ),
+ )
+ }
+
+ BackHandler {
+ viewModel.processAction(OnboardingContract.Action.PreviousStep)
}
OnboardingTimeOfBirthScreen(
@@ -58,6 +73,14 @@ fun OnboardingTimeOfBirthRoute(
totalSteps = 6,
focusRequester = focusRequester,
onNextClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_birthtime_next",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간",
+ ),
+ ),
+ )
viewModel.processAction(OnboardingContract.Action.Reset)
viewModel.processAction(OnboardingContract.Action.NextStep)
keyboardController?.hide()
@@ -81,6 +104,8 @@ fun OnboardingTimeOfBirthScreen(
onBackClick: () -> Unit,
onTextChange: (String) -> Unit,
) {
+ val analyticsHelper = LocalAnalyticsHelper.current
+
val focusManager = LocalFocusManager.current
var textFieldValue by remember {
mutableStateOf(
@@ -90,7 +115,6 @@ fun OnboardingTimeOfBirthScreen(
),
)
}
- var isPressed by remember { mutableStateOf(false) }
OnboardingScreen(
currentStep = currentStep,
@@ -144,37 +168,24 @@ fun OnboardingTimeOfBirthScreen(
)
}
- Row(
+ UnknownBirthTimeButton(
modifier = Modifier
- .fillMaxWidth()
- .padding(bottom = 16.dp)
.align(Alignment.CenterHorizontally)
- .customClickable(
- rippleEnabled = false,
- onClick = {
- textFieldValue = TextFieldValue("시간모름")
- onTextChange("시간모름")
- onNextClick()
- },
- onPress = { isPressed = true },
- onRelease = { isPressed = false },
- ),
- horizontalArrangement = Arrangement.Center,
- verticalAlignment = Alignment.CenterVertically,
- ) {
- Icon(
- painter = painterResource(id = core.designsystem.R.drawable.ic_check),
- contentDescription = "Check",
- tint = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경
- )
- Text(
- text = stringResource(id = R.string.onboarding_step4_text_check),
- style = OrbitTheme.typography.body1Medium,
- color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경
- modifier = Modifier.padding(start = 4.dp),
- textAlign = TextAlign.Center,
- )
- }
+ .padding(bottom = 20.dp),
+ onClick = {
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_birthtime_unknown",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간",
+ ),
+ ),
+ )
+ textFieldValue = TextFieldValue("시간모름")
+ onTextChange("시간모름")
+ onNextClick()
+ },
+ )
}
}
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt
index 2077b323..ec145349 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt
@@ -3,7 +3,9 @@ package com.yapp.onboarding
import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.OnboardingDestination
+import com.yapp.analytics.AnalyticsEvent
+import com.yapp.analytics.AnalyticsHelper
+import com.yapp.common.navigation.route.OnboardingDestination
import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.Alarm
import com.yapp.domain.model.AlarmDay
@@ -16,9 +18,11 @@ import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
+import kotlin.reflect.KClass
@HiltViewModel
class OnboardingViewModel @Inject constructor(
+ private val analyticsHelper: AnalyticsHelper,
private val signUpRepository: SignUpRepository,
private val userPreferences: UserPreferences,
private val alarmUseCase: AlarmUseCase,
@@ -31,6 +35,9 @@ class OnboardingViewModel @Inject constructor(
birthType = savedStateHandle["birthType"] ?: "양력",
),
) {
+ private val currentRoute: KClass?
+ get() = OnboardingDestination.routes.getOrNull(currentState.currentStep)
+
fun processAction(action: OnboardingContract.Action) {
when (action) {
is OnboardingContract.Action.NextStep -> moveToNextStep()
@@ -45,6 +52,8 @@ class OnboardingViewModel @Inject constructor(
is OnboardingContract.Action.ToggleBottomSheet -> toggleBottomSheet()
is OnboardingContract.Action.CompleteOnboarding -> completeOnboarding()
is OnboardingContract.Action.OpenWebView -> openWebView(action.url)
+ is OnboardingContract.Action.ShowWarningDialog -> showWarningDialog()
+ is OnboardingContract.Action.HideWarningDialog -> hideWarningDialog()
}
}
@@ -62,12 +71,24 @@ class OnboardingViewModel @Inject constructor(
if (result.isSuccess) {
val userId = result.getOrNull() ?: return@launch
+ val userName = state.userName
userPreferences.saveUserId(userId)
+ userPreferences.saveUserName(userName)
+
+ analyticsHelper.setUserId(userId)
+ analyticsHelper.logEvent(
+ AnalyticsEvent(
+ type = "onboarding_complete",
+ properties = mapOf(
+ AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영2",
+ ),
+ ),
+ )
updateState { copy(isBottomSheetOpen = false) }
moveToNextStep()
} else {
- emitSideEffect(OnboardingContract.SideEffect.NavigateBack)
+ processAction(OnboardingContract.Action.ShowWarningDialog)
}
}
}
@@ -75,12 +96,15 @@ class OnboardingViewModel @Inject constructor(
private fun moveToNextStep() {
val currentStep = container.stateFlow.value.currentStep
val nextStep = currentStep + 1
- val nextRoute = OnboardingDestination.nextRoute(currentStep)
+ val nextRoute = OnboardingDestination.getNextRouteForStep(currentStep)
+
+ savedStateHandle["birthDate"] = currentState.birthDate
+ savedStateHandle["birthType"] = currentState.birthType
if (nextRoute != null) {
savedStateHandle["currentStep"] = nextStep
updateState { copy(currentStep = nextStep) }
- emitSideEffect(OnboardingContract.SideEffect.Navigate(nextRoute))
+ emitSideEffect(OnboardingContract.SideEffect.NavigateToNextStep(currentStep))
} else {
emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted)
}
@@ -160,14 +184,15 @@ class OnboardingViewModel @Inject constructor(
}
OnboardingContract.FieldType.NAME -> {
- val isValid = value.matches(fieldType.validationRegex)
+ val truncatedValue = OnboardingContract.truncateTextToLimit(value)
+ val isValid = truncatedValue.matches(fieldType.validationRegex)
updateState {
copy(
- textFieldValue = value,
- userName = value,
- showWarning = value.isNotEmpty() && !isValid,
- isButtonEnabled = value.isNotEmpty() && isValid,
+ textFieldValue = truncatedValue,
+ userName = truncatedValue,
+ showWarning = !isValid,
+ isButtonEnabled = truncatedValue.isNotEmpty() && isValid,
isValid = isValid,
)
}
@@ -176,11 +201,10 @@ class OnboardingViewModel @Inject constructor(
}
private fun updateBirthDate(lunar: String, year: Int, month: Int, day: Int) {
+ if (currentRoute != OnboardingDestination.Birthday::class) return
+
val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}"
- if (currentState.birthDate == formattedDate && currentState.birthType == lunar) {
- return
- }
hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK)
savedStateHandle["birthDate"] = formattedDate
savedStateHandle["birthType"] = lunar
@@ -224,4 +248,12 @@ class OnboardingViewModel @Inject constructor(
private fun openWebView(url: String) {
emitSideEffect(OnboardingContract.SideEffect.OpenWebView(url))
}
+
+ private fun showWarningDialog() {
+ updateState { copy(isShowWarningDialog = true) }
+ }
+
+ private fun hideWarningDialog() {
+ updateState { copy(isShowWarningDialog = false) }
+ }
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt
index 2ca70ab0..daca8c79 100644
--- a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt
@@ -1,7 +1,6 @@
package com.yapp.onboarding.component
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -19,6 +18,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.extensions.customClickable
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -37,7 +37,12 @@ fun OnBoardingTopAppBar(
contentDescription = "Back",
tint = OrbitTheme.colors.white,
modifier = Modifier
- .clickable(onClick = onBackClick)
+ .customClickable(
+ rippleEnabled = false,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onBackClick,
+ )
.padding(start = 20.dp),
)
}
@@ -67,5 +72,10 @@ fun OnBoardingTopAppBar(
@Composable
@Preview
fun OnBoardingTopAppBarPreview() {
- OnBoardingTopAppBar(currentStep = 1, totalSteps = 3)
+ OnBoardingTopAppBar(
+ currentStep = 1,
+ totalSteps = 3,
+ onBackClick = {},
+ showTopAppBarActions = true,
+ )
}
diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt
new file mode 100644
index 00000000..dd7ce8c8
--- /dev/null
+++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt
@@ -0,0 +1,79 @@
+package com.yapp.onboarding.component
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.collectIsPressedAsState
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.yapp.designsystem.theme.OrbitTheme
+import feature.onboarding.R
+
+@Composable
+fun UnknownBirthTimeButton(
+ modifier: Modifier = Modifier,
+ onClick: () -> Unit,
+ containerColor: Color = Color.Transparent,
+ contentColor: Color = OrbitTheme.colors.white,
+ pressedContainerColor: Color = OrbitTheme.colors.gray_800,
+ pressedContentColor: Color = OrbitTheme.colors.main,
+ shape: Shape = RoundedCornerShape(12.dp),
+) {
+ val interactionSource = remember { MutableInteractionSource() }
+ val isPressed by interactionSource.collectIsPressedAsState()
+
+ val currentContainerColor = if (isPressed) pressedContainerColor else containerColor
+ val currentContentColor = if (isPressed) pressedContentColor else contentColor
+
+ Row(
+ modifier = modifier
+ .background(currentContainerColor, shape)
+ .clickable(
+ interactionSource = interactionSource,
+ indication = null,
+ onClick = onClick,
+ )
+ .padding(horizontal = 24.dp, vertical = 6.dp),
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.Center,
+ ) {
+ Text(
+ text = stringResource(id = R.string.onboarding_step4_text_check),
+ style = OrbitTheme.typography.body1Medium,
+ color = currentContentColor,
+ )
+ Spacer(modifier = Modifier.width(4.dp))
+ Icon(
+ painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right),
+ contentDescription = null,
+ modifier = Modifier.size(20.dp),
+ tint = currentContentColor,
+ )
+ }
+}
+
+@Composable
+@Preview
+fun PreviewUnknownBirthTimeButton() {
+ UnknownBirthTimeButton(
+ onClick = { /*TODO*/ },
+ )
+}
diff --git a/feature/onboarding/src/main/res/values/values.xml b/feature/onboarding/src/main/res/values/values.xml
index 715f1b0c..840c5f0f 100644
--- a/feature/onboarding/src/main/res/values/values.xml
+++ b/feature/onboarding/src/main/res/values/values.xml
@@ -11,7 +11,7 @@
태어난 시간을 알려주세요
태어난 시간을 몰라요
- 입력한 숫자를 확인해 주세요
+ 입력한 내용를 확인해 주세요
어떤 이름으로 불리길\n원하시나요?
입력한 내용을 확인해 주세요
@@ -33,4 +33,8 @@
기상 미션을 수행하면\n운세를 확인 할 수 있어요
오르비의 하루 운세로\n아침을 즐겁게 시작해 보세요!
+ 오류
+ 서비스가 일시적으로 사용 불가능합니다.\n잠시 후 다시 시도해주세요.
+ 확인
+
diff --git a/feature/setting/build.gradle.kts b/feature/setting/build.gradle.kts
index 6227faa3..96e74f94 100644
--- a/feature/setting/build.gradle.kts
+++ b/feature/setting/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.domain)
implementation(projects.core.datastore)
implementation(libs.orbit.core)
diff --git a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt
index 6478df74..1870ceea 100644
--- a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt
@@ -9,6 +9,9 @@ import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
@@ -58,7 +61,10 @@ fun EditBirthdayScreen(
onCancelDialog: () -> Unit,
onUpdateBirthDate: (String, Int, Int, Int) -> Unit,
) {
- val (year, month, day) = state.birthDate.split("-")
+ var selectedLunar by remember { mutableStateOf(state.birthType) }
+ var selectedYear by remember { mutableStateOf(state.birthDate.split("-")[0].toInt()) }
+ var selectedMonth by remember { mutableStateOf(state.birthDate.split("-")[1].toInt()) }
+ var selectedDay by remember { mutableStateOf(state.birthDate.split("-")[2].toInt()) }
Column(
modifier = Modifier
@@ -72,7 +78,9 @@ fun EditBirthdayScreen(
showTopAppBarActions = true,
title = "생년월일 수정",
actionTitle = "확인",
+ isActionEnabled = true,
onActionClick = {
+ onUpdateBirthDate(selectedLunar, selectedYear, selectedMonth, selectedDay)
onConfirm()
},
)
@@ -85,12 +93,15 @@ fun EditBirthdayScreen(
Spacer(modifier = Modifier.heightForScreenPercentage(0.16f))
OrbitYearMonthPicker(
- initialLunar = state.birthType,
- initialYear = year,
- initialMonth = month,
- initialDay = day,
+ initialLunar = selectedLunar,
+ initialYear = selectedYear.toString(),
+ initialMonth = selectedMonth.toString(),
+ initialDay = selectedDay.toString(),
) { lunar, year, month, day ->
- onUpdateBirthDate(lunar, year, month, day)
+ selectedLunar = lunar
+ selectedYear = year
+ selectedMonth = month
+ selectedDay = day
}
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt
index 830b66a9..6df4257a 100644
--- a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt
@@ -1,6 +1,5 @@
package com.yapp.setting
-import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
@@ -20,15 +19,20 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
@@ -49,7 +53,11 @@ fun EditProfileRoute(
) {
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
- Log.d("EditProfileRoute", "State: $state")
+ LaunchedEffect(state.shouldFetchUserInfo) {
+ if (state.shouldFetchUserInfo) {
+ viewModel.onAction(SettingContract.Action.RefreshUserInfo)
+ }
+ }
EditProfileScreen(
state = state,
@@ -95,17 +103,19 @@ fun EditProfileScreen(
) {
val focusManager = LocalFocusManager.current
- val nameTextFieldValue = remember(state.name) {
- TextFieldValue(
- text = state.name,
- selection = TextRange(state.name.length),
- )
+ val nameTextFieldValue = remember { mutableStateOf(TextFieldValue(state.name)) }
+ val birthTimeTextFieldValue = remember { mutableStateOf(TextFieldValue(state.timeOfBirth)) }
+
+ LaunchedEffect(state.name) {
+ if (state.name != nameTextFieldValue.value.text) {
+ nameTextFieldValue.value = TextFieldValue(state.name)
+ }
}
- val birthTimeTextFieldValue = remember(state.timeOfBirth) {
- TextFieldValue(
- text = state.timeOfBirth,
- selection = TextRange(state.timeOfBirth.length),
- )
+
+ LaunchedEffect(state.timeOfBirth) {
+ if (state.timeOfBirth != birthTimeTextFieldValue.value.text) {
+ birthTimeTextFieldValue.value = TextFieldValue(state.timeOfBirth)
+ }
}
Column(
@@ -124,6 +134,7 @@ fun EditProfileScreen(
title = "프로필 수정",
actionTitle = "저장",
onActionClick = onSaveUserInfo,
+ isActionEnabled = state.isActionEnabled,
)
Column(
@@ -138,18 +149,22 @@ fun EditProfileScreen(
)
Spacer(modifier = Modifier.height(8.dp))
OrbitTextField(
- text = nameTextFieldValue,
+ text = nameTextFieldValue.value,
onTextChange = { newValue ->
+ nameTextFieldValue.value = newValue
onUpdateName(newValue.text)
},
hint = "이름 입력",
isValid = state.isNameValid,
showWarning = !state.isNameValid,
- warningMessage = "올바른 이름을 입력해주세요.",
+ warningMessage = "입력한 내용을 확인해 주세요.",
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 18.dp),
textAlign = TextAlign.Start,
+ keyboardActions = KeyboardActions(
+ onDone = { focusManager.clearFocus() },
+ ),
)
Spacer(modifier = Modifier.height(18.dp))
ContentsTitle(
@@ -183,6 +198,7 @@ fun EditProfileScreen(
onToggle = { onToggleGender(true) },
height = 52.dp,
textStyle = OrbitTheme.typography.body1Regular,
+ shape = RoundedCornerShape(12.dp),
)
}
Box(modifier = Modifier.weight(1f)) {
@@ -192,6 +208,7 @@ fun EditProfileScreen(
onToggle = { onToggleGender(false) },
height = 52.dp,
textStyle = OrbitTheme.typography.body1Regular,
+ shape = RoundedCornerShape(12.dp),
)
}
}
@@ -210,19 +227,27 @@ fun EditProfileScreen(
verticalAlignment = Alignment.CenterVertically,
) {
OrbitTextField(
- text = birthTimeTextFieldValue,
+ text = birthTimeTextFieldValue.value,
onTextChange = { newValue ->
- val formattedTime = formatTimeInput(newValue.text, state.timeOfBirth)
- onUpdateTimeOfBirth(formattedTime)
+ val formattedValue = formatTimeInput(newValue.text, state.timeOfBirth)
+ birthTimeTextFieldValue.value = formattedValue
+ onUpdateTimeOfBirth(formattedValue.text)
},
- hint = "시간모름",
+ hint = "23:59",
isValid = state.isTimeValid,
showWarning = !state.isTimeValid,
- warningMessage = "올바른 시간을 입력해주세요.",
enabled = !state.isTimeUnknown,
modifier = Modifier
.weight(1f),
textAlign = TextAlign.Start,
+ keyboardOptions = KeyboardOptions.Default.copy(
+ keyboardType = KeyboardType.Number,
+ ),
+ keyboardActions = KeyboardActions(
+ onDone = {
+ focusManager.clearFocus()
+ },
+ ),
)
Spacer(modifier = Modifier.width(12.dp))
@@ -239,7 +264,7 @@ fun EditProfileScreen(
color = if (state.isTimeUnknown) OrbitTheme.colors.main else OrbitTheme.colors.white,
)
}
- if (!state.isTimeValid) {
+ if (!state.isTimeUnknown && !state.isTimeValid) {
WarningMessage(
message = "올바른 시간을 입력해주세요.",
textAlign = TextAlign.Start,
@@ -261,11 +286,11 @@ fun EditProfileScreen(
}
}
-fun formatTimeInput(input: String, previousText: String): String {
+fun formatTimeInput(input: String, previousText: String): TextFieldValue {
val sanitizedValue = input.filter { it.isDigit() }
val isDeleting = sanitizedValue.length < previousText.filter { it.isDigit() }.length
- return when {
+ val newText = when {
isDeleting && previousText.endsWith(":") -> sanitizedValue
sanitizedValue.length > 2 -> {
val hours = sanitizedValue.take(2)
@@ -283,6 +308,13 @@ fun formatTimeInput(input: String, previousText: String): String {
else -> sanitizedValue
}
+ val cursorPosition = if (newText.length == 3 && newText.endsWith(":")) {
+ 3
+ } else {
+ newText.length
+ }
+
+ return TextFieldValue(newText, TextRange(cursorPosition))
}
@Composable
diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt
index 9e0049ca..166388b3 100644
--- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt
@@ -2,7 +2,6 @@ package com.yapp.setting
import android.util.Log
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.SettingDestination
import com.yapp.datastore.UserPreferences
import com.yapp.domain.model.EditUser
import com.yapp.domain.repository.UserInfoRepository
@@ -20,69 +19,79 @@ class EditProfileViewModel @Inject constructor(
) : BaseViewModel(
SettingContract.State(),
) {
-
- init {
- viewModelScope.launch {
- userPreferences.userIdFlow.collect { userId ->
- if (userId != null) {
- fetchUserInfo(userId)
+ fun onAction(action: SettingContract.Action) = intent {
+ when (action) {
+ is SettingContract.Action.UpdateName -> updateName(action.name)
+ is SettingContract.Action.UpdateBirthDate -> updateBirthDate(action)
+ is SettingContract.Action.UpdateCalendarType -> updateCalendarType(action.calendarType)
+ is SettingContract.Action.UpdateGender -> updateGender(action.gender)
+ is SettingContract.Action.ToggleGender -> toggleGender(action.isMale)
+ is SettingContract.Action.ToggleTimeUnknown -> toggleTimeUnknown(action.isChecked)
+ is SettingContract.Action.UpdateTimeOfBirth -> updateTimeOfBirth(action.time)
+ is SettingContract.Action.ConfirmAndNavigateBack -> emitSideEffect(SettingContract.SideEffect.NavigateBack)
+ is SettingContract.Action.Reset -> updateState { SettingContract.State() }
+ SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) }
+ SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) }
+ SettingContract.Action.PreviousStep -> previousStep()
+ SettingContract.Action.SubmitUserInfo -> submitUserInfo()
+ is SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday()
+ is SettingContract.Action.RefreshUserInfo -> {
+ if (currentState.shouldFetchUserInfo) {
+ refreshUserInfo()
}
}
+ else -> {}
}
}
- fun onAction(action: SettingContract.Action) = intent {
- when (action) {
- is SettingContract.Action.UpdateName -> updateState {
- val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name)
- copy(name = action.name, isNameValid = isValid)
- }
+ private fun updateName(name: String) = updateState {
+ copy(name = name, isNameValid = validateName(name))
+ }
- is SettingContract.Action.UpdateBirthDate -> {
- val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}"
- updateState { state.copy(birthDate = formattedDate) }
- }
+ private fun validateName(name: String): Boolean {
+ return SettingContract.FieldType.NAME.validationRegex.matches(name)
+ }
- is SettingContract.Action.UpdateCalendarType -> {
- Log.d("EditProfileViewModel", "Received new calendarType: ${action.calendarType}")
- updateState { state.copy(birthType = action.calendarType) }
- }
+ private fun updateBirthDate(action: SettingContract.Action.UpdateBirthDate) = updateState {
+ val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${
+ action.day.toString().padStart(2, '0')
+ }"
+ copy(birthDate = formattedDate)
+ }
- is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) }
- is SettingContract.Action.ToggleGender -> updateState {
- copy(
- isMaleSelected = action.isMale,
- isFemaleSelected = !action.isMale,
- )
- }
+ private fun updateCalendarType(calendarType: String) = updateState {
+ copy(birthType = calendarType)
+ }
- is SettingContract.Action.ToggleTimeUnknown -> updateState {
- copy(
- isTimeUnknown = action.isChecked,
- timeOfBirth = if (action.isChecked) "시간모름" else "",
- )
- }
+ private fun updateGender(gender: String) = updateState {
+ copy(selectedGender = gender)
+ }
- is SettingContract.Action.UpdateTimeOfBirth -> updateState {
- val isValid = if (action.time.length == 5) {
- SettingContract.FieldType.TIME.validationRegex.matches(action.time)
- } else {
- true
- }
- copy(timeOfBirth = action.time, isTimeValid = isValid)
- }
+ private fun toggleGender(isMale: Boolean) = updateState {
+ copy(
+ isMaleSelected = isMale,
+ isFemaleSelected = !isMale,
+ selectedGender = if (isMale) "남성" else "여성",
+ )
+ }
- is SettingContract.Action.ConfirmAndNavigateBack -> {
- emitSideEffect(SettingContract.SideEffect.NavigateBack)
- }
+ private fun toggleTimeUnknown(isChecked: Boolean) = updateState {
+ val newState = copy(
+ isTimeUnknown = isChecked,
+ timeOfBirth = if (isChecked) "시간모름" else "",
+ )
+ newState.copy(isTimeValid = validateTimeOfBirth(newState.timeOfBirth, isChecked))
+ }
- is SettingContract.Action.Reset -> updateState { SettingContract.State() }
- SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) }
- SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) }
- SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack)
- SettingContract.Action.SubmitUserInfo -> submitUserInfo()
- SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday()
- else -> {}
+ private fun updateTimeOfBirth(time: String) = updateState {
+ copy(timeOfBirth = time, isTimeValid = validateTimeOfBirth(time, isTimeUnknown))
+ }
+
+ private fun validateTimeOfBirth(time: String, isTimeUnknown: Boolean): Boolean {
+ return if (isTimeUnknown) {
+ true
+ } else {
+ time.length == 5 && SettingContract.FieldType.TIME.validationRegex.matches(time)
}
}
@@ -92,14 +101,10 @@ class EditProfileViewModel @Inject constructor(
.onSuccess { user ->
val (initialYear, initialMonth, initialDay) = user.birthDate.split("-")
- Log.d(
- "EditProfileViewModel",
- "Fetched user data -> birthDate: ${user.birthDate}",
- )
-
updateState {
copy(
name = user.name,
+ isNameValid = validateName(user.name),
initialYear = initialYear,
initialMonth = initialMonth,
initialDay = initialDay,
@@ -108,6 +113,10 @@ class EditProfileViewModel @Inject constructor(
selectedGender = user.gender,
timeOfBirth = user.birthTime ?: "99:99",
isTimeUnknown = user.birthTime == "시간모름",
+ isTimeValid = validateTimeOfBirth(
+ user.birthTime ?: "",
+ user.birthTime == "시간모름",
+ ),
isMaleSelected = user.gender == "남성",
isFemaleSelected = user.gender == "여성",
)
@@ -119,6 +128,11 @@ class EditProfileViewModel @Inject constructor(
}
}
+ private fun previousStep() {
+ updateState { copy(shouldFetchUserInfo = true) }
+ emitSideEffect(SettingContract.SideEffect.NavigateBack)
+ }
+
private fun submitUserInfo() = viewModelScope.launch {
val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch
val state = container.stateFlow.value
@@ -134,8 +148,8 @@ class EditProfileViewModel @Inject constructor(
val result = userInfoRepository.updateUserInfo(userId, updatedUser)
if (result.isSuccess) {
- Log.d("EditProfileViewModel", "사용자 정보 수정 성공")
- emitSideEffect(SettingContract.SideEffect.NavigateBack)
+ userPreferences.saveUserName(state.name)
+ emitSideEffect(SettingContract.SideEffect.NavigateToSettingRoute)
} else {
Log.e("EditProfileViewModel", "사용자 정보 수정 실패")
}
@@ -144,9 +158,18 @@ class EditProfileViewModel @Inject constructor(
private fun extractBirthDate(formattedDate: String): String {
return formattedDate.replace(Regex("[^0-9-]"), "")
}
- // YYYY-MM-DD 형식으로 서버에 전송
- private fun navigateToEditBirthday() = intent {
- emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditBirthday.route))
+ private fun navigateToEditBirthday() {
+ updateState { copy(shouldFetchUserInfo = false) }
+ emitSideEffect(SettingContract.SideEffect.NavigateToEditBirthday)
+ }
+
+ private fun refreshUserInfo() {
+ viewModelScope.launch {
+ val userId = userPreferences.userIdFlow.firstOrNull()
+ if (userId != null) {
+ fetchUserInfo(userId)
+ }
+ }
}
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt
index 31275f24..6f957cc3 100644
--- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt
@@ -4,6 +4,7 @@ import com.yapp.ui.base.UiState
sealed class SettingContract {
data class State(
+ val initialLoading: Boolean = true,
val name: String = "",
val initialYear: String = "2000",
val initialMonth: String = "01",
@@ -18,6 +19,7 @@ sealed class SettingContract {
val isDialogVisible: Boolean = false,
val isNameValid: Boolean = true,
val isTimeValid: Boolean = true,
+ val shouldFetchUserInfo: Boolean = true,
) : UiState {
val birthDateFormatted: String
get() {
@@ -28,6 +30,13 @@ sealed class SettingContract {
return "$birthType $year $month $day"
}
+ val timeOfBirthFormatted: String
+ get() = timeOfBirth.takeIf { it.length >= 5 }?.let {
+ "${it.substring(0, 2)}시 ${it.substring(3, 5)}분"
+ } ?: " "
+
+ val isActionEnabled: Boolean
+ get() = isNameValid && (isTimeUnknown || (timeOfBirth.length == 5 && isTimeValid)) && selectedGender != null
}
sealed class Action {
@@ -47,6 +56,7 @@ sealed class SettingContract {
data object HideDialog : Action()
data object SubmitUserInfo : Action()
data class OpenWebView(val url: String) : Action()
+ data object RefreshUserInfo : Action()
}
enum class FieldType(val validationRegex: Regex) {
@@ -55,13 +65,14 @@ sealed class SettingContract {
}
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(
- val route: String,
- val popUpTo: String? = null,
- val inclusive: Boolean = false,
- ) : SideEffect()
-
data object NavigateBack : SideEffect()
+
+ data object NavigateToSettingRoute : SideEffect()
+
+ data object NavigateToEditProfile : SideEffect()
+
+ data object NavigateToEditBirthday : SideEffect()
+
data class OpenWebView(val url: String) : SideEffect()
}
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt
index 36e41aa8..054c523b 100644
--- a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt
@@ -8,127 +8,122 @@ import androidx.compose.animation.slideOutVertically
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
+import androidx.navigation.navOptions
import androidx.navigation.navigation
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.SettingDestination
-import com.yapp.common.navigation.destination.WebViewDestination
import com.yapp.common.navigation.extensions.sharedHiltViewModel
-import com.yapp.ui.base.BaseViewModel
+import com.yapp.common.navigation.route.SettingBaseRoute
+import com.yapp.common.navigation.route.SettingDestination
+import kotlinx.coroutines.flow.collectLatest
fun NavGraphBuilder.settingNavGraph(
navigator: OrbitNavigator,
) {
- navigation(
- route = SettingDestination.Route.route,
- startDestination = SettingDestination.Setting.route,
+ navigation(
+ startDestination = SettingDestination.Setting,
) {
- SettingDestination.routes.forEach { destination ->
- when (destination) {
- SettingDestination.Setting -> {
- composable(route = destination.route) { backStackEntry ->
- val viewModel =
- backStackEntry.sharedHiltViewModel(navigator.navController)
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleSettingSideEffect(sideEffect, navigator, viewModel)
- }
- }
-
- SettingRoute(viewModel)
- }
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator)
}
+ }
- SettingDestination.EditProfile -> {
- composable(route = destination.route) { backStackEntry ->
- val viewModel =
- backStackEntry.sharedHiltViewModel(navigator.navController)
+ SettingRoute(viewModel)
+ }
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleSettingSideEffect(sideEffect, navigator, viewModel)
- }
- }
+ composable {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
- EditProfileRoute(viewModel)
- }
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator)
}
+ }
- SettingDestination.EditBirthday -> {
- composable(
- route = destination.route,
- enterTransition = {
- slideInVertically(
- initialOffsetY = { it },
- animationSpec = tween(
- durationMillis = 350,
- easing = FastOutSlowInEasing,
- ),
- )
- },
- exitTransition = {
- slideOutVertically(
- targetOffsetY = { -it },
- animationSpec = tween(
- durationMillis = 250,
- easing = FastOutSlowInEasing,
- ),
- )
- },
- popEnterTransition = {
- slideInVertically(
- initialOffsetY = { -it },
- animationSpec = tween(
- durationMillis = 300,
- easing = FastOutSlowInEasing,
- ),
- )
- },
- popExitTransition = {
- slideOutVertically(
- targetOffsetY = { it },
- animationSpec = tween(
- durationMillis = 300,
- easing = FastOutSlowInEasing,
- ),
- )
- },
- ) { backStackEntry ->
- val viewModel =
- backStackEntry.sharedHiltViewModel(navigator.navController)
+ EditProfileRoute(viewModel)
+ }
- LaunchedEffect(viewModel) {
- viewModel.container.sideEffectFlow.collect { sideEffect ->
- handleSettingSideEffect(sideEffect, navigator, viewModel)
- }
- }
+ composable(
+ enterTransition = {
+ slideInVertically(
+ initialOffsetY = { it },
+ animationSpec = tween(
+ durationMillis = 350,
+ easing = FastOutSlowInEasing,
+ ),
+ )
+ },
+ exitTransition = {
+ slideOutVertically(
+ targetOffsetY = { -it },
+ animationSpec = tween(
+ durationMillis = 250,
+ easing = FastOutSlowInEasing,
+ ),
+ )
+ },
+ popEnterTransition = {
+ slideInVertically(
+ initialOffsetY = { -it },
+ animationSpec = tween(
+ durationMillis = 300,
+ easing = FastOutSlowInEasing,
+ ),
+ )
+ },
+ popExitTransition = {
+ slideOutVertically(
+ targetOffsetY = { it },
+ animationSpec = tween(
+ durationMillis = 300,
+ easing = FastOutSlowInEasing,
+ ),
+ )
+ },
+ ) {
+ val viewModel = it.sharedHiltViewModel(navigator.navController)
- EditBirthdayRoute(viewModel)
- }
+ LaunchedEffect(viewModel) {
+ viewModel.container.sideEffectFlow.collectLatest { sideEffect ->
+ handleSideEffect(sideEffect, navigator)
}
-
- else -> {}
}
+
+ EditBirthdayRoute(viewModel)
}
}
}
-private fun handleSettingSideEffect(
+private fun handleSideEffect(
sideEffect: SettingContract.SideEffect,
navigator: OrbitNavigator,
- viewModel: BaseViewModel<*, *>,
) {
when (sideEffect) {
- is SettingContract.SideEffect.Navigate -> navigator.navigateTo(
- route = sideEffect.route,
- popUpTo = sideEffect.popUpTo,
- inclusive = sideEffect.inclusive,
- )
-
SettingContract.SideEffect.NavigateBack -> navigator.navigateBack()
+ SettingContract.SideEffect.NavigateToSettingRoute -> {
+ navigator.navigateToSetting(
+ navOptions = navOptions {
+ popUpTo(SettingBaseRoute) {
+ inclusive = true
+ }
+ },
+ )
+ }
+
+ SettingContract.SideEffect.NavigateToEditProfile -> {
+ navigator.navigateToEditProfile()
+ }
+
+ SettingContract.SideEffect.NavigateToEditBirthday -> {
+ navigator.navigateToEditBirthDay()
+ }
+
is SettingContract.SideEffect.OpenWebView -> {
- navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}")
+ navigator.navigateToWebView(Uri.encode(sideEffect.url))
}
}
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt
index f7aaa76b..03f79fd0 100644
--- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt
@@ -1,7 +1,8 @@
package com.yapp.setting
+import android.content.Intent
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
@@ -9,12 +10,17 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import androidx.core.net.toUri
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.yapp.designsystem.theme.OrbitTheme
@@ -24,25 +30,38 @@ import com.yapp.setting.component.SettingTopAppBar
import com.yapp.setting.component.TableOfContentsText
import com.yapp.setting.component.UserInfoCard
import com.yapp.setting.component.VersionCodeText
+import com.yapp.ui.component.lottie.LottieAnimation
+import com.yapp.ui.extensions.customClickable
@Composable
fun SettingRoute(
viewModel: SettingViewModel = hiltViewModel(),
) {
val state by viewModel.container.stateFlow.collectAsStateWithLifecycle()
+ val context = LocalContext.current
+ LaunchedEffect(key1 = Unit) {
+ viewModel.onAction(SettingContract.Action.RefreshUserInfo)
+ }
SettingScreen(
state = state,
onNavigateToEditProfile = {
- viewModel.onAction(
- SettingContract.Action.NavigateToEditProfile,
- )
+ viewModel.onAction(SettingContract.Action.NavigateToEditProfile)
},
onBackClick = { viewModel.onAction(SettingContract.Action.PreviousStep) },
onInquiryClick = {
- viewModel.onAction(
- SettingContract.Action.OpenWebView("http://pf.kakao.com/_YxiPsn/chat"),
- )
+ val kakaoUrl = "http://pf.kakao.com/_ykqxjn"
+ val kakaoSchemeUrl = "kakaoplus://plusfriend/home/_ykqxjn"
+
+ val kakaoIntent = Intent(Intent.ACTION_VIEW, kakaoSchemeUrl.toUri())
+
+ try {
+ context.startActivity(kakaoIntent) // 카카오톡 앱으로 이동
+ } catch (e: Exception) {
+ viewModel.onAction(
+ SettingContract.Action.OpenWebView(kakaoUrl), // 앱이 없으면 웹뷰로 열기
+ )
+ }
},
onTermsClick = {
viewModel.onAction(
@@ -65,6 +84,35 @@ fun SettingScreen(
onInquiryClick: () -> Unit = {},
onTermsClick: () -> Unit = {},
onPrivacyPolicyClick: () -> Unit = {},
+) {
+ if (state.initialLoading) {
+ SettingLoadingScreen()
+ } else {
+ SettingContent(
+ name = state.name,
+ selectedGender = state.selectedGender ?: "",
+ birthDate = state.birthDateFormatted,
+ timeOfBirth = state.timeOfBirthFormatted,
+ onNavigateToEditProfile = onNavigateToEditProfile,
+ onBackClick = onBackClick,
+ onInquiryClick = onInquiryClick,
+ onTermsClick = onTermsClick,
+ onPrivacyPolicyClick = onPrivacyPolicyClick,
+ )
+ }
+}
+
+@Composable
+private fun SettingContent(
+ name: String,
+ selectedGender: String,
+ birthDate: String,
+ timeOfBirth: String,
+ onNavigateToEditProfile: () -> Unit,
+ onBackClick: () -> Unit,
+ onInquiryClick: () -> Unit,
+ onTermsClick: () -> Unit,
+ onPrivacyPolicyClick: () -> Unit,
) {
Column(
modifier = Modifier
@@ -80,12 +128,18 @@ fun SettingScreen(
)
Spacer(modifier = Modifier.height(12.dp))
UserInfoCard(
- name = state.name,
- gender = state.selectedGender ?: "",
- birth = state.birthDate,
+ name = name,
+ gender = selectedGender,
+ birth = birthDate,
+ timeOfBirth = timeOfBirth,
modifier = Modifier
.padding(horizontal = 24.dp)
- .clickable { onNavigateToEditProfile() },
+ .customClickable(
+ rippleEnabled = true,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = { onNavigateToEditProfile() },
+ ),
)
Spacer(modifier = Modifier.height(24.dp))
InquiryCard(
@@ -107,26 +161,49 @@ fun SettingScreen(
SettingItem(
itemTitle = "이용약관",
modifier = Modifier
- .clickable {
- onTermsClick()
- }
+ .customClickable(
+ rippleEnabled = true,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onTermsClick,
+ )
.padding(horizontal = 24.dp),
)
Spacer(modifier = Modifier.height(24.dp))
SettingItem(
itemTitle = "개인정보 처리방침",
modifier = Modifier
- .clickable {
- onPrivacyPolicyClick()
- }
+ .customClickable(
+ rippleEnabled = true,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onPrivacyPolicyClick,
+ )
.padding(horizontal = 24.dp),
)
Spacer(modifier = Modifier.weight(1f))
- VersionCodeText(versionCode = "v1.0.0")
+ VersionCodeText()
Spacer(modifier = Modifier.height(24.dp))
}
}
+@Composable
+private fun SettingLoadingScreen() {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(OrbitTheme.colors.gray_900),
+ contentAlignment = Alignment.Center,
+ ) {
+ LottieAnimation(
+ modifier = Modifier
+ .size(70.dp)
+ .align(Alignment.Center),
+ resId = core.designsystem.R.raw.star_loading,
+ )
+ }
+}
+
@Composable
@Preview
fun SettingScreenPreview() {
diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt
index 4a82c925..2e0773c0 100644
--- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt
@@ -2,11 +2,11 @@ package com.yapp.setting
import android.util.Log
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.SettingDestination
import com.yapp.datastore.UserPreferences
import com.yapp.domain.repository.UserInfoRepository
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import org.orbitmvi.orbit.syntax.simple.intent
import javax.inject.Inject
@@ -15,58 +15,15 @@ import javax.inject.Inject
class SettingViewModel @Inject constructor(
private val userInfoRepository: UserInfoRepository,
private val userPreferences: UserPreferences,
-) :
- BaseViewModel(
- SettingContract.State(),
- ) {
-
- init {
- viewModelScope.launch {
- userPreferences.userIdFlow.collect { userId ->
- if (userId != null) {
- fetchUserInfo(userId)
- }
- }
- }
- }
-
+) : BaseViewModel(
+ SettingContract.State(),
+) {
fun onAction(action: SettingContract.Action) = intent {
when (action) {
- is SettingContract.Action.UpdateName -> updateState {
- val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name)
- copy(name = action.name, isNameValid = isValid)
- }
- is SettingContract.Action.UpdateBirthDate -> {
- val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}"
- updateState { state.copy(birthDate = formattedDate) }
- }
- is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) }
- is SettingContract.Action.ToggleGender -> updateState {
- copy(
- isMaleSelected = action.isMale,
- isFemaleSelected = !action.isMale,
- )
- }
- is SettingContract.Action.ToggleTimeUnknown -> updateState {
- copy(
- isTimeUnknown = action.isChecked,
- timeOfBirth = if (action.isChecked) "시간모름" else "",
- )
- }
- is SettingContract.Action.UpdateTimeOfBirth -> updateState {
- val isValid = if (action.time.length == 5) {
- SettingContract.FieldType.TIME.validationRegex.matches(action.time)
- } else {
- true
- }
- copy(timeOfBirth = action.time, isTimeValid = isValid)
- }
- is SettingContract.Action.Reset -> updateState { SettingContract.State() }
- SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) }
- SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) }
SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack)
SettingContract.Action.NavigateToEditProfile -> navigateToEditProfile()
is SettingContract.Action.OpenWebView -> openWebView(action.url)
+ SettingContract.Action.RefreshUserInfo -> refreshUserInfo()
else -> {}
}
}
@@ -77,9 +34,11 @@ class SettingViewModel @Inject constructor(
.onSuccess { user ->
updateState {
copy(
+ initialLoading = false,
name = user.name,
birthDate = user.birthDate,
selectedGender = user.gender,
+ timeOfBirth = user.birthTime.toString(),
)
}
}
@@ -89,11 +48,20 @@ class SettingViewModel @Inject constructor(
}
}
- private fun navigateToEditProfile() = intent {
- emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditProfile.route))
+ private fun navigateToEditProfile() {
+ emitSideEffect(SettingContract.SideEffect.NavigateToEditProfile)
}
private fun openWebView(url: String) {
emitSideEffect(SettingContract.SideEffect.OpenWebView(url))
}
+
+ private fun refreshUserInfo() {
+ viewModelScope.launch {
+ val userId = userPreferences.userIdFlow.firstOrNull()
+ if (userId != null) {
+ fetchUserInfo(userId)
+ }
+ }
+ }
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt
index 4f3613ac..88cd7f78 100644
--- a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt
@@ -2,7 +2,6 @@ package com.yapp.setting.component
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -21,6 +20,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.extensions.customClickable
@Composable
fun InquiryCard(
@@ -76,7 +76,12 @@ fun InquirySendRow(
Row(
modifier = Modifier
.wrapContentWidth()
- .clickable(onClick = onInquiryClick)
+ .customClickable(
+ rippleEnabled = true,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onInquiryClick,
+ )
.padding(horizontal = 4.dp, vertical = 6.dp),
verticalAlignment = Alignment.CenterVertically,
) {
diff --git a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt
index 0cf5998a..42a2b922 100644
--- a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt
@@ -1,8 +1,6 @@
package com.yapp.setting.component
import androidx.compose.foundation.clickable
-import androidx.compose.foundation.interaction.MutableInteractionSource
-import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
@@ -12,8 +10,6 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
@@ -21,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.yapp.designsystem.theme.OrbitTheme
+import com.yapp.ui.extensions.customClickable
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -30,10 +27,8 @@ fun SettingTopAppBar(
showTopAppBarActions: Boolean = true,
title: String,
actionTitle: String? = null,
+ isActionEnabled: Boolean = false,
) {
- val interactionSource = remember { MutableInteractionSource() }
- val isPressed by interactionSource.collectIsPressedAsState()
-
TopAppBar(
title = {
Text(
@@ -51,7 +46,12 @@ fun SettingTopAppBar(
contentDescription = "Back",
tint = OrbitTheme.colors.white,
modifier = Modifier
- .clickable(onClick = onBackClick)
+ .customClickable(
+ rippleEnabled = false,
+ fadeOnPress = true,
+ pressedAlpha = 0.5f,
+ onClick = onBackClick,
+ )
.padding(start = 20.dp),
)
}
@@ -65,12 +65,11 @@ fun SettingTopAppBar(
Text(
text = actionTitle ?: "",
style = OrbitTheme.typography.body1Medium,
- color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_500,
+ color = if (isActionEnabled) OrbitTheme.colors.main else OrbitTheme.colors.gray_300,
modifier = Modifier
.padding(horizontal = 8.dp, vertical = 4.dp)
.clickable(
- interactionSource = interactionSource,
- indication = null,
+ enabled = isActionEnabled,
onClick = onActionClick,
),
)
diff --git a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt
index 65eb37cc..edf2a83e 100644
--- a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt
@@ -26,6 +26,7 @@ fun UserInfoCard(
name: String,
gender: String,
birth: String,
+ timeOfBirth: String,
modifier: Modifier = Modifier,
) {
Box(
@@ -40,7 +41,7 @@ fun UserInfoCard(
Column {
UserNameAndGenderText(name = name, gender = gender)
Spacer(modifier = Modifier.height(4.dp))
- UserBirthDayText(birth = birth)
+ UserBirthDayText(birth = birth, timeOfBirth = timeOfBirth)
}
Icon(
painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right),
@@ -78,9 +79,9 @@ fun UserNameAndGenderText(name: String, gender: String) {
}
@Composable
-fun UserBirthDayText(birth: String) {
+fun UserBirthDayText(birth: String, timeOfBirth: String) {
Text(
- text = birth,
+ text = "$birth $timeOfBirth",
style = OrbitTheme.typography.body1Regular,
color = OrbitTheme.colors.gray_50,
)
@@ -93,5 +94,6 @@ fun UserInfoCardPreview() {
name = "강문수",
gender = "남",
birth = "1999.01.01",
+ timeOfBirth = "20:00",
)
}
diff --git a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt
index dc57c7cd..f551bc0e 100644
--- a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt
+++ b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt
@@ -1,16 +1,25 @@
package com.yapp.setting.component
+import android.content.pm.PackageManager
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import com.yapp.designsystem.theme.OrbitTheme
@Composable
-fun VersionCodeText(versionCode: String) {
+fun VersionCodeText() {
+ val context = LocalContext.current
+ val versionName = try {
+ context.packageManager.getPackageInfo(context.packageName, 0).versionName
+ } catch (e: PackageManager.NameNotFoundException) {
+ "1.0.0"
+ }
+
Text(
- text = versionCode,
+ text = "v$versionName",
modifier = Modifier.fillMaxWidth(),
style = OrbitTheme.typography.body1Regular,
color = OrbitTheme.colors.gray_300,
diff --git a/feature/splash/build.gradle.kts b/feature/splash/build.gradle.kts
index 30f42a19..0377f847 100644
--- a/feature/splash/build.gradle.kts
+++ b/feature/splash/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.core.datastore)
implementation(libs.orbit.core)
implementation(libs.orbit.compose)
diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt
index 5cebff65..d83dff65 100644
--- a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt
+++ b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt
@@ -9,6 +9,8 @@ sealed class SplashContract {
) : UiState
sealed class SideEffect : com.yapp.ui.base.SideEffect {
- data class Navigate(val route: String) : SideEffect()
+ data object NavigateToHome : SideEffect()
+
+ data object NavigateToOnboarding : SideEffect()
}
}
diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt b/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt
new file mode 100644
index 00000000..5a8e0e33
--- /dev/null
+++ b/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt
@@ -0,0 +1,14 @@
+package com.yapp.splash
+
+import androidx.navigation.NavGraphBuilder
+import androidx.navigation.compose.composable
+import com.yapp.common.navigation.OrbitNavigator
+import com.yapp.common.navigation.route.SplashRoute
+
+fun NavGraphBuilder.splashScreen(
+ navigator: OrbitNavigator,
+) {
+ composable {
+ SplashRoute(navigator)
+ }
+}
diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt
index 78ade0cd..272dea8a 100644
--- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt
+++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt
@@ -19,9 +19,11 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.navigation.navOptions
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.SplashDestination
+import com.yapp.common.navigation.route.SplashRoute
import com.yapp.designsystem.theme.OrbitTheme
+import kotlinx.coroutines.flow.collectLatest
@Composable
fun SplashRoute(
@@ -32,13 +34,25 @@ fun SplashRoute(
val sideEffect = viewModel.container.sideEffectFlow
LaunchedEffect(sideEffect) {
- sideEffect.collect { effect ->
+ sideEffect.collectLatest { effect ->
when (effect) {
- is SplashContract.SideEffect.Navigate -> {
- navigator.navigateTo(
- route = effect.route,
- popUpTo = SplashDestination.Route.route,
- inclusive = true,
+ is SplashContract.SideEffect.NavigateToOnboarding -> {
+ navigator.navigateToOnboarding(
+ navOptions = navOptions {
+ popUpTo(SplashRoute) {
+ inclusive = true
+ }
+ },
+ )
+ }
+
+ is SplashContract.SideEffect.NavigateToHome -> {
+ navigator.navigateToHome(
+ navOptions = navOptions {
+ popUpTo(SplashRoute) {
+ inclusive = true
+ }
+ },
)
}
}
diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt
index 93649d48..db697f4b 100644
--- a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt
+++ b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt
@@ -1,8 +1,6 @@
package com.yapp.splash
import androidx.lifecycle.viewModelScope
-import com.yapp.common.navigation.destination.OnboardingDestination
-import com.yapp.common.navigation.destination.TopLevelDestination
import com.yapp.datastore.UserPreferences
import com.yapp.ui.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -40,12 +38,11 @@ class SplashViewModel @Inject constructor(
) { userId, onboardingCompleted ->
Pair(userId, onboardingCompleted)
}.collect { (userId, onboardingCompleted) ->
- val destination = if (userId != null && onboardingCompleted) {
- TopLevelDestination.HOME.route
+ if (userId != null && onboardingCompleted) {
+ emitSideEffect(SplashContract.SideEffect.NavigateToHome)
} else {
- OnboardingDestination.Route.route
+ emitSideEffect(SplashContract.SideEffect.NavigateToOnboarding)
}
- emitSideEffect(SplashContract.SideEffect.Navigate(destination))
}
}
}
diff --git a/feature/webview/build.gradle.kts b/feature/webview/build.gradle.kts
index 01c77847..f8830aa7 100644
--- a/feature/webview/build.gradle.kts
+++ b/feature/webview/build.gradle.kts
@@ -11,6 +11,7 @@ android {
dependencies {
implementation(projects.core.ui)
implementation(projects.core.common)
+ implementation(projects.core.analytics)
implementation(projects.domain)
implementation(libs.orbit.core)
implementation(libs.orbit.compose)
diff --git a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt
index 039cbcd8..1e8c6458 100644
--- a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt
+++ b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt
@@ -1,27 +1,19 @@
package com.yapp.webview
import androidx.navigation.NavGraphBuilder
-import androidx.navigation.NavType
import androidx.navigation.compose.composable
-import androidx.navigation.navArgument
-import androidx.navigation.navigation
+import androidx.navigation.toRoute
import com.yapp.common.navigation.OrbitNavigator
-import com.yapp.common.navigation.destination.WebViewDestination
+import com.yapp.common.navigation.route.WebViewRoute
-fun NavGraphBuilder.webViewNavGraph(navigator: OrbitNavigator) {
- navigation(
- route = WebViewDestination.Route.route,
- startDestination = WebViewDestination.WebView.route,
- ) {
- composable(
- route = "${WebViewDestination.WebView.route}/{url}",
- arguments = listOf(navArgument("url") { type = NavType.StringType }),
- ) { backStackEntry ->
- val url = backStackEntry.arguments?.getString("url") ?: ""
- WebViewRoute(
- url = url,
- navController = navigator.navController,
- )
- }
+fun NavGraphBuilder.webViewScreen(
+ navigator: OrbitNavigator,
+) {
+ composable { entry ->
+ val route = entry.toRoute()
+ WebViewRoute(
+ url = route.url,
+ navController = navigator.navController,
+ )
}
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index d64d6719..51c70bb2 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -58,8 +58,10 @@ gson = "2.11.0"
# Google Libraries Versions
google-service = "4.4.2"
+playServicesAd = "24.2.0"
firebase-bom = "33.1.1"
firebase-app-distribution = "5.1.0"
+firebase-crashlytics = "3.0.3"
## Test
junit = "4.13.2"
@@ -79,6 +81,7 @@ lottie = "6.1.0"
accompanist = "0.37.0"
materialAndroid = "1.7.5"
flexible-bottomsheet = "0.1.5"
+amplitude = "1.20.3"
[libraries]
@@ -146,11 +149,12 @@ okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor",
flexible-bottomsheet = { group = "com.github.skydoves", name = "flexible-bottomsheet-material3", version.ref = "flexible-bottomsheet" }
#sentry-android = { group = "io.sentry", name = "sentry-android", version.ref = "sentry-android" }
#sentry-compose = { group = "io.sentry", name = "sentry-compose", version.ref = "sentry-compose" }
-gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
# Google Libraries
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" }
firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" }
+firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" }
+firebase-config = { group = "com.google.firebase", name = "firebase-config-ktx" }
## Logging
timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" }
@@ -173,6 +177,12 @@ lottie-compose = { group = "com.airbnb.android", name = "lottie-compose", versio
accompanist-permission = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
androidx-material-android = { group = "androidx.compose.material", name = "material-android", version.ref = "materialAndroid" }
+amplitude-analytics = { group = "com.amplitude", name = "analytics-android", version.ref = "amplitude" }
+
+play-services-ads = { group = "com.google.android.gms", name = "play-services-ads", version.ref = "playServicesAd" }
+
+kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
+
[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
@@ -186,4 +196,5 @@ android-test = { id = "com.android.test", version.ref = "android-gradle-plugin"
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
google-service = { id = "com.google.gms.google-services", version.ref = "google-service" }
firebase-app-distribution = { id = "com.google.firebase.appdistribution", version.ref = "firebase-app-distribution" }
+firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" }
#sentry = { id = "io.sentry.android.gradle", version.ref = "sentry" }
diff --git a/project.dot.png b/project.dot.png
index 33a0a59b..51f22f9d 100644
Binary files a/project.dot.png and b/project.dot.png differ
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 8fb9d5e2..c2db5f10 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -46,3 +46,5 @@ include(":feature:alarm-interaction")
include(":core:alarm")
include(":feature:splash")
include(":feature:webview")
+include(":core:analytics")
+include(":core:remoteconfig")