From dda164ec2e28e40791615f3f679a25b6d645d4fd Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Wed, 27 Sep 2023 23:37:45 +0900 Subject: [PATCH 01/24] =?UTF-8?q?[feature/category]=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=99=84?= =?UTF-8?q?=EC=84=B1=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 91 ++++++++++++++----- .../ui/detail/DetailListScreen.kt | 1 + .../src/main/res/drawable/icon_check_mono.xml | 9 ++ 3 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 presentation/src/main/res/drawable/icon_check_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 7f828d2d..516d1cf9 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -1,5 +1,6 @@ package com.everymeal.presentation.components +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -17,6 +18,8 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -29,6 +32,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R +import com.everymeal.presentation.ui.detail.DetailListViewModel +import com.everymeal.presentation.ui.detail.DetailSortCategoryType +import com.everymeal.presentation.ui.detail.title import com.everymeal.presentation.ui.home.CategoryItem import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.Gray600 @@ -86,6 +92,7 @@ fun EveryMealMainBottomSheetDialog( @OptIn(ExperimentalMaterial3Api::class) @Composable fun EveryMealSortCategoryBottomSheetDialog( + title: String, onClick: (String) -> Unit, onDismiss: () -> Unit ) { @@ -98,38 +105,74 @@ fun EveryMealSortCategoryBottomSheetDialog( .fillMaxWidth() .padding(horizontal = 20.dp) ) { - Text( + Row( modifier = Modifier .fillMaxWidth() - .clickable { onClick("인기순") } - .padding(vertical = 14.dp), - text = stringResource(R.string.popularity_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) + .clickable { onClick("인기순") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.popularity_sort), + fontSize = 17.sp, + color = Gray900, + fontWeight = FontWeight.SemiBold, + ) + if(title == "인기순") { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), + contentDescription = null, + ) + } + } Spacer(modifier = Modifier.padding(4.dp)) - Text( + Row( modifier = Modifier .fillMaxWidth() - .clickable { onClick("거리순") } - .padding(vertical = 14.dp), - text = stringResource(R.string.distance_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) + .clickable { onClick("거리순") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.distance_sort), + fontSize = 17.sp, + color = Gray900, + fontWeight = FontWeight.SemiBold, + ) + if(title == "거리순") { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), + contentDescription = null, + ) + } + } Spacer(modifier = Modifier.padding(4.dp)) - Text( + Row( modifier = Modifier .fillMaxWidth() - .clickable { onClick("최신순") } - .padding(vertical = 14.dp), - text = stringResource(R.string.recent_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) + .clickable { onClick("최신순") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.recent_sort), + fontSize = 17.sp, + color = Gray900, + fontWeight = FontWeight.SemiBold, + ) + if(title == "최신순") { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), + contentDescription = null, + ) + } + } Spacer(modifier = Modifier.padding(10.dp)) } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index fa97462e..aa68d30a 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -44,6 +44,7 @@ fun DetailListScreen( if(detailListViewState.sortBottomSheetState) { EveryMealSortCategoryBottomSheetDialog( + detailListViewState.detailSortCategoryType.title(), onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.OnClickDetailListCategoryType(it.DetailSortCategoryType())) detailListViewModel.setEvent(DetailContract.DetailEvent.SortBottomSheetStateChange(false)) diff --git a/presentation/src/main/res/drawable/icon_check_mono.xml b/presentation/src/main/res/drawable/icon_check_mono.xml new file mode 100644 index 00000000..b0a31bd1 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_check_mono.xml @@ -0,0 +1,9 @@ + + + From eae3f220132030f2c9ef79239f08643edfa1c75d Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Thu, 28 Sep 2023 00:13:10 +0900 Subject: [PATCH 02/24] =?UTF-8?q?[feature/category]=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=85=8B=ED=8C=85=20=EC=99=84?= =?UTF-8?q?=EC=84=B1=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 44 ++++++++++++++++--- .../ui/detail/DetailListContract.kt | 2 + .../ui/detail/DetailListScreen.kt | 14 ++++++ .../ui/detail/DetailListViewModel.kt | 7 +++ .../src/main/res/drawable/icon_siren_mono.xml | 14 ++++++ presentation/src/main/res/values/strings.xml | 3 ++ 6 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 presentation/src/main/res/drawable/icon_siren_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 516d1cf9..36bd8489 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -1,6 +1,5 @@ package com.everymeal.presentation.components -import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -18,8 +17,6 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -32,10 +29,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R -import com.everymeal.presentation.ui.detail.DetailListViewModel -import com.everymeal.presentation.ui.detail.DetailSortCategoryType -import com.everymeal.presentation.ui.detail.title -import com.everymeal.presentation.ui.home.CategoryItem import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray900 @@ -271,4 +264,41 @@ fun RatingItem( ) } } +} +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun EveryMealReportBottomSheetDialog( + onClick: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = { }, + containerColor = Color.White, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onClick() }, + verticalAlignment = Alignment.CenterVertically + ) { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_siren_mono), + contentDescription = null, + ) + Text( + modifier = Modifier.padding(start = 12.dp), + text = stringResource(R.string.report), + fontSize = 17.sp, + color = Gray900, + fontWeight = FontWeight.SemiBold, + ) + } + Spacer(modifier = Modifier.padding(20.dp)) + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index 73275c4e..8dc87e9e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -11,12 +11,14 @@ class DetailContract { val detailSortCategoryType: DetailSortCategoryType = DetailSortCategoryType.POPULARITY, val sortBottomSheetState: Boolean = false, val mealRatingBottomSheetState: Boolean = false, + val reportBottomSheetState: Boolean = false, ) : ViewState sealed class DetailEvent : ViewEvent { data class OnClickDetailListCategoryType(val detailSortCategoryType: DetailSortCategoryType) : DetailEvent() data class SortBottomSheetStateChange(val sortBottomSheetState: Boolean) : DetailEvent() data class MealRatingBottomSheetStateChange(val mealRatingBottomSheetState: Boolean) : DetailEvent() + data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent() } sealed class HomeEffect : ViewSideEffect { diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index aa68d30a..12daa768 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.everymeal.presentation.R import com.everymeal.presentation.components.EveryMealCategoryRatingBottomSheetDialog +import com.everymeal.presentation.components.EveryMealReportBottomSheetDialog import com.everymeal.presentation.components.EveryMealSortCategoryBottomSheetDialog import com.everymeal.presentation.ui.save.SaveTopBar import com.everymeal.presentation.ui.theme.Grey2 @@ -72,6 +73,12 @@ fun DetailListScreen( ) } + if(detailListViewState.reportBottomSheetState) { + EveryMealReportBottomSheetDialog { + detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) + } + } + Column( modifier = Modifier .fillMaxSize() @@ -105,6 +112,13 @@ fun DetailListScreen( detailListViewModel.setEvent(DetailContract.DetailEvent.MealRatingBottomSheetStateChange(true)) } ) + DetailScreenChip( + title = "TEST신고버튼", + isCategory = true, + onChipClicked = { + detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(true)) + } + ) } } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt index ad07b7d3..f7ca676b 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt @@ -29,6 +29,11 @@ class DetailListViewModel @Inject constructor( mealRatingBottomSheetState = event.mealRatingBottomSheetState ) } + is DetailEvent.ReportBottomSheetStateChange -> { + reflectUpdateState( + reportBottomSheetState = event.reportBottomSheetState + ) + } } } @@ -36,12 +41,14 @@ class DetailListViewModel @Inject constructor( detailSortCategoryType: DetailSortCategoryType = viewState.value.detailSortCategoryType, sortBottomSheetState: Boolean = viewState.value.sortBottomSheetState, mealRatingBottomSheetState: Boolean = viewState.value.mealRatingBottomSheetState, + reportBottomSheetState: Boolean = viewState.value.reportBottomSheetState, ) { updateState { copy( detailSortCategoryType = detailSortCategoryType, sortBottomSheetState = sortBottomSheetState, mealRatingBottomSheetState = mealRatingBottomSheetState, + reportBottomSheetState = reportBottomSheetState, ) } } diff --git a/presentation/src/main/res/drawable/icon_siren_mono.xml b/presentation/src/main/res/drawable/icon_siren_mono.xml new file mode 100644 index 00000000..40a69887 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_siren_mono.xml @@ -0,0 +1,14 @@ + + + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 68090aac..04012917 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -77,4 +77,7 @@ 음식종류 별점순 적용하기 + + + 신고하기 From a74e352b1d2a10941562fbab2c3809dcef2471b1 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Thu, 28 Sep 2023 00:37:26 +0900 Subject: [PATCH 03/24] =?UTF-8?q?[feature/category]=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EB=B0=94?= =?UTF-8?q?=ED=85=80=EC=8B=9C=ED=8A=B8=20=EB=8B=A4=EC=9D=B4=EC=96=BC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=85=8B=ED=8C=85=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 89 ++++++++++++++++++- .../ui/detail/DetailListContract.kt | 2 + .../ui/detail/DetailListScreen.kt | 27 +++++- .../ui/detail/DetailListViewModel.kt | 7 ++ .../res/drawable/icon_check_gray_mono.xml | 9 ++ presentation/src/main/res/values/strings.xml | 3 + 6 files changed, 132 insertions(+), 5 deletions(-) create mode 100644 presentation/src/main/res/drawable/icon_check_gray_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 36bd8489..03fc7376 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.unit.sp import com.everymeal.presentation.R import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.Gray600 +import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 import com.everymeal.presentation.ui.theme.Grey2 import com.everymeal.presentation.ui.theme.Grey7 @@ -268,10 +269,11 @@ fun RatingItem( @OptIn(ExperimentalMaterial3Api::class) @Composable fun EveryMealReportBottomSheetDialog( - onClick: () -> Unit + onClick: () -> Unit, + onDismiss: () -> Unit ) { ModalBottomSheet( - onDismissRequest = { }, + onDismissRequest = { onDismiss() }, containerColor = Color.White, ) { Column( @@ -301,4 +303,87 @@ fun EveryMealReportBottomSheetDialog( Spacer(modifier = Modifier.padding(20.dp)) } } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun EveryMealDetailReportBottomSheetDialog( + onClick: () -> Unit, + onDismiss: () -> Unit, + onReportCategoryClick: (String) -> Unit +) { + ModalBottomSheet( + onDismissRequest = { onDismiss() }, + containerColor = Color.White, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onReportCategoryClick("") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.restaurant_not_review), + fontSize = 16.sp, + color = Gray800, + fontWeight = FontWeight.Normal, + ) + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), + contentDescription = null, + ) + } + Spacer(modifier = Modifier.padding(4.dp)) + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onReportCategoryClick("") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.dangerous_speak_review), + fontSize = 16.sp, + color = Gray800, + fontWeight = FontWeight.Normal, + ) + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), + contentDescription = null, + ) + } + Spacer(modifier = Modifier.padding(4.dp)) + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onReportCategoryClick("") }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = stringResource(R.string.lustful_review), + fontSize = 16.sp, + color = Gray800, + fontWeight = FontWeight.Normal, + ) + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), + contentDescription = null, + ) + } + Spacer(modifier = Modifier.padding(20.dp)) + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index 8dc87e9e..c69cdd0f 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -12,6 +12,7 @@ class DetailContract { val sortBottomSheetState: Boolean = false, val mealRatingBottomSheetState: Boolean = false, val reportBottomSheetState: Boolean = false, + val detailReportBottomSheetState: Boolean = false, ) : ViewState sealed class DetailEvent : ViewEvent { @@ -19,6 +20,7 @@ class DetailContract { data class SortBottomSheetStateChange(val sortBottomSheetState: Boolean) : DetailEvent() data class MealRatingBottomSheetStateChange(val mealRatingBottomSheetState: Boolean) : DetailEvent() data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent() + data class DetailReportBottomSheetStateChange(val detailReportBottomSheetState: Boolean) : DetailEvent() } sealed class HomeEffect : ViewSideEffect { diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index 12daa768..fe6cdbe5 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.everymeal.presentation.R import com.everymeal.presentation.components.EveryMealCategoryRatingBottomSheetDialog +import com.everymeal.presentation.components.EveryMealDetailReportBottomSheetDialog import com.everymeal.presentation.components.EveryMealReportBottomSheetDialog import com.everymeal.presentation.components.EveryMealSortCategoryBottomSheetDialog import com.everymeal.presentation.ui.save.SaveTopBar @@ -74,9 +75,29 @@ fun DetailListScreen( } if(detailListViewState.reportBottomSheetState) { - EveryMealReportBottomSheetDialog { - detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) - } + EveryMealReportBottomSheetDialog( + onClick = { + detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) + detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(true)) + }, + onDismiss = { + detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) + } + ) + } + + if(detailListViewState.detailReportBottomSheetState) { + EveryMealDetailReportBottomSheetDialog( + onClick = { + detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(false)) + }, + onDismiss = { + detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(false)) + }, + onReportCategoryClick = { + + } + ) } Column( diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt index f7ca676b..f544cc72 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt @@ -34,6 +34,11 @@ class DetailListViewModel @Inject constructor( reportBottomSheetState = event.reportBottomSheetState ) } + is DetailEvent.DetailReportBottomSheetStateChange -> { + reflectUpdateState( + detailReportBottomSheetState = event.detailReportBottomSheetState + ) + } } } @@ -42,6 +47,7 @@ class DetailListViewModel @Inject constructor( sortBottomSheetState: Boolean = viewState.value.sortBottomSheetState, mealRatingBottomSheetState: Boolean = viewState.value.mealRatingBottomSheetState, reportBottomSheetState: Boolean = viewState.value.reportBottomSheetState, + detailReportBottomSheetState: Boolean = viewState.value.detailReportBottomSheetState, ) { updateState { copy( @@ -49,6 +55,7 @@ class DetailListViewModel @Inject constructor( sortBottomSheetState = sortBottomSheetState, mealRatingBottomSheetState = mealRatingBottomSheetState, reportBottomSheetState = reportBottomSheetState, + detailReportBottomSheetState = detailReportBottomSheetState, ) } } diff --git a/presentation/src/main/res/drawable/icon_check_gray_mono.xml b/presentation/src/main/res/drawable/icon_check_gray_mono.xml new file mode 100644 index 00000000..f3251ec5 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_check_gray_mono.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 04012917..d59bc875 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -80,4 +80,7 @@ 신고하기 + 해당 가게와 무관한 리뷰 + 비속어 및 혐오 발언 + 음란성 게시물 From 7bbf2fe9c9c51bedfd271648d726fc6fe6f77b09 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sat, 30 Sep 2023 21:28:00 +0900 Subject: [PATCH 04/24] =?UTF-8?q?[feature/category]=20Develop=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9=20=EB=B0=8F=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=ED=8F=B0=ED=8A=B8=20=EC=A0=81=EC=9A=A9=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 03fc7376..caccca9c 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R import com.everymeal.presentation.ui.home.HomeCategoryList +import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 @@ -321,6 +322,13 @@ fun EveryMealDetailReportBottomSheetDialog( .fillMaxWidth() .padding(horizontal = 20.dp) ) { + Text( + modifier = Modifier.padding(bottom = 18.dp), + text = "무엇으로 신고하시나요?", + fontSize = 22.sp, + style = EveryMealTypography.titleMedium, + color = Gray900 + ) Row( modifier = Modifier .fillMaxWidth() @@ -329,11 +337,12 @@ fun EveryMealDetailReportBottomSheetDialog( verticalAlignment = Alignment.CenterVertically ) { Text( - modifier = Modifier.padding(vertical = 14.dp), + modifier = Modifier.padding(vertical = 10.dp), text = stringResource(R.string.restaurant_not_review), fontSize = 16.sp, color = Gray800, fontWeight = FontWeight.Normal, + style = EveryMealTypography.bodySmall ) Image( modifier = Modifier.size(24.dp), @@ -350,11 +359,12 @@ fun EveryMealDetailReportBottomSheetDialog( verticalAlignment = Alignment.CenterVertically ) { Text( - modifier = Modifier.padding(vertical = 14.dp), + modifier = Modifier.padding(vertical = 10.dp), text = stringResource(R.string.dangerous_speak_review), fontSize = 16.sp, color = Gray800, fontWeight = FontWeight.Normal, + style = EveryMealTypography.bodySmall ) Image( modifier = Modifier.size(24.dp), @@ -371,11 +381,12 @@ fun EveryMealDetailReportBottomSheetDialog( verticalAlignment = Alignment.CenterVertically ) { Text( - modifier = Modifier.padding(vertical = 14.dp), + modifier = Modifier.padding(vertical = 10.dp), text = stringResource(R.string.lustful_review), fontSize = 16.sp, color = Gray800, fontWeight = FontWeight.Normal, + style = EveryMealTypography.bodySmall ) Image( modifier = Modifier.size(24.dp), From 2943d5bacd22136d9026f62c316724830040b3a9 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 1 Oct 2023 02:09:50 +0900 Subject: [PATCH 05/24] =?UTF-8?q?[feature/category]=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 118 ++++++++---------- presentation/src/main/res/values/strings.xml | 1 + 2 files changed, 52 insertions(+), 67 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index caccca9c..c255343e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -100,79 +100,58 @@ fun EveryMealSortCategoryBottomSheetDialog( .fillMaxWidth() .padding(horizontal = 20.dp) ) { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onClick("인기순") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 14.dp), - text = stringResource(R.string.popularity_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) - if(title == "인기순") { - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), - contentDescription = null, - ) - } - } + SortCategoryItem( + title = title, + category = stringResource(R.string.popularity_sort), + onClick = onClick + ) Spacer(modifier = Modifier.padding(4.dp)) - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onClick("거리순") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 14.dp), - text = stringResource(R.string.distance_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) - if(title == "거리순") { - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), - contentDescription = null, - ) - } - } + SortCategoryItem( + title = title, + category = stringResource(R.string.distance_sort), + onClick = onClick + ) Spacer(modifier = Modifier.padding(4.dp)) - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onClick("최신순") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 14.dp), - text = stringResource(R.string.recent_sort), - fontSize = 17.sp, - color = Gray900, - fontWeight = FontWeight.SemiBold, - ) - if(title == "최신순") { - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), - contentDescription = null, - ) - } - } + SortCategoryItem( + title = title, + category = stringResource(R.string.recent_sort), + onClick = onClick + ) Spacer(modifier = Modifier.padding(10.dp)) } } } +@Composable +fun SortCategoryItem( + title: String, + category: String, + onClick: (String) -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onClick(category) }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier.padding(vertical = 14.dp), + text = category, + fontSize = 17.sp, + color = Gray900, + style = EveryMealTypography.displayMedium, + ) + if(title == category) { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_mono), + contentDescription = null, + ) + } + } +} + @OptIn(ExperimentalMaterial3Api::class) @Composable fun EveryMealCategoryRatingBottomSheetDialog( @@ -394,7 +373,12 @@ fun EveryMealDetailReportBottomSheetDialog( contentDescription = null, ) } - Spacer(modifier = Modifier.padding(20.dp)) + Spacer(modifier = Modifier.padding(4.dp)) + EveryMealMainButton( + text = stringResource(R.string.ok), + onClick = onClick, + ) + Spacer(modifier = Modifier.padding(10.dp)) } } } \ No newline at end of file diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index d59bc875..4a3fbc06 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ 선택하기 등록하기 + 확인 반가워요!\n대학을 선택해주세요 From 25ae7f739b855bf7dce7023951fc415a12d26d39 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 1 Oct 2023 03:04:31 +0900 Subject: [PATCH 06/24] =?UTF-8?q?[feature/category]=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=99=84=EC=84=B1(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 123 +++++++++--------- .../ui/detail/DetailListContract.kt | 27 +++- .../ui/detail/DetailListScreen.kt | 4 +- .../ui/detail/DetailListViewModel.kt | 11 +- .../everymeal/presentation/ui/theme/Color.kt | 1 + presentation/src/main/res/values/strings.xml | 1 + 6 files changed, 98 insertions(+), 69 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index c255343e..b99349db 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -21,6 +21,7 @@ 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.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -31,11 +32,13 @@ import androidx.compose.ui.unit.sp import com.everymeal.presentation.R import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.EveryMealTypography +import com.everymeal.presentation.ui.theme.Gray400 import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 import com.everymeal.presentation.ui.theme.Grey2 import com.everymeal.presentation.ui.theme.Grey7 +import com.everymeal.presentation.ui.theme.Main100 import com.everymeal.presentation.ui.theme.Typography @OptIn(ExperimentalMaterial3Api::class) @@ -288,6 +291,7 @@ fun EveryMealReportBottomSheetDialog( @OptIn(ExperimentalMaterial3Api::class) @Composable fun EveryMealDetailReportBottomSheetDialog( + title: String, onClick: () -> Unit, onDismiss: () -> Unit, onReportCategoryClick: (String) -> Unit @@ -303,76 +307,28 @@ fun EveryMealDetailReportBottomSheetDialog( ) { Text( modifier = Modifier.padding(bottom = 18.dp), - text = "무엇으로 신고하시나요?", + text = stringResource(R.string.select_what_report), fontSize = 22.sp, style = EveryMealTypography.titleMedium, color = Gray900 ) - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onReportCategoryClick("") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 10.dp), - text = stringResource(R.string.restaurant_not_review), - fontSize = 16.sp, - color = Gray800, - fontWeight = FontWeight.Normal, - style = EveryMealTypography.bodySmall - ) - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), - contentDescription = null, - ) - } + ReportCategoryItem( + title = title, + category = stringResource(R.string.restaurant_not_review), + onClick = onReportCategoryClick + ) Spacer(modifier = Modifier.padding(4.dp)) - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onReportCategoryClick("") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 10.dp), - text = stringResource(R.string.dangerous_speak_review), - fontSize = 16.sp, - color = Gray800, - fontWeight = FontWeight.Normal, - style = EveryMealTypography.bodySmall - ) - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), - contentDescription = null, - ) - } + ReportCategoryItem( + title = title, + category = stringResource(R.string.dangerous_speak_review), + onClick = onReportCategoryClick + ) Spacer(modifier = Modifier.padding(4.dp)) - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { onReportCategoryClick("") }, - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.padding(vertical = 10.dp), - text = stringResource(R.string.lustful_review), - fontSize = 16.sp, - color = Gray800, - fontWeight = FontWeight.Normal, - style = EveryMealTypography.bodySmall - ) - Image( - modifier = Modifier.size(24.dp), - imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), - contentDescription = null, - ) - } + ReportCategoryItem( + title = title, + category = stringResource(R.string.lustful_review), + onClick = onReportCategoryClick + ) Spacer(modifier = Modifier.padding(4.dp)) EveryMealMainButton( text = stringResource(R.string.ok), @@ -381,4 +337,41 @@ fun EveryMealDetailReportBottomSheetDialog( Spacer(modifier = Modifier.padding(10.dp)) } } -} \ No newline at end of file +} + +@Composable +fun ReportCategoryItem( + title: String, + category: String, + onClick: (String) -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { onClick(category) }, + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + modifier = Modifier.padding(vertical = 10.dp), + text = category, + fontSize = 16.sp, + color = Gray800, + fontWeight = FontWeight.Normal, + style = EveryMealTypography.bodySmall + ) + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_check_gray_mono), + contentDescription = null, + colorFilter = if(title == category) { + ColorFilter.tint(Main100) + } else { + ColorFilter.tint(Gray400) + } + ) + } +} diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index c69cdd0f..f9b274dc 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -13,6 +13,7 @@ class DetailContract { val mealRatingBottomSheetState: Boolean = false, val reportBottomSheetState: Boolean = false, val detailReportBottomSheetState: Boolean = false, + val reportCategoryType: ReportCategoryType = ReportCategoryType.IRRELAVANT ) : ViewState sealed class DetailEvent : ViewEvent { @@ -21,9 +22,10 @@ class DetailContract { data class MealRatingBottomSheetStateChange(val mealRatingBottomSheetState: Boolean) : DetailEvent() data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent() data class DetailReportBottomSheetStateChange(val detailReportBottomSheetState: Boolean) : DetailEvent() + data class OnClickReportCategoryType(val reportCategoryType: ReportCategoryType) : DetailEvent() } - sealed class HomeEffect : ViewSideEffect { + sealed class DetailEffect : ViewSideEffect { } } @@ -49,4 +51,27 @@ fun DetailSortCategoryType.title(): String { DetailSortCategoryType.DISTANCE -> "거리순" DetailSortCategoryType.RECENT -> "최신순" } +} + +enum class ReportCategoryType { + IRRELAVANT, + SLANG, + LUSTFUL +} + +fun String.ReportCategoryType(): ReportCategoryType { + return when (this) { + "해당 가게와 무관한 리뷰" -> ReportCategoryType.IRRELAVANT + "비속어 및 혐오 발언" -> ReportCategoryType.SLANG + "음란성 게시물" -> ReportCategoryType.LUSTFUL + else -> ReportCategoryType.IRRELAVANT + } +} + +fun ReportCategoryType.title(): String { + return when (this) { + ReportCategoryType.IRRELAVANT -> "해당 가게와 무관한 리뷰" + ReportCategoryType.SLANG -> "비속어 및 혐오 발언" + ReportCategoryType.LUSTFUL -> "음란성 게시물" + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index fe6cdbe5..658d59a2 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -76,6 +76,7 @@ fun DetailListScreen( if(detailListViewState.reportBottomSheetState) { EveryMealReportBottomSheetDialog( + onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(true)) @@ -88,6 +89,7 @@ fun DetailListScreen( if(detailListViewState.detailReportBottomSheetState) { EveryMealDetailReportBottomSheetDialog( + detailListViewState.reportCategoryType.title(), onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(false)) }, @@ -95,7 +97,7 @@ fun DetailListScreen( detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(false)) }, onReportCategoryClick = { - + detailListViewModel.setEvent(DetailContract.DetailEvent.OnClickReportCategoryType(it.ReportCategoryType())) } ) } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt index f544cc72..cd0f8512 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt @@ -3,12 +3,12 @@ package com.everymeal.presentation.ui.detail import com.everymeal.presentation.base.BaseViewModel import com.everymeal.presentation.ui.detail.DetailContract.DetailEvent import com.everymeal.presentation.ui.detail.DetailContract.DetailState -import com.everymeal.presentation.ui.detail.DetailContract.HomeEffect +import com.everymeal.presentation.ui.detail.DetailContract.DetailEffect import javax.inject.Inject class DetailListViewModel @Inject constructor( -): BaseViewModel( +): BaseViewModel( DetailState() ) { @@ -39,6 +39,11 @@ class DetailListViewModel @Inject constructor( detailReportBottomSheetState = event.detailReportBottomSheetState ) } + is DetailEvent.OnClickReportCategoryType -> { + reflectUpdateState( + reportCategoryType = event.reportCategoryType + ) + } } } @@ -48,6 +53,7 @@ class DetailListViewModel @Inject constructor( mealRatingBottomSheetState: Boolean = viewState.value.mealRatingBottomSheetState, reportBottomSheetState: Boolean = viewState.value.reportBottomSheetState, detailReportBottomSheetState: Boolean = viewState.value.detailReportBottomSheetState, + reportCategoryType: ReportCategoryType = viewState.value.reportCategoryType, ) { updateState { copy( @@ -56,6 +62,7 @@ class DetailListViewModel @Inject constructor( mealRatingBottomSheetState = mealRatingBottomSheetState, reportBottomSheetState = reportBottomSheetState, detailReportBottomSheetState = detailReportBottomSheetState, + reportCategoryType = reportCategoryType, ) } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt b/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt index 88577011..4f42f2bf 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt @@ -13,6 +13,7 @@ val Pink40 = Color(0xFF7D5260) val Gray100 = Color(0xFFF9FAFB) val Gray200 = Color(0xFFE5E8EB) val Gray300 = Color(0xFFF2F4F6) +val Gray400 = Color(0xFFD1D6DB) val Gray500 = Color(0xFFB0B8C1) val Gray600 = Color(0xFF8B95A1) val Gray700 = Color(0xFF6B7684) diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 4a3fbc06..704c8e77 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -84,4 +84,5 @@ 해당 가게와 무관한 리뷰 비속어 및 혐오 발언 음란성 게시물 + 무엇으로 신고하시나요? From 231d4dd35d57df0e4751072761c39cd01a73ac91 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 1 Oct 2023 03:10:22 +0900 Subject: [PATCH 07/24] =?UTF-8?q?[feature/category]=20=EC=8B=A0=EA=B3=A0?= =?UTF-8?q?=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20NONE=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=B6=94=EA=B0=80=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/components/EveryMealBottomSheetDialog.kt | 2 ++ .../presentation/ui/detail/DetailListContract.kt | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index b99349db..c12b06f9 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R +import com.everymeal.presentation.ui.detail.ReportCategoryType import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray400 @@ -332,6 +333,7 @@ fun EveryMealDetailReportBottomSheetDialog( Spacer(modifier = Modifier.padding(4.dp)) EveryMealMainButton( text = stringResource(R.string.ok), + enabled = title.ReportCategoryType() != ReportCategoryType.NONE, onClick = onClick, ) Spacer(modifier = Modifier.padding(10.dp)) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index f9b274dc..f569c22a 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -13,7 +13,7 @@ class DetailContract { val mealRatingBottomSheetState: Boolean = false, val reportBottomSheetState: Boolean = false, val detailReportBottomSheetState: Boolean = false, - val reportCategoryType: ReportCategoryType = ReportCategoryType.IRRELAVANT + val reportCategoryType: ReportCategoryType = ReportCategoryType.NONE ) : ViewState sealed class DetailEvent : ViewEvent { @@ -56,7 +56,8 @@ fun DetailSortCategoryType.title(): String { enum class ReportCategoryType { IRRELAVANT, SLANG, - LUSTFUL + LUSTFUL, + NONE } fun String.ReportCategoryType(): ReportCategoryType { @@ -64,7 +65,7 @@ fun String.ReportCategoryType(): ReportCategoryType { "해당 가게와 무관한 리뷰" -> ReportCategoryType.IRRELAVANT "비속어 및 혐오 발언" -> ReportCategoryType.SLANG "음란성 게시물" -> ReportCategoryType.LUSTFUL - else -> ReportCategoryType.IRRELAVANT + else -> ReportCategoryType.NONE } } @@ -73,5 +74,6 @@ fun ReportCategoryType.title(): String { ReportCategoryType.IRRELAVANT -> "해당 가게와 무관한 리뷰" ReportCategoryType.SLANG -> "비속어 및 혐오 발언" ReportCategoryType.LUSTFUL -> "음란성 게시물" + ReportCategoryType.NONE -> "" } } \ No newline at end of file From 578a6c0648a47565ec7637380d351420b99105e4 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 1 Oct 2023 03:40:21 +0900 Subject: [PATCH 08/24] =?UTF-8?q?[feature/category]=20=EB=B3=84=EC=A0=90?= =?UTF-8?q?=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20State=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 15 ++++++++++++--- .../presentation/ui/detail/DetailListContract.kt | 4 +++- .../presentation/ui/detail/DetailListScreen.kt | 4 ++-- .../presentation/ui/detail/DetailListViewModel.kt | 7 +++++++ .../com/everymeal/presentation/ui/theme/Color.kt | 2 ++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index c12b06f9..3727d4d7 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -40,6 +40,7 @@ import com.everymeal.presentation.ui.theme.Gray900 import com.everymeal.presentation.ui.theme.Grey2 import com.everymeal.presentation.ui.theme.Grey7 import com.everymeal.presentation.ui.theme.Main100 +import com.everymeal.presentation.ui.theme.SubMain100 import com.everymeal.presentation.ui.theme.Typography @OptIn(ExperimentalMaterial3Api::class) @@ -159,6 +160,7 @@ fun SortCategoryItem( @OptIn(ExperimentalMaterial3Api::class) @Composable fun EveryMealCategoryRatingBottomSheetDialog( + currentRating: Int, onClick: () -> Unit, onDismiss: () -> Unit, onCategoryClick: (String) -> Unit, @@ -202,6 +204,7 @@ fun EveryMealCategoryRatingBottomSheetDialog( LazyRow(content = { items(5) { RatingItem( + currentRating, ratingCount = it + 1, onRatingClick = onRatingClick ) @@ -220,6 +223,7 @@ fun EveryMealCategoryRatingBottomSheetDialog( @Composable fun RatingItem( + currentRating: Int, ratingCount: Int, onRatingClick: (Int) -> Unit ) { @@ -228,7 +232,7 @@ fun RatingItem( indication = null, interactionSource = remember { MutableInteractionSource() } ) { onRatingClick(ratingCount) }, - color = Grey2, + color = if (currentRating == ratingCount) SubMain100 else Grey2, shape = RoundedCornerShape(100.dp), ) { Row( @@ -239,11 +243,16 @@ fun RatingItem( .padding(start = 12.dp) .size(16.dp), imageVector = ImageVector.vectorResource(R.drawable.icon_gray_star_mono), - contentDescription = "rating" + contentDescription = "rating", + colorFilter = if (currentRating == ratingCount) { + ColorFilter.tint(Main100) + } else { + ColorFilter.tint(Gray600) + } ) Text( text = ratingCount.toString(), - color = Grey7, + color = if (currentRating == ratingCount) Main100 else Gray600, style = Typography.bodySmall, modifier = Modifier.padding(start = 4.dp, end = 12.dp, top = 6.dp, bottom = 6.dp) ) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index f569c22a..034eb06f 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -13,7 +13,8 @@ class DetailContract { val mealRatingBottomSheetState: Boolean = false, val reportBottomSheetState: Boolean = false, val detailReportBottomSheetState: Boolean = false, - val reportCategoryType: ReportCategoryType = ReportCategoryType.NONE + val reportCategoryType: ReportCategoryType = ReportCategoryType.NONE, + val rating: Int = 1, ) : ViewState sealed class DetailEvent : ViewEvent { @@ -23,6 +24,7 @@ class DetailContract { data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent() data class DetailReportBottomSheetStateChange(val detailReportBottomSheetState: Boolean) : DetailEvent() data class OnClickReportCategoryType(val reportCategoryType: ReportCategoryType) : DetailEvent() + data class OnClickRating(val rating: Int) : DetailEvent() } sealed class DetailEffect : ViewSideEffect { diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index 658d59a2..dd170c8e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -59,6 +59,7 @@ fun DetailListScreen( if(detailListViewState.mealRatingBottomSheetState) { EveryMealCategoryRatingBottomSheetDialog( + detailListViewState.rating, onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.MealRatingBottomSheetStateChange(false)) }, @@ -69,14 +70,13 @@ fun DetailListScreen( }, onRatingClick = { - + detailListViewModel.setEvent(DetailContract.DetailEvent.OnClickRating(it)) } ) } if(detailListViewState.reportBottomSheetState) { EveryMealReportBottomSheetDialog( - onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.ReportBottomSheetStateChange(false)) detailListViewModel.setEvent(DetailContract.DetailEvent.DetailReportBottomSheetStateChange(true)) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt index cd0f8512..55de92aa 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt @@ -44,6 +44,11 @@ class DetailListViewModel @Inject constructor( reportCategoryType = event.reportCategoryType ) } + is DetailEvent.OnClickRating -> { + reflectUpdateState( + rating = event.rating + ) + } } } @@ -54,6 +59,7 @@ class DetailListViewModel @Inject constructor( reportBottomSheetState: Boolean = viewState.value.reportBottomSheetState, detailReportBottomSheetState: Boolean = viewState.value.detailReportBottomSheetState, reportCategoryType: ReportCategoryType = viewState.value.reportCategoryType, + rating: Int = viewState.value.rating, ) { updateState { copy( @@ -63,6 +69,7 @@ class DetailListViewModel @Inject constructor( reportBottomSheetState = reportBottomSheetState, detailReportBottomSheetState = detailReportBottomSheetState, reportCategoryType = reportCategoryType, + rating = rating, ) } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt b/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt index 4f42f2bf..25d50c7c 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/theme/Color.kt @@ -28,3 +28,5 @@ val RED_LIGHT = Color(0xFFFFEDED) val Main100 = Color(0xFFFF4848) val Main800 = Color(0xFFCC3939) + +val SubMain100 = Color(0xFFFFEDED) From 89de616a72127354f0610cd78da1a224753d4849 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Mon, 2 Oct 2023 01:05:27 +0900 Subject: [PATCH 09/24] =?UTF-8?q?[feature/category]=20=EC=9D=8C=EC=8B=9D?= =?UTF-8?q?=EC=A2=85=EB=A5=98=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20Bot?= =?UTF-8?q?tom=20Sheet=20State=20=EC=84=A4=EC=A0=95=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealBottomSheetDialog.kt | 5 ++- .../ui/detail/DetailListContract.kt | 36 +++++++++++++++++-- .../ui/detail/DetailListScreen.kt | 3 +- .../ui/detail/DetailListViewModel.kt | 7 ++++ .../presentation/ui/home/HomeScreen.kt | 20 ++++++++++- 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 3727d4d7..380bee8b 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R import com.everymeal.presentation.ui.detail.ReportCategoryType +import com.everymeal.presentation.ui.detail.RestaurantCategoryType import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray400 @@ -161,6 +162,7 @@ fun SortCategoryItem( @Composable fun EveryMealCategoryRatingBottomSheetDialog( currentRating: Int, + restaurantCategoryType: String, onClick: () -> Unit, onDismiss: () -> Unit, onCategoryClick: (String) -> Unit, @@ -186,7 +188,8 @@ fun EveryMealCategoryRatingBottomSheetDialog( ) Spacer(modifier = Modifier.padding(4.dp)) HomeCategoryList( - isBottomSheet = true + isBottomSheet = true, + restaurantCategoryType ) { onCategoryClick(it) } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt index 034eb06f..29d4787e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt @@ -8,22 +8,24 @@ import com.everymeal.presentation.base.ViewState class DetailContract { data class DetailState( val uiState: LoadState = LoadState.SUCCESS, - val detailSortCategoryType: DetailSortCategoryType = DetailSortCategoryType.POPULARITY, val sortBottomSheetState: Boolean = false, val mealRatingBottomSheetState: Boolean = false, val reportBottomSheetState: Boolean = false, val detailReportBottomSheetState: Boolean = false, + val detailSortCategoryType: DetailSortCategoryType = DetailSortCategoryType.POPULARITY, val reportCategoryType: ReportCategoryType = ReportCategoryType.NONE, - val rating: Int = 1, + val restaurantCategoryType: RestaurantCategoryType = RestaurantCategoryType.NONE, + val rating: Int = 0, ) : ViewState sealed class DetailEvent : ViewEvent { - data class OnClickDetailListCategoryType(val detailSortCategoryType: DetailSortCategoryType) : DetailEvent() data class SortBottomSheetStateChange(val sortBottomSheetState: Boolean) : DetailEvent() data class MealRatingBottomSheetStateChange(val mealRatingBottomSheetState: Boolean) : DetailEvent() data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent() data class DetailReportBottomSheetStateChange(val detailReportBottomSheetState: Boolean) : DetailEvent() + data class OnClickDetailListCategoryType(val detailSortCategoryType: DetailSortCategoryType) : DetailEvent() data class OnClickReportCategoryType(val reportCategoryType: ReportCategoryType) : DetailEvent() + data class OnClickRestaurantCategoryType(val restaurantCategoryType: RestaurantCategoryType) : DetailEvent() data class OnClickRating(val rating: Int) : DetailEvent() } @@ -78,4 +80,32 @@ fun ReportCategoryType.title(): String { ReportCategoryType.LUSTFUL -> "음란성 게시물" ReportCategoryType.NONE -> "" } +} + +enum class RestaurantCategoryType { + RECOMMEND, + RICE, + CAFE, + DRINK, + NONE +} + +fun String.RestaurantCategoryType(): RestaurantCategoryType { + return when (this) { + "추천" -> RestaurantCategoryType.RECOMMEND + "밥집" -> RestaurantCategoryType.RICE + "카페" -> RestaurantCategoryType.CAFE + "술집" -> RestaurantCategoryType.DRINK + else -> RestaurantCategoryType.RECOMMEND + } +} + +fun RestaurantCategoryType.title(): String { + return when (this) { + RestaurantCategoryType.RECOMMEND -> "추천" + RestaurantCategoryType.RICE -> "밥집" + RestaurantCategoryType.CAFE -> "카페" + RestaurantCategoryType.DRINK -> "술집" + RestaurantCategoryType.NONE -> "" + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt index dd170c8e..b19db241 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt @@ -60,6 +60,7 @@ fun DetailListScreen( if(detailListViewState.mealRatingBottomSheetState) { EveryMealCategoryRatingBottomSheetDialog( detailListViewState.rating, + detailListViewState.restaurantCategoryType.title(), onClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.MealRatingBottomSheetStateChange(false)) }, @@ -67,7 +68,7 @@ fun DetailListScreen( detailListViewModel.setEvent(DetailContract.DetailEvent.MealRatingBottomSheetStateChange(false)) }, onCategoryClick = { - + detailListViewModel.setEvent(DetailContract.DetailEvent.OnClickRestaurantCategoryType(it.RestaurantCategoryType())) }, onRatingClick = { detailListViewModel.setEvent(DetailContract.DetailEvent.OnClickRating(it)) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt index 55de92aa..9af0d51e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt @@ -49,6 +49,11 @@ class DetailListViewModel @Inject constructor( rating = event.rating ) } + is DetailEvent.OnClickRestaurantCategoryType -> { + reflectUpdateState( + restaurantCategoryType = event.restaurantCategoryType + ) + } } } @@ -60,6 +65,7 @@ class DetailListViewModel @Inject constructor( detailReportBottomSheetState: Boolean = viewState.value.detailReportBottomSheetState, reportCategoryType: ReportCategoryType = viewState.value.reportCategoryType, rating: Int = viewState.value.rating, + restaurantCategoryType: RestaurantCategoryType = viewState.value.restaurantCategoryType, ) { updateState { copy( @@ -70,6 +76,7 @@ class DetailListViewModel @Inject constructor( detailReportBottomSheetState = detailReportBottomSheetState, reportCategoryType = reportCategoryType, rating = rating, + restaurantCategoryType = restaurantCategoryType, ) } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt index abe6bb31..20f2874a 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt @@ -44,6 +44,7 @@ import com.everymeal.presentation.components.EveryMealLineButton import com.everymeal.presentation.components.EveryMealMainBottomSheetDialog import com.everymeal.presentation.components.EveryMealRestaurantItem import com.everymeal.presentation.components.EveryMealReviewItem +import com.everymeal.presentation.ui.detail.RestaurantCategoryType import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.EveryMeal_AndroidTheme import com.everymeal.presentation.ui.theme.Gray100 @@ -311,6 +312,7 @@ fun HomeMainTopLayout( @Composable fun HomeCategoryList( isBottomSheet : Boolean = false, + restaurantCategoryType: String = "", onClick: (String) -> Unit ) { val horizotalDp = if (isBottomSheet) 0.dp else 20.dp @@ -322,24 +324,32 @@ fun HomeCategoryList( horizontalArrangement = Arrangement.SpaceBetween ) { CategoryItem( + isBottomSheet, + restaurantCategoryType, R.drawable.ic_homemenu_recommend, R.string.home_top_category_recommend ) { onClick("추천") } CategoryItem( + isBottomSheet, + restaurantCategoryType, R.drawable.ic_homemenu_bap, R.string.home_top_category_rice ) { onClick("밥집") } CategoryItem( + isBottomSheet, + restaurantCategoryType, R.drawable.ic_homemenu_cake, R.string.home_top_category_cafe ) { onClick("카페") } CategoryItem( + isBottomSheet, + restaurantCategoryType, R.drawable.ic_homemenu_beer, R.string.home_top_category_drink ) { @@ -371,6 +381,8 @@ fun LazyColumnTitle(title: String) { @Composable fun CategoryItem( + isBottomSheet: Boolean = false, + restaurantCategoryType: String = "", categoryIcon: Int, categoryText: Int, onClick: () -> Unit, @@ -381,7 +393,13 @@ fun CategoryItem( Column( modifier = Modifier .clickable { onClick() } - .background(Color.White, RoundedCornerShape(12.dp)) + .background( + when { + !isBottomSheet -> Color.White + restaurantCategoryType == stringResource(categoryText) -> Gray100 + else -> Color.White + }, + RoundedCornerShape(12.dp)) .padding(horizontal = 17.dp, vertical = 4.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { From 1b8f3ae902acdf6609f5522e9900adee04805da3 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Mon, 2 Oct 2023 01:16:30 +0900 Subject: [PATCH 10/24] =?UTF-8?q?[feature/category]=20=EC=9D=8C=EC=8B=9D?= =?UTF-8?q?=EC=A2=85=EB=A5=98=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=84=A0=20=EC=B6=94=EA=B0=80=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/components/EveryMealBottomSheetDialog.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt index 380bee8b..cc389161 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealBottomSheetDialog.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface @@ -31,15 +32,14 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.everymeal.presentation.R import com.everymeal.presentation.ui.detail.ReportCategoryType -import com.everymeal.presentation.ui.detail.RestaurantCategoryType import com.everymeal.presentation.ui.home.HomeCategoryList import com.everymeal.presentation.ui.theme.EveryMealTypography +import com.everymeal.presentation.ui.theme.Gray200 import com.everymeal.presentation.ui.theme.Gray400 import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 import com.everymeal.presentation.ui.theme.Grey2 -import com.everymeal.presentation.ui.theme.Grey7 import com.everymeal.presentation.ui.theme.Main100 import com.everymeal.presentation.ui.theme.SubMain100 import com.everymeal.presentation.ui.theme.Typography @@ -193,6 +193,10 @@ fun EveryMealCategoryRatingBottomSheetDialog( ) { onCategoryClick(it) } + Spacer(modifier = Modifier.padding(14.dp)) + Divider( + color = Gray200, + ) Spacer(modifier = Modifier.padding(4.dp)) Text( modifier = Modifier From 49fdd934a3f62303dab3162fa79a78aef03121c5 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Mon, 2 Oct 2023 22:22:06 +0900 Subject: [PATCH 11/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20=ED=99=94=EB=A9=B4=20navigatio?= =?UTF-8?q?n=20=EC=84=A4=EC=A0=95=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/EveryMealRestaurantItem.kt | 14 +++++++++++--- .../presentation/ui/bottom/BottomNavigation.kt | 1 + .../presentation/ui/home/HomeScreen.kt | 18 +++++++++++++----- .../presentation/ui/main/MainScreen.kt | 7 +++++++ .../ui/restaurant/DetailRestaurantScreen.kt | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt diff --git a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealRestaurantItem.kt b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealRestaurantItem.kt index d5e43191..75927f96 100644 --- a/presentation/src/main/java/com/everymeal/presentation/components/EveryMealRestaurantItem.kt +++ b/presentation/src/main/java/com/everymeal/presentation/components/EveryMealRestaurantItem.kt @@ -43,10 +43,17 @@ import com.everymeal.presentation.ui.theme.Gray700 fun EveryMealRestaurantItem( restaurant: Restaurant, onLoveClick: () -> Unit, + onDetailClick: () -> Unit, ) { Column( modifier = Modifier .fillMaxSize() + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + onDetailClick() + } .padding(horizontal = 20.dp) .background(color = Color.White) ) { @@ -254,8 +261,9 @@ fun RestaurantImage(restaurant: Restaurant) { @Composable fun HomeScreenPreview() { EveryMeal_AndroidTheme { - HomeScreen() { - - } + HomeScreen( + onDetailScreenClickType = {}, + onDetailRestaurantClick = {}, + ) } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/bottom/BottomNavigation.kt b/presentation/src/main/java/com/everymeal/presentation/ui/bottom/BottomNavigation.kt index 5085aac9..9c8ef653 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/bottom/BottomNavigation.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/bottom/BottomNavigation.kt @@ -37,4 +37,5 @@ enum class EveryMealRoute(val route: String) { WHAT_FOOD("what-food"), MY_PAGE("my-page"), DETAIL_LIST("detail-list"), + DETAIL_RESTAURANT("detail-restaurant"), } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt index abe6bb31..80cccd0b 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt @@ -56,6 +56,7 @@ import com.everymeal.presentation.ui.theme.Paddings fun HomeScreen( homeViewModel : HomeViewModel = hiltViewModel(), onDetailScreenClickType : (String) -> Unit, + onDetailRestaurantClick : () -> Unit, ) { val items = listOf( Restaurant( @@ -155,9 +156,15 @@ fun HomeScreen( } items(items.size) { index -> val item = items[index] - EveryMealRestaurantItem(item) { + EveryMealRestaurantItem( + item, + onLoveClick = { - } + }, + onDetailClick = { + onDetailRestaurantClick() + } + ) Spacer(modifier = Modifier.padding(10.dp)) if (index != items.size - 1) { Divider( @@ -402,8 +409,9 @@ fun CategoryItem( @Composable fun HomeScreenPreview() { EveryMeal_AndroidTheme { - HomeScreen() { - - } + HomeScreen( + onDetailScreenClickType = {}, + onDetailRestaurantClick = {}, + ) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/main/MainScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/main/MainScreen.kt index 88f314ea..d187555c 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/main/MainScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/main/MainScreen.kt @@ -23,6 +23,7 @@ import com.everymeal.presentation.ui.bottom.navigateBottomNavigationScreen import com.everymeal.presentation.ui.detail.DetailListScreen import com.everymeal.presentation.ui.home.HomeScreen import com.everymeal.presentation.ui.mypage.MyPageScreen +import com.everymeal.presentation.ui.restaurant.DetailRestaurantScreen import com.everymeal.presentation.ui.univfood.UnivFoodScreen import com.everymeal.presentation.ui.whatfood.WhatFoodScreen @@ -59,6 +60,9 @@ fun MainScreen( HomeScreen( onDetailScreenClickType = { detailScreenType -> navController.navigate(EveryMealRoute.DETAIL_LIST.route.plus("/$detailScreenType")) + }, + onDetailRestaurantClick = { + navController.navigate(EveryMealRoute.DETAIL_RESTAURANT.route) } ) } @@ -78,6 +82,9 @@ fun MainScreen( navigateToPreviousScreen = { navController.popBackStack() } ) } + composable(route = EveryMealRoute.DETAIL_RESTAURANT.route) { + DetailRestaurantScreen() + } } } diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt new file mode 100644 index 00000000..0822fcd5 --- /dev/null +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -0,0 +1,14 @@ +package com.everymeal.presentation.ui.restaurant + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable + +@Composable +fun DetailRestaurantScreen( + +) { + Column { + Text(text = "DetailRestaurantScreen") + } +} \ No newline at end of file From 21c9919af53a8976d3ac76b85e91e728f82a4af6 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Tue, 3 Oct 2023 15:25:18 +0900 Subject: [PATCH 12/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20=ED=99=94=EB=A9=B4=20Pager=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 0822fcd5..01418a11 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -1,14 +1,82 @@ package com.everymeal.presentation.ui.restaurant +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.material3.Divider +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.TabRowDefaults +import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.everymeal.presentation.ui.theme.Gray500 +import com.everymeal.presentation.ui.theme.Gray900 +import kotlinx.coroutines.launch +@OptIn(ExperimentalFoundationApi::class) @Composable fun DetailRestaurantScreen( ) { + val pages = listOf("Page 0", "Page 1", "Page 2") + var selectedTabIndex by remember { mutableIntStateOf(0) } + val coroutineScope = rememberCoroutineScope() + + val pagerState = rememberPagerState(pageCount = { + pages.size + }) + + LaunchedEffect(pagerState) { + snapshotFlow { pagerState.currentPage }.collect { page -> + selectedTabIndex = page + } + } + Column { - Text(text = "DetailRestaurantScreen") + TabRow( + selectedTabIndex = selectedTabIndex, + containerColor = Color.White, + indicator = { tabPositions -> + TabRowDefaults.Indicator( + Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]), + color = Gray900, + ) + }, + divider = { Divider(color = Gray500) }, + ) { + pages.forEachIndexed { index, title -> + Tab( + text = { Text(title) }, + selected = selectedTabIndex == index, + onClick = { + coroutineScope.launch { + pagerState.animateScrollToPage(index) + } + }, + selectedContentColor = Gray900, + unselectedContentColor = Gray500, + ) + } + } + + HorizontalPager(state = pagerState) { page -> + Text( + text = "$page", + modifier = Modifier.fillMaxSize() + ) + } } } \ No newline at end of file From 8550189ff948a4bec83115ad1a39ff686c2e6a45 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Tue, 3 Oct 2023 16:12:59 +0900 Subject: [PATCH 13/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=EC=83=81=EC=84=B8=ED=99=94=EB=A9=B4=20State=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantContract.kt | 20 +++++++++++ .../ui/restaurant/DetailRestaurantScreen.kt | 33 ++++++++++++------- .../restaurant/DetailRestaurantViewModel.kt | 33 +++++++++++++++++++ 3 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt create mode 100644 presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt new file mode 100644 index 00000000..f9e9498d --- /dev/null +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt @@ -0,0 +1,20 @@ +package com.everymeal.presentation.ui.restaurant + +import com.everymeal.presentation.base.LoadState +import com.everymeal.presentation.base.ViewEvent +import com.everymeal.presentation.base.ViewSideEffect +import com.everymeal.presentation.base.ViewState + + +data class DetailRestaurantState( + val uiState: LoadState = LoadState.SUCCESS, + val selectedTabIndex: Int = 0, +) : ViewState + +sealed class DetailRestaurantEvent : ViewEvent { + data class OnTabSelectedChanged(val selectedTabIndex: Int) : DetailRestaurantEvent() +} + +sealed class DetailRestaurantEffect : ViewSideEffect { + +} \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 01418a11..0eecbb96 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -22,6 +23,8 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.hilt.navigation.compose.hiltViewModel +import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray500 import com.everymeal.presentation.ui.theme.Gray900 import kotlinx.coroutines.launch @@ -29,10 +32,12 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalFoundationApi::class) @Composable fun DetailRestaurantScreen( - + detailRestaurantViewModel: DetailRestaurantViewModel = hiltViewModel(), ) { - val pages = listOf("Page 0", "Page 1", "Page 2") - var selectedTabIndex by remember { mutableIntStateOf(0) } + val viewState by detailRestaurantViewModel.viewState.collectAsState() + + val pages = listOf("정보", "사진", "리뷰(0)") + val coroutineScope = rememberCoroutineScope() val pagerState = rememberPagerState(pageCount = { @@ -41,17 +46,17 @@ fun DetailRestaurantScreen( LaunchedEffect(pagerState) { snapshotFlow { pagerState.currentPage }.collect { page -> - selectedTabIndex = page + detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnTabSelectedChanged(page)) } } Column { TabRow( - selectedTabIndex = selectedTabIndex, + selectedTabIndex = viewState.selectedTabIndex, containerColor = Color.White, indicator = { tabPositions -> TabRowDefaults.Indicator( - Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]), + Modifier.tabIndicatorOffset(tabPositions[viewState.selectedTabIndex]), color = Gray900, ) }, @@ -59,8 +64,11 @@ fun DetailRestaurantScreen( ) { pages.forEachIndexed { index, title -> Tab( - text = { Text(title) }, - selected = selectedTabIndex == index, + text = { Text( + text = title, + style = EveryMealTypography.labelSmall, + ) }, + selected = viewState.selectedTabIndex == index, onClick = { coroutineScope.launch { pagerState.animateScrollToPage(index) @@ -73,10 +81,11 @@ fun DetailRestaurantScreen( } HorizontalPager(state = pagerState) { page -> - Text( - text = "$page", - modifier = Modifier.fillMaxSize() - ) + when (page) { + 0 -> Text("This is Page 0", modifier = Modifier.fillMaxSize()) + 1 -> Text("This is Page 1", modifier = Modifier.fillMaxSize()) + 2 -> Text("This is Page 2", modifier = Modifier.fillMaxSize()) + } } } } \ No newline at end of file diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt new file mode 100644 index 00000000..ef6440fe --- /dev/null +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt @@ -0,0 +1,33 @@ +package com.everymeal.presentation.ui.restaurant + +import com.everymeal.presentation.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class DetailRestaurantViewModel @Inject constructor( + +): BaseViewModel( + DetailRestaurantState() +) { + + override fun handleEvents(event: DetailRestaurantEvent) { + when(event) { + is DetailRestaurantEvent.OnTabSelectedChanged -> { + reflectUpdateState( + selectedTabIndex = event.selectedTabIndex + ) + } + } + } + + private fun reflectUpdateState( + selectedTabIndex: Int = viewState.value.selectedTabIndex, + ) { + updateState { + copy( + selectedTabIndex = selectedTabIndex, + ) + } + } +} \ No newline at end of file From 9e9a02f718c907f49db6d7fb8ad3d9004bf80b73 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Tue, 3 Oct 2023 16:33:45 +0900 Subject: [PATCH 14/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=EC=83=81=EC=84=B8=ED=99=94=EB=A9=B4=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=B6=84=EB=A6=AC=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 120 ++++++++++++------ 1 file changed, 78 insertions(+), 42 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 0eecbb96..9ee40c44 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -3,6 +3,7 @@ package com.everymeal.presentation.ui.restaurant import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.Divider @@ -15,11 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -29,12 +26,53 @@ import com.everymeal.presentation.ui.theme.Gray500 import com.everymeal.presentation.ui.theme.Gray900 import kotlinx.coroutines.launch -@OptIn(ExperimentalFoundationApi::class) @Composable fun DetailRestaurantScreen( detailRestaurantViewModel: DetailRestaurantViewModel = hiltViewModel(), ) { - val viewState by detailRestaurantViewModel.viewState.collectAsState() + LazyColumn { + item { + DetailRestaurantImage() + } + item { + DetailRestaurantInfo() + } + item { + DetailRestaurantTabLayout(detailRestaurantViewModel) + } + } +} + +@Composable +fun DetailRestaurantImage( + +) { + Column { + Text( + text = "이미지", + style = EveryMealTypography.labelSmall, + ) + } +} + +@Composable +fun DetailRestaurantInfo( + +) { + Column { + Text( + text = "정보", + style = EveryMealTypography.labelSmall, + ) + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun DetailRestaurantTabLayout( + viewModel : DetailRestaurantViewModel +) { + val viewState by viewModel.viewState.collectAsState() val pages = listOf("정보", "사진", "리뷰(0)") @@ -46,46 +84,44 @@ fun DetailRestaurantScreen( LaunchedEffect(pagerState) { snapshotFlow { pagerState.currentPage }.collect { page -> - detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnTabSelectedChanged(page)) + viewModel.setEvent(DetailRestaurantEvent.OnTabSelectedChanged(page)) } } - Column { - TabRow( - selectedTabIndex = viewState.selectedTabIndex, - containerColor = Color.White, - indicator = { tabPositions -> - TabRowDefaults.Indicator( - Modifier.tabIndicatorOffset(tabPositions[viewState.selectedTabIndex]), - color = Gray900, - ) - }, - divider = { Divider(color = Gray500) }, - ) { - pages.forEachIndexed { index, title -> - Tab( - text = { Text( - text = title, - style = EveryMealTypography.labelSmall, - ) }, - selected = viewState.selectedTabIndex == index, - onClick = { - coroutineScope.launch { - pagerState.animateScrollToPage(index) - } - }, - selectedContentColor = Gray900, - unselectedContentColor = Gray500, - ) - } + TabRow( + selectedTabIndex = viewState.selectedTabIndex, + containerColor = Color.White, + indicator = { tabPositions -> + TabRowDefaults.Indicator( + Modifier.tabIndicatorOffset(tabPositions[viewState.selectedTabIndex]), + color = Gray900, + ) + }, + divider = { Divider(color = Gray500) }, + ) { + pages.forEachIndexed { index, title -> + Tab( + text = { Text( + text = title, + style = EveryMealTypography.labelSmall, + ) }, + selected = viewState.selectedTabIndex == index, + onClick = { + coroutineScope.launch { + pagerState.animateScrollToPage(index) + } + }, + selectedContentColor = Gray900, + unselectedContentColor = Gray500, + ) } + } - HorizontalPager(state = pagerState) { page -> - when (page) { - 0 -> Text("This is Page 0", modifier = Modifier.fillMaxSize()) - 1 -> Text("This is Page 1", modifier = Modifier.fillMaxSize()) - 2 -> Text("This is Page 2", modifier = Modifier.fillMaxSize()) - } + HorizontalPager(state = pagerState) { page -> + when (page) { + 0 -> Text("This is Page 0", modifier = Modifier.fillMaxSize()) + 1 -> Text("This is Page 1", modifier = Modifier.fillMaxSize()) + 2 -> Text("This is Page 2", modifier = Modifier.fillMaxSize()) } } -} \ No newline at end of file +} From 55501232fae063c99f96138c18b5e3945513456e Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Tue, 3 Oct 2023 18:01:42 +0900 Subject: [PATCH 15/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 71 +++++++++++++++--- .../src/main/res/drawable/test_image.png | Bin 0 -> 180322 bytes 2 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 presentation/src/main/res/drawable/test_image.png diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 9ee40c44..656ce40e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -1,12 +1,20 @@ package com.everymeal.presentation.ui.restaurant import androidx.compose.foundation.ExperimentalFoundationApi +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.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Divider +import androidx.compose.material3.Scaffold import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.TabRowDefaults @@ -18,9 +26,18 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow +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.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel +import com.everymeal.presentation.R +import com.everymeal.presentation.ui.save.SaveTopBar import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray500 import com.everymeal.presentation.ui.theme.Gray900 @@ -30,15 +47,23 @@ import kotlinx.coroutines.launch fun DetailRestaurantScreen( detailRestaurantViewModel: DetailRestaurantViewModel = hiltViewModel(), ) { - LazyColumn { - item { - DetailRestaurantImage() + Scaffold( + topBar = { + SaveTopBar(title = "") } - item { - DetailRestaurantInfo() - } - item { - DetailRestaurantTabLayout(detailRestaurantViewModel) + ) { innerPadding -> + LazyColumn( + modifier = Modifier.padding(innerPadding), + ) { + item { + DetailRestaurantImage() + } + item { + DetailRestaurantInfo() + } + item { + DetailRestaurantTabLayout(detailRestaurantViewModel) + } } } } @@ -47,10 +72,28 @@ fun DetailRestaurantScreen( fun DetailRestaurantImage( ) { - Column { + Box( + modifier = Modifier + .fillMaxWidth() + .aspectRatio(9f / 7f) + ) { + Image( + painter = painterResource(id = R.drawable.test_image), + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize() + ) Text( - text = "이미지", - style = EveryMealTypography.labelSmall, + modifier = Modifier + .padding(10.dp) + .clip(RoundedCornerShape(20.dp)) + .align(Alignment.BottomStart) + .background(Color.Black.copy(alpha = 0.6f)) + .padding(horizontal = 8.dp, vertical = 2.dp), + text = "1/6", + style = EveryMealTypography.bodySmall, + fontSize = 14.sp, + color = Color.White, ) } } @@ -125,3 +168,9 @@ fun DetailRestaurantTabLayout( } } } + +@Preview +@Composable +fun PreviewDetailRestaurantScreen() { + DetailRestaurantImage() +} diff --git a/presentation/src/main/res/drawable/test_image.png b/presentation/src/main/res/drawable/test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..be80c10f6cfc09dfe2525f0564e834bceecfb951 GIT binary patch literal 180322 zcmV(&K;gfMP)F00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP ztGbKas#|qg-XxL1J>1RgK)+8_&oPh8+Vxve8R5kI*da_$=&`+x>+OLd?gP~p32esf#lrD&CQj3`|8&+pEvU9$KR6=pZu;ofBXYET0NF| z*Gbbhl0_t^M#h{ZkNP{Fz$5AZ;&=Tc>kIbUh)>8k4*IJ;my!&_AlvP=TwK4E-+c9% z{N{_#^zxd?Ak?KbG}o$?M(idpUc3A^mQYq}OR$TyK!es|z{5 zd?ODYJeH3>{8S!4`ao9m6KVE3-d&dUVkxIbYdJYu>1PH>`ngfZH0bzx9qXvSjKip7 z9Qkk7e}@q_hkL?3j~ox*KPLUb`v=}<)3o~kEyp+dJr6@Kd%e!~ZYOuUUUvH40oQ37 zk*3q{*Pm`CN&m)oZf~yT?Co2*ytt6f=14yMOA-TUb23F5>7qGwAbhN`@QV%?&RkBM((bzWPg1rvwSDt`{1E`^8AUM zK6)hA`%%7qyOrF|bpB`3wtANdtC)DrQNQnWJ(mZYxm>(`C7*rvYx&_{|5$$Y%`0h^ zD_L$H$a1lf*h!7LVY&U-WKxE_m>Q~6DQE&qqle<**w-0IklWZf-v?FV_ZJdz`s z%R={eyBAqEbNQ~0?|=E=xg7U8lDoamfv%~}3wA2@_<#w+Uez(-9y*_E?(Agifpv?& z@o2H03HLk7PUmR1y^-DSPRA=Uo7r68r`5IZbsuAmQj^NHGv>HlQ*=%5$BNH z2R4({(TU9TOf*dr8={U6=b*tDnmBy?8+$SKDCP|R;r;j?j1zOY)je=?@mli!M#rRM z*8P$7I;W?PWwBc6UfJn$J4^-F48!XO?61+zf3|C3J(kOb%8i9AS4%$=`kLN+zrB+; zXK&b-0uiw2@`Ga#b>l$v_J?6i~d+alqyV*?FUiaj{v)ap` zb2(ynCcA%(53{(^@z3?Uc&|x#-71|DXNzl>ac1;7eQ&R|wr5i;#N;#O_au{@ESzhs z70wsdc&_(^brat!{4d348~c57?XJ~>*3IYop}D?Q|80+CHQVULbW)p#Dtu2=sOZ6O z^wx&CZmb*qvRhpcU9b@s)Cq5~@DN%M8koS5LODY!=QJHTr2_v;_BOj6+e4WfsO3a2 zbwQsze4_8!%lY|2u5RAQ?d^q(`#~3St&4uD?_Kf`;@Y#>kv#w4ksj(9Hx0(O({VQK z8`$^6_xhu>%`jU|lQ-4sHTnJS^hq z%4ozyV8R>Q5WIiAJ`P(ewh{0eHe;vHEoUt^^qt<*onCjR0=vgFV@?~}JUczCR0t5m z$u>@tY#VVCl(igeEIiQq)A+)tk()$(&XaCt!MG{b?Vz;!r9Blys|OYeCFz*-d-0#X zm$D_M%9+hAR2}w@?_zEfUuy`^IOtU7{yPq12jQ!8 zYl=Sm-Wg3f?{ft3s)1|oEyKMt-s!%etxe)KEXJW&c7c&t#99kmuw+~ zq$&?TYTP3niyzJG=P>)B#NFZ^xc{-&Fi&k`>jtH%0ucAJ>s7hy-o+LjsYvxZTga3J z1?p#=`oE2lG#kzN+3FK~&h3==tymO_btI#$@K(sCP-9iQBuE-J00q4h! z1e|5gUBX=^0PLH4Ja~s|)HqhPOjatr6^tA_Ez_o6c zR_{wxh(o#X$iYGyX%y+WeJn2Auuj~-jazxHZ^i`Cm1#LjSP*WdhP7%_9>O{ojoi5W zhscIUko9aXXu+z%rkj1MT7P>7%UWk0*7n_2M!k}bwL&3nS>UEA^Z_nlG?pB7?!Ytgu7CiYr#NQO$`pm2d`b^KT#a`~rW7?0VoTty`cW5b*C<4*KXG#ZJ#+ zt5zh|WDIL3rYsbv8wK_IL)dfH<^ChCANx1E;Kg3d`kmM6(KTxMZuN)HWwR=wc$ZMV z-OL0ueurRf8~&S`RK^2~cz`g|d+&WN*6Lxc)+^qB&UGA^FC3wz8U@49(m>)*W9O4^ zZbmZ{DX?44@1SeC*Y$6xV5e&}odcN&+cE=`3HGn;JD>tCPv3d3%~{N?OswI0jXLik zu5BRA)bMy`9qcpR_3gDD#&dc7>a{NTt-6cH`oX-p77p&xO2hSP&oJS003Wf zuq0sZLAl`2np&Y1SS-Pj*TaMjE|5*Qw6s(W?f`xPMP?$}W;m5wJ=hP_{w`>AgU^y} zr3$&-0)kov43r^MfxHdvJ1tTO@a8xabM z!j~#7`KQle_fHyFEBlZg|%6cD| z2m6E+K@!iy3Z(C(1H$iSW!rrd7NIc%E7A`xU@`qM$Y|nehB9hWIq)WU_Ee;>T-R%d z^l~azJgrbz-aam>t^+|)&terS*`X2JyRCbAdxZ?|6jHfTrQO3_*T3OG0gA!B!svlP zg`ZC07W#@jCuXMP(S@P^o1|KkX0WJI)cF9U(amPn%FS-}lzVFVeK=$E2+Z=cy^KAR z@_}>%EP-*))jOF(nL|;G22qMs<(J%wH7C=@>|Rp5k6uhz!?`R^{kn;wYY2gaY)f_D zS5aU;e%<8Ow@fZORUq9Cns5*8*m5J@UTyVD7SgXrK0nL`8g6~yFgk#nTg8svyi^P0 zR5#mOFlhmuQTj@QlmM0X@a8L0Z1-;_js%~Iw>i5qH zPYh%D&pM7|u2@eT3iy?~Jbp+MtOC132?@-}ZN`aE^C_R|CEozqOg~;Dg++;ZQc2qZ zUee9lt4nw{Z%y&}rr%y)n@6HTa;68RRV)ow%KZf#TDCXUAqX9@x0x!GJ&otK?% z;H_HdS67#EsRH^|@#mdh|3>l0ey4Mz^BZHw22Z0|hpk&G$t_7-+k|dC^!P5UWw?@5 z(xW{`V=#sO3d=c!uzMkXcxY{7?i=$4%-SBfKKQ1NV+$#W=Sp- z>bh0sM)Xkc0hZ?+xWDcN>7)p(PXAqD4?}3ACJ=G6U?n+jZsR6wky^hegDwbXIK~)C zghFMioM>%!G%gxfWWDbf{NVQx93dEJtNbHCGlXLH%|{&3IPAwIkJ5cKvPjZ{c6?$5k8^Q5S3;0Xct@OjHq0qK}M z_9=1r(P79m6|ONi)u=4?WDc(`#jTjt?TW8y0;)1)9&2_#ZgF7MPafTBxt2#7K*I;G zZvb;#bJO3dr8b+rrNv3Pr8l=+9O=zssdw`B{9Ir8idHW0wNCNiu3ZC$wn+=Y-~-KL zwUTlen4{lFV-^#H8(jImzm*$xOV7_=ss((luPX$gP)0k?)X>nDnDo_pBa7vXIO$wn zs`+e1D-PoU){1{;I^KmI)=>}Wpg&lk>qgz(TRo`bR75ff9fJQ)GbqM2LCrhunz~hft9-CYxtWk8}L=N zo^~4e$~Z8EI|{25Ajkv?aF;JRED=Et!W2WUmWXe-(IZHK%^B_r3uxe6$^>gQ{HR)2a9JC7 z12eQcKazQ)u&qkpx2#cA{%})2%o$ifSs*G<{vo|gvu)o_@ zgG*|Vw7GQ=WdeGs`x#JIQy0Y68kTWN1Idtdd*&$t`D_Mf)#sYY2>4 z+uD4nl7uj6n}Hq9Zb^V8a&*1c>3TKQLb9#JwOz&}~M$lZ(T-WP)>CJP2H!_>+*yw2+q!swN_*tT7 zf&0xdU*?(8N6~+86<)=@+G;=z=iSMy- z;_*%}hcX#;ZmM;gd~S%3m-naQyoCar&Z+4`-|Jw0+nL>FnTKU+c_utY8{&lOfU(w}1$ z;K#b@W)?;F&1q*eQ*f94o?H_GgLTc7lDUw;{$TCi-k!_F)oTU@=SvGjQcwd2+!^i+ z>wUgn@X!*An=RkL+L8;;)|n;<7DBP!&URD~Gu>>n6%>nFr+Qenx3I{z?qVle=pmF0 zTi0>81wbs)gOoWI5z+V5R#(MWu2>HqD3CFPw_%?JQ;`}0wk2vLf)iM$r3xWj@=m<~ zVAgxJdath)H=bXW*YnXaT}H$gZZ${-s08o5(ciZ>`nL)-9EhDp&!Mo)(uhsyLeZ_+ zDm1f;naQRS545_)EN)F_cf}(ZM(k~jAg8%fTyq9(opCTa?oT{j81P|yRxuaLJ4qv2K~c*O%89q9~CZVH08UhRoO6EE8uGR&$aS zf>s#f(96WYxBJ!o1J8rjvouA}1>2$sMnAZzD4Qk>t|CBasrqwK!LV59d7Lfg60x3u23#!LoE8h)*hB$6^gbpC$G-22g@<_@ z5Ik=JR}Z(m0pUpKT8`q%IGNIF-C~5YfMwkG1=a~A2G}8UXD9uACKkxn{c?vrdP`vp zkTF9X`l+}UowapcAi~Em&eY@kMQ`Jnz8b~{lL1wFnDm9i`a@U zZz^rfAUO--0YU;UkHs9_=}g7a#6p{3FG!2e4_Gu1csQ6#;Cy;7YqezdnETtU;?=4s z^>A5$4^YK5E$X)y7xZ)xaJ*F^eWULk5smD7UT^Fj3zRxnlBe@0Zmm{^LbWOD!(-1f zrGydQ7+pA|rv5bPozDi`1tr}U-?8U>z(T`5!@b=pa3P#i zYZg^Y+*K_z{rnq^v#8`1JPYAG(|xj3&twiOok2f>L;TDV_^>NgCnM1lNu)6v6lE@U zD(fDw&;7s?6>v%(i)q~YHB1*Q9t0l^TkY%|c+k_VaB(ZJUN6oRgwL!q50Q+eG^P55 zRcCH{VGYD{gLxpNRq79ZPks-y;sIC8K%>;TSD5kq@(hj@1ND%~Gcnj{bcn$W&8Cbm z1-rt>I^_DkuzEw7j>*;!Y@non-vCxqL!#+sTw8iIjlrZ_H7M>hI6ZSZV&iMkxPlZ0 z`-kFP0Q$pTqq0uTK>)X%SojfK<-AV=`tN(h{boC_2UfDL{}kJfIT^?7aLrf@owEOP z4cgjV#x-sJItrgoEictH*eti|?mm3@gqUj!cMm}u>-+Qf!=H?ETnQgdM z1?o~KY!596TujHt}s8Zfl3S=UZ~8jPbo8g|0Z1PnnwX|_Nk z*d;rCFKB`{iUTh6@AZ1%CdIA7Dp_f~pdEBWt1`XScmiXMR5kU7lQbjjQcCe{XN5h?GL8%NY$>A!%A{|70Sav?{u!c)SesZr(5!!aYxHmFP zbd3hAfy~Y2P8Q?AcYt3GxQ!n7XabsS9<`9?4BVT4WgKic<0_=3@t|cxUUPQg$o1g` zMq0_lV0SwY9y(NmdnRR4VGCN-7VL$|Zq}&KAmMYZ^SK#e7K5myIdI!)Shyt{a1I`X zLc*F%7K*RJG102Voq;)H0vEBO!5|ieC>#Adgmsz-H{OFYKbnYlxECl*n!L}ThU8~) z`n(-gqYxH0(S3+0emU67xtx{5pkw_RonaILIv|$V8war}xz9EcquJTujr4wc{6IeW z_`9;%oKVoUiY+&3Ng=(~VB6{Ov8+$@_uYlz!TU2>%-A?B2jakZ>zgwyWYXH==8a_# z+*g~Sh8$inFy`}(3Zkt%IDJYY`bMqfBNfQY^@4m#@U_>=Q&lP}+nD4pcC^=->{9sG zv`6Vy+gieM$ZB=o$>q%z*(*&4ta42ZYY!pWs!N36m_rvMBH0v{`lC+)r)+hz!G^%| zT^qoEGOMB~Vuu3RJpXhk&`7UH3^L(K24x1ryrCHPOnkwif@Kf4Z>MA4Q;~s&HwL{7 z*D>ggRuv8kHaICzYIQF3Z~P4Iy7F`L&hXU6EDKt+V`V6W8!fTPMJjfg?%U4O-J9zF zXTwQ{> z!p+Ua5FqoM$vQhIQUsmw-D4*9OD`_&*o84XrdGmLHcycIYiLLfi+DmKWouQz`HB$1F1LBR-;HLlnL;^=fQAgCR*v0z{jh7b>sVQ+(H4#TFi&0q%8 z-qxH{O^30>z6VAPXltQpLJ?O%m8hdyQvMdSrlAD0bIixl3>>poZB4Up9NYqV`#2-X zl6x$W?8edrUMOxq;0wlr7Ph83K9B_9IdR^hxDaDvVoqlPQ%QwA6JELGSc6m`#-3+Y z3P#PZ%NB>gISAfslFDwG-pj#Om#Q3O@>-HZi@Cra_byP3p6Mr3RR$3&kou2wFJ6A7 z!fvgW@evnip@D}Fo_!>bA3oDLPAVKgZyOnSK@jE$aLDmmmOEWA^_Ej_5$nxD1?bFR z2po>at*Y#rKn}**$kfb_zaVB8`aMUhBW|9BDh$9JuoRJvv{)MX9a5=HbB7(AwC)qY zdrXn+kPJG(hJs7C8;NnfR*e1St5=F~U&>k!f2-KteA$t|X_-jEXtZr2I|LE#8M1SG zGk$so$7apIjp&I+zUIkgXQqi70ktgkpmEcVCZJ-@H$QbDUV_UQIS-kWyipa3%n=D7L)cA~Wum^8tSKMgxAw$4}+t z4r=LUXayKp+?{oe4V}Qb0MWAE~OLP_NWI_)78TUAA3jyxxJ9Hn38| ziAke1uC0!3?qi1mF}U^!;aOCS|1NG}GYC{HtFWr1uBQjBf}H@N*QV^r7}?$KmKZk# zP*|aX1!r0Cc}w)r=ljlZ`E2++psJZFHo_F3m%%H<8ar^^G1JZ&CCLQulwLOaeodoz z{HV1+Zc1bd%{mi!Jt=O6zngbxO0wQ5NBB*RMw@}hK;2gl2^tz!WNJnG*08mmJa@ogyJzc|jC4g)EPP$NFTegZxs0dVhw4gz6`_Y> ztx;Qr7@+Xy-IlC}mR3mOp;&;74q>%0p&rO<)_>zJp4;3ktUbgdS8 z$c|1<Up~3VU23om+#3ys8IK?Zg^g&8Ti;aYMQBv!#`fNjzIK+~k&racFD~ zx@fgmPrI z(F(*hp}486)Vt9^-sl{Bdw0dmO#9E~8oo}`8HEzT#svhCF5C(+hmfve8A_#dH7-~P zNtJ}zR4~_?v1fuel4imUhVnE#cV^j~6PKBmdSmP8q(rf-NL3omj8I=FZai?0cl#SA z7oM%WV;`HUUjjEn`1mRY<3FAatjXB!>`6 zDELTH%FTrJBvsJIND2@7^_y?x>}@OO7iaS1@iYBV!MNPe1w!g2uw7^?Sc|PkVPPfD z7A-9$P<=2VunLG}HFk(>I3_Go_Ml1`QLck34|}emFz%QoIE-_5?II(qEw^7R6vyzw z#R=}`&?5n3Ph9p|gJU;fI%uHbT7}Y?2F}24z?dPJ8K`i#x2KR4$BAliBLWOuWS7{e zxe{P)OnrB7djyFaIG5W*y0Tk804C#u4ryreXeY6 zGp3S2Q>^oB^UpM8T4r z(~KY*MPM@fihM=fKMpZc#s~22E#U@kHzp2{#adyjqs>EkboxL&vkhT}qJZI|j(yp| z!Kp3-h~TQ@#H}@^(ESD8-64N}&bbIuqK?Ixwr)?k8OTwv9mQi*l&JFyxdJUu07`Oc*BS{6ap7de=e?3RX%bz(_&N8-Z1X91Q=3gxZ3_t&(d`C8xmrtAvs#;8FyM1nI@ z%@+R`ZjEOS!elhJtuwctADVeuthw!bV80rafts2xW>jEv)*EPTCB36VRqM5-^-#3E4e*-F8p((CL{yJe@A-i`t3l|oe~Cl8pO&%!mT zBo|%hLdtec9>f0@x1Pm_l5?rx z@xXdM(U^wZc}ZRP=+$j9BAvCvGb@W(Uom0XlZClv_9+2Xpmx<7mn&2ID*v9h^s6vW> zi1Tjy2i|L|KZBn)V#E3#3##U_X9@pNJ~uuuE&1o>a=FzE9NSqV^l046%5Dam0vVj@ zYWW3-mEGLjnPLJV0i$iB_Kna$m{QqHpl5@rI+@T~eZPjMBky9(VL*vA2hYC)W4uR5 zSJ>sAfcAMV)^?6fT*n)qnVdU;To zI88pd0>k6)`FmIl5$A#b^9LYYbaJBxa)mCgj+;``{=<#dGhEHGZEX?3>WNeFn6GA zWipN^u+>Jjz?5n>VL$;*bAXvPqpw>)XUP(;2CkviPyr-?IcCNmyxYNw5LqphOs}

`?y_rbFt$jOlc@egij4W8&Bnjs^v=~#m!Tn%Dysjcq5q(isO?F!SxHPs^5)tNk7 z@tm;m(quBHlXbszW88?il>!PGGN7<{x3C6xTc)BTk%OfVS>s?vMM8#$Mm9au*bcKt zl#PF#nGI#`YU6?}(|waF7ESX-#lA7>PV_7*c#UA3dL!p&Z)usrADgw7&;c9|9OW5P z;yaI!&q;9vW1(Z2(VFB!YcKf3E}$fgFt@}cNBsmJWB6n-S6Pa}&HlM2w77U(h?yy0 zP}vZaJKC(tKkr(nTv1o|6b5H!H*$qUf=FIySxb%V6Qt!Iq1xTbiU7^pxjcIKSROo{ z6IMZhdC81NW1L8ySavy=8Xa+>$B7%0+^vbEfMVO^NPww_gRt0akW00?-YTXt%xVBH zQh3XrZM+7De$}i;!KZ8i#5#RFT50RpcjDfknFX; zE8jtUI|+p!4(U>Hcqnu*7@)W!g&g?mjy&d`mi1n-;g!zqjPLV$AO2qPB2wYr2k+gI zNsMnD8H(lbWwW#KN$l&kiDW6GssWlZF12B**#DsEEwERzd3iJP^<7zb`Z~P{FJ@%P zWyX@(4n_lY9#`oEHu@b=gt6YYuxCzvucb5CW_Jno;)?W!FfO- zI*>s|fya=Z={_w;e-8OecCH%89j$w`B+h1VGoA=3xhm{Aj@d-UJ~*{tsL zP;Pl4rjIh%H?ycY12jE1)j?G*$#oManP{Sk<(a~Yk8GJjY!VOoOm1LmrHE9aeJC6` z(OD>%?{tG>SkMg6Hh`Itddw{B4!C}GBmR-WR_F}NSK;dkjA~s_|#|^v#%Df0cA{Hc4IXakX6c! zgLTvApeQge5GoIjS8kPMdLN`sWupN0BdjZ97T|fLp`#ABD6E2gg?T`dNav+rvA60b z7b^q6|EyMEF87g3Nm2X*%hFfEH@I2Gd)C)BK|ko)UvF>Z8dU%r%P@sdX^21DM@RR3 zFb~HnP&zO?Qp`*$`+6#%iFG?9kSDy>sR7YWtf@YdLUubpd_ApDu-+hK;ju)vAqtP7 z^e+VRO07dMaW>$2>)&}C3RTXy;-+l4w`8c6VKYq{akxcl(Xtq;d1RHVT{yZEwbLf^ zY%JK>Pzd9FyS?G-u-x?zmMU(RCh%9QnJbB|)@sQU1?F=YmHwijlhwhQQOGiVJvW2} z7iw_9_-b=5_1N*S60J>9v=-2BOasj{~dPdE*hlO;g4G9)Udl zJ>*$-*}<{s+C!Pf8n*74nKxcD3ZvFYxQgBJ>Y=RXy&SIxPj7U~SpQ{F9S_oZ(dWqk zV~{RDL&oMB`F3$ytmo{To^LOjx=fE8;yVU8*qT=Ge9waSgX7G16m}>riL~>b*QGVu zl2h!kIlN{-j5b`$rcExOEl48)w=jjf5i4zN0ka{jJ*F_jtwiAQk{M3G$H3vm->{Gy zltf)EEDN#qW(Mv$!j;WqPlbXp<9d<)ioh&f)%E6>9B;U?c%Uku1$4Y_R?Y>!BC{iz zbug{vQUtZ71Qb_!%wrMWDObzDK&<4DL&y5NV5ormx*rY0Jvv&cBA+wa1KDv%%%Si` zf{xC4&vf0b`rX%-L55)R90zwr?|_+}PzKUYcee@SW@0=u=qN=M1tv-lP0Z!)`>2#R zP&gYaVRX-^<-J^>5EMQ~%d#nR5POO9mJH%p>G&Y(=50{=Dh69DGI1)GP$b%TQ{{_u z_@f1kMdTpZhP7Peh4GTrYQ9uRaR7{=kQfv*JPY9Q@TR!WcY8BuvQrmJqQh9~QNXY` zMq0mG&|TXe2pD>@o?t?zg3n`fkW`YZJB__UIKzcq)WSv+0YD9-1z}NV*@EzWfgnb& zA7TQy;=1&{JTM-x0zL7jTJn@dr96O9`|vqbN^DRTI6H)bYXVXASOxyw?sg_bo2k&O z#vB8Qy(QeVT_@8=BSM0!q1;&(Z-hfzoD}yzLHxnmp>);EsD>w2#^?0A|3JWeg4omWgKg8V~$84BQ z)ibRbmeL(vyd7&TFq(}G;VzEVnDsPr%H?5VRp#>D5aP@XWV&q~OZJ(gVn|j?B9X!b zPWT;*w_IOb$<@^b6GCj`Wp%?4I9)n!=K23!>ue3H5zL>qFSM$@&kW36-`x23w|ZDN zc3@#qtM*4%ls!|u7hGgkT5H4qcC1>af-JPUZ%w6?S}!S>JI|n-dGMOSF^9H*&x(5hBfH}C z<$F*;GO-iS>>x;KW3?hhA)F}W-B5W~u*6(6rIKJVrg(%#mRTS!?uHD7sCUjA)Agp~Na;-0OFqzN|`FiK9D!wB2Pg|bZcjKPeMWh4N2 zf)TD4i8CqA#iTTAn$S3=&{e6^lB-vGA8(e)8c%;>UmiYhN>toy#!pz$@zc0)4;hHH z>Tu9omxf48$z8)k*?Z^^K8pDNC6~V+Ax#Qx|jM+I1eJBgEl+$De!Ks^8Ewf7hJ&_$T1FjfpgqyPVxUf z#;6Wv9ed1{HP|MTLDPWOJ}%|r>WZ15WIBLtqt`3taHZZaEgJld02FSSbgiy##OWiY z;+{8cdvH*bzh)TgSl9qrBHOg3h1?@`S(XftS-ps^1ns(r_QP|*y}?sxngcptaH~<> zZy3DJN0SZ=kf>EbA>T~c2QhvTr;X-v-CS4=sd#E+|=V-QP>L3=E?_vC+TaM+4V)xd4E5vxVkJSk>U2PR4hAmGcl2TYgD%N+tR^6|~N;ZxOfK-LSZ+p0Y=MYC4IB=UP5M)$?>zs zJF|$#O|kh|pIU6=l7RsB_}F-jY*Rc&jdNE!kA-v0LRy@Uz>!0U4aKsh#Su_Uat00d z=wNg~D(=y0{%%z%o+!q>(goRLsEUs!6?nI5nZMdza80|g6sSgW$?yalX{K|u(e+zn z!|3&3xph)4j;w;yvjI0PS%yCkud%6b>Jf(>sZVn(| zsqf|c92m=$^)sd7mFsiby;KG~{5^4`S+y7fTVTpACZaE`rwp5ta-rmtY;I7r>9Ip+ zc&O3G;<@lyd9dAy&ZQ1;a(uUE=GeYBW(KWFP>>5v+sFoQ>fV_%init?XKLEfjQkTjRu|v4THV2Lh39^lR+KxfkNm??Sad zg$%M2hcO%M zmVRPo52MMR(T$>t(D?aa>c1Jv*AHR>rFI6S^cSd z5S!w@S?$(A`Dj?T?lVN!Y}A3qCfz%nfdk0wujIT{G2DvUG#PzJQXKaD{_m11n+x6} z?(Q^oV@BPJJC?T80G=N1ty(z<2Es)HbkEw+z>hj(h7@Rka?0Qo@;qS)bY^jw{=flJ zi+%700CR9Z&7B>>KpibIKROpRIYw=bN~|aoOH!zi+1)&(2BG{kw7`#zNKov1hSWhcqI=7|*;;ar1 z%gUSH-SuKk8X6{41;fYWiVNDztR?sM8>=-U7JF*ind8^VVY`@?Qq^%H)>jA$fO&B7A7t*tdVPM5{dZ{b4^);AY10!pqsm=0vZ_EXY>~2{8Z2MC~}Vvj=bLOR!6 zH_k?tSpGt_BkVb0c?Y0Os>sZrRZ5YRviK~hn2=*!vouU#9i9!j>^wvm3DHJjr z$l#?(aV-=H!}G)KP|uPpZxaBvPeLGP@p&{~x(MUxJ(Y7g5f~UJtvuqjcC-*g2QU6c zVF?6dm#PF&D}_O>CV7Gw8cMh9N!TP~d_fsAt8j23m(n{HXe2W+D7d$h#Zh_zdk^z& zLMxP8Z)Fa=B3aZWi9MLSx+6o*+4eS+dU%eAWq}2TWVWU?I1%4BM7HXf9ZE9cY(d+a zwjPZcV!k54E{z3rExD$b8l)X3(k~a8IrS<-NE(` zgU+Kw0iEC0g|-d`dMqS=J#<1B&ie zO8vdKn*M?8a7v-Tc&ns6_?275Dpj~O&7R{9>QKXG0AfYe!2?FwRk*~BloEy2RSZli z5lbFZD7J~V?gxK)h${CuGY>4*&$R`?eQA_|GH({cn(#_S5iYb1yi@5wfv)%tCcr}cZ_ zim+Cavf*L_hOkaKQg>_PO@l5xP%4344_+I?-R1C^^ClJMLAW*cieSU zqhUcIRs(8QMX=J_Xwc-!a+wN*IQY{5+T;iHG-z;Exa$=3(`wcFkp zlL}{+HMUnpMwokSS&>k(*NQ(!16@3_}EDA)b*G z?sH@pRvS9GX2-ywaamm6UAU>%vC*1S&c*1QQj>!~UNgt0BDp+g=5eW9C64RTRR=8( zYz&15ZuHPE6o$CILS5Xw*R_RJCFMIKm%sJYb}M_?OfVb^7?mu&(NVlCrC3eScA9X} zxOZoI&nBFQp;NqiRytd-7OzZFKi!LA5&tZXWf_Hu6hWT^1fOuIm??<@|2nr}>F$v&Dn_Xs;o`R}*T(-?1ZhTrHcE9Ho#!GJF6_$wC@B$!+j#13 zwHBgI2caHMz)8**MJA?|m%L)tLC_hkbB=jWvspuKIo5};2Lo6-#+lVrEc;FG?F^ZF zoh3{_u_Do-^ZT{x;T=1w%#i&Emt5C+hXkTAOHfXOje*}+tEHvpJEojct;4}UtFLvb zOHDeS6rmT!OITgRMJ1XskL(CDUo1$igb{G3p29GUMd&vaf-^fSem2Ts7b#S(bMhqRt0~j=g`YX9htl2x@%q+qZ8^*LEoF*>WXmZj~6hfBhcu9#BY8 z=C+&gkOPl3;knT@)Ks2wNI$$UoDb@0$RWNzPMABD?UwvC9IZp)d*EpmW3Jk_^ww_g zE@Xb&@dAVz(BDj<4n$#*+S`vi!+e|S4so-k>_jX#-E%nmd9p!L(cocW89Sr5#FG8a zi^`0pCN5nvcUMw7fi@T{o5)7u$ZffPl!F|_yPH7Uy7iBM-yOQ8=mN5e8#<2MUdhQu zu|m{z&PIKUMxX}WjE0`HQAW~bGhIIiOvSO>5OUZ&O)f%P0tcj9W>Zg`S%pl$pQ#n! zv6N`vHKkw^>B4Os^1z7=+DX**mPBCe-O+PUoLZO@-FWkOt)T#f-cDhV>#H-?`bN9~ z4H1x~hMK#m#eo7wrPvYmTVoVOeCJ@nm|);=?Z=uyH#)92a!fL@su?G@waX5f$ly&y zy)qg0z|MH(+pAkz%dobnxN*>QZD!P%Ghg_&z%PIy5X7A?b$sK(BK5v55R7N=kiauW zZ#sAZIaTJ2-z$DwgSrSoq6$H^8nY>*=#T~A^d5Q-6y2-(hQ~A$ubnUjBALUC(CE(H zJFI73NMw?>ZFDv1iYFLF?W0&&VCK_|Gs#hbuqlG7Nr&{Zu;xQBi|=IlP5@jO*2BVl+Gh2=cSq<$U3_t_`ndQVbe7 z_j}G0lo2u$3rqwHx@$av%+8JlWGhU=eKJ@86>O)Ai%ZHZSj8>V(R1-wP)nMbtg{8r zEb3fa1m1MBFM@QRUU%OsiR&1o<#pb}YHkkmM`De_xaFGf(d%t? z&8!{d^dmD5-LaQ?hylYQ5W)f^a?fO!02k`-zwMC%gBf#yGGcN$&~{R|rC_&)Gc{9q zqsc+fC>xEgi(`gXKqr^YhBoeCUtC_iRiS*Y?#>NMY`%HAx0S+DGkx zA(em&3&Eg<$IOyjrWkiv!ZFv4ySnU`*jidVsDEf7gg$fE`GTKAZ$<=%nZ3BO;3C|A zQnvi?2Q_{x_sp6|0 zgoVNwD`fFSx0NE~9G>t=xPNdXBaDm#4{kycZ#q3yhBCYHe7y2Z!-h5XA5}fs^CtG!7}5C*&}s z$Uz+8VBYTu=c4>lI7nt&oYx*!rXX1tQC-IXlRHDwKG zpi=>jtSomwn!|(-nf_i4^NE!^ks%Ha#Xy2;GOh2y_ckVAqMHYwqg7|YN6R_OWnvkj zjYa@a0APXatjXxr)g=qlzy9{6T)e#?u8Cj|Qf#}mH-p7N%;u=`Rst(2DeS?uOcNX> zRahtc09{#G2MH0Wae7<&*5?NI?-60(j{Ramj{@#j)V^jpPseK!q=Z$B4GU#5=K&sx zi}N5t78c5%7e03!((0!qYk@SnYs~-eX-pp!~na~IL^hJErZ=^;|AVR7B*`!DnWr@7(Jl7nuUNkPn`3rc-{iG!@KtTgzg z@8c9UBBt7+VXwr3y{F9$q!D`O$?N?wwe$?gbQA z>agcfW&wK^9yY2&>fV7uXMv^8()Ow3RY1ebfM>`+cxUBTgKc5;!$zV4nD-)O!pP!$ zHdfThz5HsFyqkP-DAUqAKU3>DN`@W=6@!;>N5U1wqsU{?&34dh^}Nn2gBee^PFdsarl6FVSb>AhaVIuWXnRlOfPn6a>nLQb z^Ou`qO!~5HSWg*xA6-gzz4d0y zR3e>qly2^dj&AbcLe>%rfInW}?rCw|++3)~ur&)Nn(exxH`0K^TRb#kO$)>mXp$9j z>b#);IC{5p3Fyd}^-1Fjm%Cfp!rgCYRyj{nsn@`i^Ra#gY4Z@`xHj9IC40VUYOsjM z*rWJysLKA&?;hyr9~iVLYNRMm`nu8!J!rAu*dB@wml`^HZ zj_=-EB8<1S3do-XBk_kG zz-)A(-xySZbw&;V1KTavxp#(?CDn+rE&Ob7K63RCiy$6r^3gD%#ZBedA+}tTlz!WL z<1sD65b5w!YdtIIzj_R}(bh1l@laR%|duz#rx^ z)B)#g_!oQWIgKVww5hfE@y*h;<(jGBqvjq_2soaH1%+h{s|+oj5NJY>=~^KT)P%-o zLH=h?Jy;CF+v0t-ZB*GZ_DS-CXZy5bDP>{go-ztwTMU;sA)Eu$k)|Zmq?mCgeH4=W zBY7VZk7<~g2}4xEm%w1I#j?y>DjSl$6#Z_2xWEmnSo|~xm=(b28tq6EOiKs z%Xmv-Mt)|k;_Zz=PvdZ^!u%-@3G@I2^r(Af2RNto-hRxC>}WwVc?GU2^D+}Xl{c?m z$ZPdpfHfMQyR9{_y_PpEz1ZN6&*GBy9|SZHQq#}SfMyn1%NzW88^^LA zvO{&9r-G&N}Jqpck z@CLSbOrUBSYbzIPX7t4yJ+GH6yBZ}@k$ZqeLeVhPl|I@mG%jWZlnf?`Xjjy$Pqn{h zw%E-W%1|wE1b35rmpSA}oZ}>(P3xTH(Q2RMc;jy|5~T>*!+I-ILHj-&d-CCGp-+t0 zs7Dk5)2>%@XnWVQfDdlQ2Fi*Artz_{(AFw~gudYqfZ*6@9;}L5%2gTUVs%c&=NoZ! zt0{3&xY1pJwfn{!a+;tn*0&ea863+-Z~<2Hod%6|+iU671IYWH>;P<-5f!;e>5_tj z1DuVH!)93pHd(1cCSb!MNbXfma6adAC$HEQosp+hp_rpM5J80~R4ng(Se4gEjJa(s zV-D<%o)RFjqXiBI>PsZ@M}-*e&>FkJYJfN8J{X9BMURX?dI2LdLoEqlw9Gz-t@xZX z7>dOo1X2q9mItg|9$U+&VNWH__Gg`0g5)h<3o{>+yN)BG^n)e(P+5%@Sc=2JqEDC` zJeS+bkicQ@EUnxEfXrVosv|#aMu1V(kdkkZfdX9e3fZ5?MCdI2yrJi0Fb9;FWu=X> z)F;*$>Ch1Gx2r}kl{ptod6-1^2e-h2{zVwXm3VZ1p_koQ5D;)d--DMsV@4zI z-xV8!VtTVX6#Us)K#<=xjAf0YD+lUdz@n~eYl-V4B&9coOC}~YHND^J;^KS2gtd2^g4KxV#U$y4C0_z;WNf*2#E>zV&mCy zqoRZ{BIVK+C29kNHOHk)QFz@X zDXZe8s?kz9O#3wJMck^FLu>ng#62=rK((YBJ5AiEyF2R=ZdSma3b6zVnT~ArKFpQ2 zq>XM2T;7v)yi+px*HlhotQZ{p1&d*szzI_V^VXLDj(ar8`pad9tt_L>1Yz>R?7WAW z7j4pAHEdf_)mY!4X^U4us+=1oqel}uDn=7NVMs8L(^@UzS?h!uhd8XbmBj`~(E~+O z_wU=cYDpihn&J?;m3BoY6Z2Gp!qr6);D z4&D9akCZCU)p*2G4qTK3fHEzCB@u`BoNd7*q|STnS#T~axyG3sWPM=$Rq>UC4o}D+ zbWiND8D z0G^DnK5}vQascyws3X-fTyPapJn&AHD79%vcV7yD9W@PrVTb~zu8^!0H!$n z#w1PDvX<~H9J9-5vXN7&)e6%js5;r`MhOe*mr$^`Ar#Gbv7oI(YJ{Mg#@Eq1RCktv zH?k|Xc>&07d;IvJ3g`#2SHbo2>RbkPHE%g@Db_nxvjT?u+_MT>3cNYL*XC^!#rL_y zz6+XLV79Gi4@SywbSR<54xDow%U_>n$q~ls8EWIElq?RtZ}N?fKEol27$+lN^4;k*{5 z`yO~B-jff6eucJ@y#M-P0CZ2EeL$_s0`jaLcO_fYd0+vW1>M?y)Cj!dNNl|hth1S0 zD5oTZgi9DypzMcqEVYm&NcvLCNS4WWt%qa*$k*&`o<^t7phf@!TG=f>3-XvyGv2U8 zhEWPsGAnQKHJem4ZyA%xm_0rPYu;t=ViT&PnUg zPS-?cozWF(*|vsjGbrbC64WeG?PgI8Pnc2n@Z>~JA0Eqz{tE$lt1o_Yb1r)bT?1M; z`sA);sA`O7iAr+G=uAy?U5~`ZbQlO?@psneomkBx2l%4|Y?miVGdUmFM&ZrbD010D zxDHAjFwoVQAyWI_**-GQ4&`k3I=iF0H`WWDDr#`=_LuCo!cwGQ1F=Hx_QTzw;NFBKD7qji%Wcyw_%O$oJ+9Jgh(mDn58TdUCXeb19ubg>)M2c7vM6t2wDTI z;x2vU{(3w!)uz)&uvfBY4I=vwlsoc0Q9ucqV*B1%3k_Yd#uWuiqI!ESD;|@Hl~H+k z#jn6Z@zpE>(^>KY0zKrYs@Y7TjbK@4{9N@(R)DAS@;fH0n6XeGw|faI z#p0AWwBvzLHX+`dH{@1otP{OOkqT1`hG_%apD*TCGJ7<5is&hVylNkteR&Xr&9;j92?4UA>+1WI9{|&A1adf49Pw*bjQx(8zVnx4SKp#RP2f|sBltbn+ z(PX44)b7E_GqX5V7++rBD5P<$0{TJ)9%|a6k?d=ky;*UiT5*_Bg|@k-q~WEmh}QVB zVqs3KPMHiYHVy^!Bzih{GJ{cX26JOaPn|^Y#-ZYHvD}}u8#eRU-y2`;6s>#0GA!Jt z2}?OdYqf|&d58-G!zYal=IJmJJpxmS2Bm`qj6)K*cR&ib0$O41=ROzctq5TOD>(|v zCwCP5&@iddUn}f_&Nh|J_soT)Wl&iV%O)alFVeR5ncs28>SLp2d?{uKhDOu^4?MN; zq>d8NrlJrFShj{m*TYXgN`jQaYk-#uL9BvCDEtkxWKK%9(9Kec^Xmx>4x?oim?$Czp|a9| znuwI1h|_)8Mk}un&VEz2f2&~WN+8VGBbaL_g3F6byO$I+JyQa}o#zWvhFE;GYJ-4o z{TekHq60#u?>z^ThQRqrxVKb)rY1l_7O&zIS62XG}5e^>SW% z65>7pr|f%cIDn#J;806bSvsLS zWc#I9cqw0M8{<&x3=wF^qu2ZxOWDzYLyY>C9cJ*m8gj9;DOV#Y!mID`YYUgrf&(U; zjB9K%wgyI~rp}>oJ+v%rau1`h_YcAJ?-J#8WfWN0H1Nbji{kxlSP@?HL+3dP*1J0) zv1HLi*ABArv<+IAaZPaj9$wC9)^+bxG;S<0ywxBjSQvnnR9L9Htg&_7<6U*Jcv!k} zG^!`zhpkDa@KOlaM%=P-%LijdK_?36+_|DNt9eG@Z1)XiKc~P>#R6xNM@QnHE49`P ziALO;urAJ^AP&xhM>B-a-@cObL9M;^#F92#7zDeB^fin*qe#-y8pXQu2{$O#kC?Mp zC=;1ve%)K+=&Vr$qg!=hpt$cLX2I7MNVC?gMRBD>#)>pvpS&rok*>8l9S5_jxPL%< zqbD-z`P_M#0+Zsk%%vMAE*O}8zBj9}1iHt%cN^d1*n40`jes<7txgXVIyrkHA>_YG0Efv%HTxY?`QB`?Y^W=upzXX(|K0;Vy( z^WX*fq44oL_7(1R*4BovF()7t>`>v3wBnhy6YFLZ8PISahM+CqV4sPC-cCVrfmF4Ukn325 zt9?IRgP~@0)r`f#k{)70qWM5`sL|{QiQMOS*GX$!U>?ZzvM}82rF36~a9ZDpSY!lI zh9c}Oik~LI)PjFY&5n#ZB~c%m2^lW%M;6t;H%@$83M;^ZYPcvFW60J5Cv|SL!#z5X zw0am>QnuDM$ezp*>Grl+-I{1C-c3ajcz$8Th!@?7lV1~PaFFNBR_w@awH|zyFcc8k z6iVQ&c^a>{K(PBY!@ydJ4OTiu-~WwT(0i;a8#?7a-H(daU1ZrB$` zM@JGV@0mfgT(WIrj0I13g9VS)OKw``rx^rfTL4xhMXl$ShB8F4C=-q?6IW1s9M`=; zY2IZ00xijBU^!1PHNY-fADwzpCQG`pMX0=E>zZ`O&Pfc6&diWvc5npwvba&#PXxO- z9Ab1%E7;$vm#@#9o|+@66-UK%r`cea;_r%7=1o|Q}C?q@!#dybObYL|%x zEd{2PkOdO^+17i?#;FqKz9c#H&N{e9Xi$n)@5e_c#0=Nl2f84qs%g+&c#yN<1+ls7 zn+v(TI@6zrtlhxQ)2&%*P}n<;WZ0*msE zA2CKNQj|O}FxsMyH6S<@rq;42m+uN--%b8W(PBug?3S1!2Ud$ ze9jjz(-ghUMyDD|@h<$!MZ~Mhg~ghjA>q)^=)x*AyEN6>3h$7G?cGh2)}R6_Rx`4s z61tLf9tn@etYPg3d{O4EF-z23(WcN6Y30cnUtvNW7`uPIR`)Wi8JT-<WZ4FyR=ws>6n1P;OSfj75;A(gN7zb-e;1DNzK%1u`-}|Kdm$ADO^&Q z3e661LF|gQso8n)i1cVe0$o?TZp6XzJy#e3j>nt#)G$e9>aCeKITG$;K$S@yI)<(- zR&?WKM{(gHn*fF30TS8@Dd9sd_Go~f5=i6T8MYVkl~&?uR-rXCFV$Z9t; zhOx{`?seo$uwq=m7r>@dDs;Hf4KNhx!uw{6bvbh-dB(q+g|gH_r{Wnc;CZ`E-mM7U zoZUYy&wlS6bw-c5G;TzgQi+stmI)4vI90C$_si?f=KfN|Ny_mrkGk)ZH{{6gSk5vL z=FNn$6EUt-QKVuePd^(5q{WR=ksH(N;L*K3Ka&TlftDI;yVk_BBv)slC{RYola)X5;=UvM0Y z^mnYNZlcXLZcky%?K4WzrUmaAb8)9DED=IdBx3lL#x;qOhQJUL^aqbJp<%^`%UTy` zoM2A(7q(a~BKKB5d+mn78f8x1Q9m?sAUOwqU`*jyL4DHCa#->zAbfs?CcGH&tUl`k zAzp27bgCS^0M_wf`FwhJ&HWq(BntUc;Pb@Xmh>JwSMmF?Trj` z3qW=bk6Bll*5}7u)ng<>jMk0A4ICG!V)VquYCi{#8bWxw-dtHv=m?fXv7kjJkX~O7 zG(LrEfiX4LF*IZH7*J;H0I&DszH~F`=BeyS2u#f5o)8XLJ@z@Xto3_Qr=qj@n|4tN zK>(;C+Au|&fkME)3+dv9A(;|`0Ts*(eUWpmBHGwR$;zKD`nmC^BR66cdPj{~^)s*4 zZTs4kW5=}XT&!sb5e$fOqC`HZ9(>a|lhC*uw-m^%!9kc8xV^aD>D?d4v2~ zH&}K%EBnxUKht&+_`c7wi1QnB7T#<*qHYkHWI|&?vr2zw^?N(ZM3~lrwaH^#n|L$vXZ*iY^~UMp z@Y~N`d^38rr8LclGeIrhmv3-vTB67~c*D7+o5aas&}k$?A{wa@AH&4AQY~gbG-k2* zVoojaRE2kyZ$>ubZxc7j*bfn16JI>bAS4T#!qw^qvpAHy_sQKQ7W2ziudc;wuBbX z@|$^zKK5^KNhB1e&aPmB3Nm9m<8$xP1Yl=pV~A>Z=2ALKw`WEw-rM8_1vFwRgkxOb z6St-k?${IqDdSfcZ&_j(<3?3I%xSQQjQ;5!Vbc`DAUtDVFjw-qIFi+16ZhziePiqD zXTJ#_dJPi=v zeQFV>cQNBsZpr4;$weGd%Xw3j>oS`^O(Y+Z08XRakFmtz9PzAu`Bj^XX()^YfzV2yQ+;~L`kS6L8o&3Caw_8$OJoaZ*|YWq6uhreIbN$qcOCLf?>l;Sk5+Fdj=M}rqtuH`EZC~Fk>O5 z>V*{RN&GD1y(v33-SFI%QUz=#Z9*R1XSjCanVM2*n{wZKmkNvG(QVd8tP0f>?9!`o zjb;@eseqn8JdtNlPUOkc2S$fN;Tcp4n=LK)mR+3qL~nPuEc1yXD3~B}OS2hTMyoQR zK29u*95YG8RClk~la>Zd7Eq28fr62|01xx^xSgu<%0g!ziM{lVC%H zf-ric8DS{2G+2_D3P%>V-|q+q+^AQ2eS^+33YW~+veKV%vC*|(Fc90i$I>``F}%~# zyfoDSumxlf4Tw-~__K$8L~;(NlVpX{PCdgYzQ zyg_)0yMCzId&%zGVlHh}{>eP4LDv{e5!}<&?amsE=$Hax8B1dcl|H?vfKKD|Abs>KIc2aRR(=^Y#E2S;rVO#JyI7 z6;%h3TxEM@Fi+4KJJV7UF%K9+_wd0ZS#Q>?*-E!$v|`?Qu#JPNS;r@9dGPR|Jbds_ zB4Z361_9l0sm6n1);ABB7&>C#pcw#bwu-eXD)ow|#jkS}b1Ck6ECMsR1t#yYIO8*R zkp0~*2%=l`P%1xoc44GrH>uE)sFhv2)s8CZ;Jd;Klz=;8Jb^j7m1gg)2ZD%L%EmXFjiVu-SA3p>kzs7uHA}2qNSWBR&O)?H&xgpiNhz23uT9MB({W6 zFQe%Lutj#g(L;BBvz4BB-pp%u$izCd9RSxDf_Z^t81pe)h#Ost3e?v(){FB$p@-#s z$Q{nkwP*S;jhj}c438Z9!}rVJJvm2(WMF0TkVp&15YDK~hq3Mav*el2Jbp0w?l5k~fHyqL z7!UST-4A~KIh!>fZB7`E1AH=AdO<0ve0#fBWA%m*O+H>*d0{t3!z+$J<9(t+_vG;t zrevbn2@V3vN)BU4J60U}R91^)a~=Ig%r%&nP4t2)$jsVXlTQ>spUpcjC7LWV zYU=8XNCk2a#I+x47wCuMuEI@%{xWfAU4RTF_$DQKoFh|iB0P!(?eIdItV2kS%3k^X zUp^VOS%>A&`Z#i6;g#-Wp9_;b9ePaVK#%1x$H59p+w{9*27-EK7OiI*2HS#en5AWB z2{^>A1nUjBbUU;qC`D`+yUV%m@eLfuf%lN=z#XKXTGa6#4;{G`?XIK^p#%rT4{qF8 z6PT>^Ff*E#B-@+T0-MPO43709t(Rfe%FFGQ?4A2MYoaWrgK)k`pajBtMiyb?wLH9) zrXAQxv7Ez-WR8{Y_m1Drig(5E#t<~R!8_|nSz}YGz7L(|7J?83zQ`s}h-AApOBJ0% zZg`+aPslKV1nd|Bd7lh5|zgP2&gqs>;wZOEopAGp_ApSH|?}mfJYxE2YQMJ zG+87air?~Hvq=1uh?IlnsOiCgD=Z;0#rO^)v2K;c^Cp0s1IC0I>Qjq66wkyrui8W2 zhcTz@Y>wnMUXfY3+-45feXIhSn7F4gdoFizIRgi);c3nM?cL>}5JzxzXoe@2+K>M~Zl3cjz7wlX*siIKYBg zgFP~4tC9x5N3A&2lZY)^_LCnb!b%9Td1nxVGen|$jJ-Fp7B)Q>3D!(i4&^MkI}6C- z=4wY_NlyBmC1-?^gGURd1S|Kks^pUC-?$u#nvD~yGS<<8eVut;EEj49NAlohc9?Rkq`geRa3f%RgIAQbUM7}pevtVv6@YXOt88#;=cWlPhyN{j}fM*M+e zcQy}e@if)}C@6%XTq-jvm4H3=k#+j9d;*^76y4ixbJ@OZt;DSUjzUhX06B^`P#Ed; zAVZSg6xcB{3zlxt5nQjiK3b6X4W*2}nY;akeEae>*8;VSP!bhug<%2qxzNDmt2gIt zLJTI!<<+Hi4x%*@v;)I7zK%Jelih=23+t zLI52Il8Gh5kcxlb7;fKG^h_<<$(V~(D$@gW|AyREp18!cR@i|g(LF@4!Dvs1ACE|W zB!Hy%8O?5G*A3&iWyoWHt#Fy6L(IL`>u}S7LOFajS7jFhJH=v7@H$!z;`Q{rhJw3$ z6vIOZ5Ak$q->l;((GAzG>s9U;2y~Zsx*jrluT&MACcK*DyY0Y3iqGcvTL`r#wkJGE z49k)+8nL2LMdiCvtTZX3Bci(BtE~#?nRx+ijg3}&@*#pRU^tsjoAH8nO;6b`_PQ=Cz!Hw7qx?_WFKqaAGC(3J{s3peY zLd!)Fw3p{^<@Na`SqLkIZ-##FEXY*6FxQ6%%Diz8r6f~06Dqv4ag0Jr)<8D{yU@|qne)EyV6IA(RxmFB+ zu}HF6FA0G_k$@F+qtD}mXa{$4e9ElYn_IJxzj^Ueo;-P6@OE@N!nLe?>Re7wj-+3q zW!YL4>zvBC^&~Ogqa8MvCsn3Y(O|!K3~0FP6^F_=vjZm-c6_OckLo@f1EbC#{%A&fe_?Up&n6YxUED|H`cH#~_Eka8saBUI zgFpbAn`SB2QcHh&zyozUU=wgYl7EKs+Efv`b%R?PR5Q|Q7V7gSb$K_-py|+$M@gcYsE?&M+&I$TFRF5z;Oy%Vq-2kT=HG-rEpsd zSmHhaRotl}xl$Jyf)?%92;1m&j};?5QUP(K)*2Nosg^qi(M)m9Nr7y=p)Q#@$;xfI z>01T*7&dZM*B%x2 z0DG*~ex@O$A+*KQ8^pNDdt^YWG7`t`nJG$2?#?P0&Ma|=_u+P0e zqthI)YCjwSIGW(FV zHWZ6gJStr@kEd5hpbi2vN8RtR?#t-H{cR+QM@0p?#s%|K-HpDddp z?w<9KDwdz!f-5YK$=FR$^m2ZED`)CT%EKomkQKLDm8vmZ7U01qYbeXSoyI+q#?!2a z+K(7wb)c}=--#;7jmiiIf^FDyrxCq z^J<&Xh2~!1+|Sq<#S%T-h$v^&gMRMCFg}#55@6wM$D)WU@_?JNC5=R-MhHDBFBcxb z`=K7eU2nbLA!}RQsetZADjeXi*qbPp)U)}ltsUlIbPhI~;10$O7RTkY2VUXf8a&aN zvLR&QiCewNBik=s71kJ^SEWl0G935bwX3D_TCR`TwVpzDz9f`l3=Qj9`OViap_&bpL%#J zdXekzzM)Hzq*U)ZFzK;qsENdm85#4zead@g&1bH-Isp?%fpF{)w(W#TQr>QfA;6aJ zx?Jdn$s@xo2s3svq`@Jq=~|_UNo?~;LEc#A82HiC@#TVbM)1_`iS`ti-mYgch0za^ z)0eW*&NybaP`7;*R+-(;WP`d;2)HDt5~g%-%&V9&fkVf6*UFoID=+&UVI}m|G>gr$ z2cgTb$C;s~UvsK1DB4|hi_Tku8PBH)tTyLj8E1zi#&D&@f>P0XjkUL3=&+mt+Bx+@ zNz@=~1dUU@I22hLdsv_+dW}1#Ft3j?OD8~(e%d9*nVJPtKJL_ z-;XR=DiL21p20M2>o(onGGUqcB9F$&Gmj^kL1r|>+9+e`>=>LSj28rh#-7mo7-bEJ zz>5}HV}r!c?O4pplnE$+*7LA0LCa|TOjrW*-So+;G2wB1vy7wT0Ov z6CpIUraN&VQvM5EZwegdz&6wT-gNJ=nj#2^(GvRO&b?6liqeuZxi7MpyIUE z)(nM^y^v58D2dTV<*Q(3aB=&=@j1(847Zj(Vbi+1+c5Ac5<=glR@_rFRaU`mb*^Z# z;ysbh83C}EH}N1xv9!F3TnO~4kj&OJLcCk~w4C{++{CPzAT=Y6Mlx9zkxtw&r~0A_IGL}N}XhQb?=QmNFjfFF6 zbu+}F5Er^`8CMJ4Uynd(tbZ9tDNAG6rEe34JjfKtq&uN;?i)RD*Na(E3=p2PWbugH zwmf{x*@EBoP_3jE3=jx497fb$PK`G&*qg_K1_xw{^kz|_>;R0Jz9UWz!3+okS%1;5 zFdpCvGgB=Y1&=gFPcgRJGyIe63q8ndHtb7GS!XAa#EymL)-!lzok&y@*$Em3w-{Zi zJMI$!yELJtHk18FwnDNZLb$iWhjzA31RAlAJ&I#}HG*iu|{Olq~G&*oyb zR?PUJ!a|Rzl&`Pf$oZFFr~ti|XU{kCbbTZz4<5-}gR6JDQO*>e_{|qDan};gOq+Y4c(T(y1Di3wB3+9uG<}LE} zJ+@%6o+oy|#Q2Oe?;;=_8l7e;OEpSE0E*lXJcR`{&85$7IwTi{C9_M6-5||j&@THu zy9x3Rlu^Iuuu#hVf8Y1`AA8SK*$j>|hx-{kn85#J63i)qvCy=B&%s!*BT?BVfh|TC z44W29Ev0+dBe*t}N_iIOkz!yUK2rJrLy*P=Ns}t0Vd7~pU?-Ezu~d@+O1d~xZXL$R zRSDa^F+XL9dGz;3AIpS_cxK~ciobRW-_h(N9F4pj%~VfBw&~V;5@@Fgf(oP zfop&=)tL_XX}lw+jKUeu8-HD_ccIsDkbD@JgB`m^!Ambt7!SlAI%1TAjf zEk(fd)%PPk8#J}M!PDe@Ed#z_?F&_!Gv`I$ftCns(Oa`&5_%R>+Dmj+BBgC_y#{lS zPSyeMH5PzdE=lV{0PtF&l&`+{LiU%}^1<>{j!uw7_nd}HH*e(gFTasjXIJw4!x`&6 z)7#KRe*Nk~e(~97@<03!|5`r({Fe$t-O{^3BZ3b;_^?2uHg^-Yg&ivHsS^$SegC^3 z>*w}N!o$AYE2a)k_~LeQfKi zD0i}UQ!mVan*`r#reH3Lz^&cJl9-}kd{dyDRPgd5h_b{+F!$9xmZs1YCrLa3xuBbe zx}#s8zfp^&D}3(Vc&qo?mCX(T4Q9s@Ne#KOHAc&sbe4u?FZSpZKN?MrUE|&Ifv~`H z$V4Np42dMYd2wwU9m&O&T#T&-Ool1=A@^>Zz|nHWHwS<;a!1M^%AVn9$Uqn-q7 zSlGReUWHK76t0Ni_4LfzzgFPB?s=P^nAf>Pwzm@&>4Uf7tU7f~=Z>owg z{pj&Sd9D_Cx3G$TP`E2K8j?a=w+g9TUR=o6UwtdT{>@kN=JiX3PQcQckvTJMz#+bM zrkTZE6&i9N1P=bO*DRst zEuEhBV3xndaT^BWMDGh}*%okaIQGFUVveP0XxYxdtXLkY!dVbHutu^C@Bdci{)<Ybc#OrXdXS*)@SVN5ctx=T?KTz>dK>Io_<< zt><`iEKi?4qjheEQ9w7wpWdpK4`>7mV72bJw;m{-jd_Q$M1w;Ef@{5x&C!YOk&Pd5 zD~5D+1@^{`eEZ@X`PFB?lz;rmPt_B8NVuUw_(-mS z!W1+(-}Ghk+dEUL2RX3o!m;%CSu#c7&*MbkPOy*Se#h&66&F@rYfWQG_HW$COx}57uzC%`fR{~J$ELq_I9spe#$qz#I4MvsmdTf;P}-WN zCOz1FhBfYj#=WHER%{a&u)8+QcdYkpSh^`;t3MVjb-QMCBH{IXuSs*rMdo}oW-X&@ zbL%ywaqy80@oKAwL526IudNimD3*3IJUy<`s#H7G*AdoApmp_@NU`1ZR%-%TuQRJ- z;hLT2pz|&t;TG)3Hi*o~TvEvoHmtbN5ScVD@H!h=A((!~xoOhi^J+!P%-O4g)7);e z(2q7prpUzh8_TUCLOZhxaKWC6`DLZIoL$+E)7>aj_CVd=<|*gwowK=5fx~ardcV+l zzf)m);>x@wyo0I6z9OlUb*wvPRt|Y@bI_TE+>eQE#^&mMJbv;>j!qxQVtqoPiq|{t z@l3oH!uE4;p1DmRRR9y>{8yGU#TQT;>u+?XW+Sm+4APqnSB1M&*f)7{YUxLFMh6=eJ3~9 zpQu;%0lDJfSR-apWCqqEj1-}Ob`6~>;hor7Z=E_y{e+Yb1T(flEyW3GF;?r(OX|fT z6`8^XCiuw&aQ=vd^**&KBa6^29g%mffO1nZv8a8+mA;6%TE!t`8W;G}ZW-^pW+7%;hErnO0~DF4#z+R7RBK83|sr4S?65k)-0DI9$i2} zNQjqy9gN?Kpjg`tF6<)rKb7%Hu0f>;@M6uw!Vf_l^v0@`stZWhugq7DS10c=D-P~% zyR6T}doA$VxTTxR1}$_tr(xm2V3~f|-dA(jn>T>WzB_&2jk=w>7xTaf`71$K;x z`V!aC&!UYR@aDY=<{5-A>PjzA0&~fP9%L0pB}1ciSqEtf9Ldf>Z@lVV%!k+Oa3x*m z%&q>$FjZXVc56*bk-UJyR;#0ymZS-0V-ax4#;604SmUD>JCZVIWKHa?vfD~()7U8X z6Y!I`^%~0k{+>7CRO1{d@hPYv2gc1DS$I2nd-)m#WYsHKaNLRYFN8v|VY@4ZLY5{R zk=T(`=-zErklyYXI9#rdRJc7?Nc)(A?@q`4_WYWG#s?>Bt{>niKo!H-sil0Q*7O*N zk$W)%ex51T3Q3_tU|L&8t7p$2$RGdlAIM7A7sP|-&z{MnN2mJv zt^DklpUcJh6?x7i8gOf6o*@JQuTfJ7t+JjzsWeDke*_2rlH;_I*VbGNEw7qVH;q zM^XvPvJQ<*vcgS>H;qS!tw8xMS;vX+K4?uLvuV~%rno9i{2IOV+?3_JD7>8k6P}cW zuspbiA;AZPa54ElmKZ=NgwgA|bRLZKKw8X^&uTRQ4%eLf55EqcAY@-oS09JsHt8Ym z5b$j1x*|C#xYm?O*`X}GM-{&s>{7^LVa$Rht~0omDQ;YZu`m&Kcyz55@wa*FOQl5f zghZmoc)&GbQD>=2&a74AsQ`RHgTHSF!?}Tf0@p@0G|3g(Gd!Ijk9S8InMw==JoA2f zcWV8`{u;*QhLI;8i3KNzY36Cu-1ClXtX3~$ENh4N44xfHit0=i;qF?6>6QN6r~o}y zOZW*{5}>1Pj!tFGbZFxmv*E!Ubi$onyuFq$RfxTM^+vH~A*GG|0QGxrRmgs(!8^3n zI{N+Zv#tuZ;*H|ZU|npzg_rn#1J4+=#a`jP>+4%%UIfI3Io3J7x_YaY>$h_K@l!cE zvKk*x6(>Ggt>vTVpHk5wp$6A_bN;Q&zW7Eh_SbTuaKx2r&e_e32Ir*)^pG+5OBLX+ zUcZ)4KKY0S#jOSf-zr@4<(FT{FMj?DdHeR9W7+Mkq%s1BtbNZq_&dq~VEGRotmXJ< z&0wQ-qhEMwTg!9cS@HNpc#vHRm?2Nk#dI?@MG#iYQVt$rq(*`J$_B|3VaBg_A=Uf8 zgEu^VKXg!^%knPxATq_KeFwTjP`}^ymj$z?_tj3|jg;OGZ^XFY!I9q?pU4!xz#|eJ zqRwq)n|Mv)#sZcIyzE$iyDc>-P@s+XoUL_E`B$9I=9H~CfUFYMTHlZ%AbwXq;WdyZ z7I^o)*>n{r!8t8cnGau|{(oa~!xBAm#f}5Eir`#W36ZfFo=7_hL`kYyVr5=qzKXY! zi*=eNYk?uYx;&S>>Ii?pg1fo9rd4T*H5CX481za7_(~7>LMN;jOUGt`9*#K`*aeSi z{p~hQG8w9lu(@#V9V+o2f5c_={u>m!$9&9H z7~RSj8lW4;*Lq)S2|oQ;o_+8sv+&ya%yXg45+sQR-R4y-zJ7Bnzxm=PYK4n@|Mx^z zt^^k9DLi}pSOxdIB*66hUccu;-slgy#8_<(TkTdSex(-Yqf?~BAFgp?R7jq` zdLf_bj6x`*IMLDZigAL~MuU+EBKBS@L@nWS#j;<$K9euM{)RaB$?=hX?~)mSUuj_P z7oYt?{^qa$R(|}GnSAu&bB^KW=1R`rp2?XC?N={fu~RrKY#az{y=4j*-qPlD!IoqQ z8XjpJ<5UBZ&p-G;9zTA-dk+~?}VTYXU0YbBFz_ zyo@2Qorm&XaZIyu?2C*GsX;{wlw#yoL0ql%!@sQt^ysdBRS>*HPA=@cc#OPXAiw(^ zhYFyyGn$O2lpmE;>K23m3Cp=!;HfOc;J1|no2Tb77>4KqAOPLy_`*%vHr_ihu*6)2 zcUdPXz1!l@n*2c&M$-% zzs)aRD(_9!n2?&J>XFb~7kT~mtqk*qmgTV9o0l|8G6kUVIj|9qV7;*j(@3n;42opG zI}3p|CuWuz7KQswP+L2!aZ++r-ti=@$e0;6_Bktnp8w4zt1C+9FUc6>4ktdH%M7?=>Im_inUcI@H ztU{P2S$%2N>$!aQJ0J1B@g0rtr_%?g@}2K~M_!*P^sw6-uUfJ8nF_!Uo;{I&`7i!d zh2OC})Sz8z?c71&UR_+s`I}elq=MJx`rRLV_<>sZYwkJl+yQ@FU0$n2|5kpk7VzKw z-H+w7U;SDxE^g&gmHld&2vdCX%`5rr7r*9v;61EXGr~UX5JNB4_7$9*)1w7npD$JU ztI}A(I;MxGIP-eRY{X*?Mk0;>@gwy-jvuhhGpiz|sfd{%0tRt7-_#+6#w}X2*pd{6 z!u$G9OX7Qq1W+7uu2rXpd zkq|DqK~jQ;qIkGn=#EXXEE{60-bSk*i+5wnz?mFW{@HKUJsICy5Ei*KzIDo1@&=-) zWdJK&5C2wO=yOqlv6u^bq>%R{h2fjIVWMKid(sfpvJA6T|JPU-DTi1n{Y-@@ z@Z`sjKadYTdaeR`V^B*o$W8-auT?;g>2KBhxM6VZ>Uw8Z_Grb{zWnl~{F^`fkMha) zK9>K*|LmWs$1-D*$4tZW;gjN~1#S+M_+NQU>IX7*YIGz%|5p&|Qm zu{73^%ZsU83AxdU7eFV@|O+l-bbl{B^?63xis<81^fJLArGwu9|y3tDz z(hDpONIszpf`_$y*?VqaJGF7y$l0h^q`JaK zis4$u85FRU8YP3M74PJ&fxx1uK&RUo-3=IF+xcO!c^;;grwii13bD&rQ(}xFJ{2yT z9?x=?_!FcKQV_IIRkVa^dW>=1mLq*oKOMjt=jpMXdpST{!- zyA*@_D%@wrVi-LZL5`5ut7hT}m@FzlP#~Y>UpuSWvDMfA>aTt&8x7?B(I214M%{hX z{-C3x0=io-D@x@kyaNo*b|ILr&hkx}K^7S`gX%Oy6F3w;9eRlyk2w8S)R1B_E`r#tZa)aJjVl?k}H<5&|`e#`|SP02e0qOOLXuaCT?bm+7;|^7Hs5t z=z}{>idz$yXL?5w1Rgn-vW;?YKBbf*olL4k7Zsb`2$l(hVp~)N)JXJfZ8alY|Jgj} zdtO$>pLn&#-#A7lW42&iGg?vlY~U{yN%l_US?XqGf(IjZ-bz1vQd;77x0RmoN0a8({fI z_y)Bkfw}G(Yy({I?AcQlq<^9~^l$W>Em)b(avI?B@8#K(Bem%N054I{LU+IV_O<-g zU;edx_2n1xgYSN<?ge*L+;c=b}h_mL{D zk5v$&Nr0~Z-QN42-Y8c5wfy`ae*z(Vi+(Gi02Yc`Wb(g_9U%!1h~6~Yj@EUqZ7NsjoIl?%_awwe54V(l} zXeEnyKOt{A*_Kb|d%(s0;Glgxu`9xT$e{{Q8-x{rN#!ub{S^j+zm`IZh`B87#D$H= zG)bp41NE?PMPV>Qk{m{E-VO`ThY2rfr z-i5s})aYw&la?n+Rf_vAQW*{Sx9@ixQ`6P@&4IgELQGWv zp*)%){QqQDwikYCO9eI$BDx^Al_W=8u(F*>RL^Vt&ZnNExir+ zwkqf%pqHJViOVc>Jx}!Yg;=cxs|#c`GAMLA^E60d^SxAK8`+GBN#cn(1QBpi?4PMI zG2Oegf*XgJn8k+s=!nVTx+@(A@LMJtC2ytFb)`dz;n=3+P^SWq!O8~_TH=;b=xKBO zNZtR(%&Nm0fq#6n|5k2?E5&S|$;s)4Snu5Ts(SD$0M)(!`fK^gkA5t_`SOMQm;c4@ z884)-v`M>?&<>KvYwPHVz zk3aoH-EnJrdbdYV@LcioXMzL{BRQJ&_%j!@}fG(2QcE<+91RQN}EX=Q1A%%ItzTmkpgt z?PVJP4(h<#2mvL;fev980(07yDo@Qcuwqki9|vasNv&bw0oCMPY@oPUIDIsMR;;;f zoovQj6H2Dzu8@fwQWBE|4Gz}R*ZOXE%LB1IKBc9>x*(EEydc&_VrJYUvw9zvID#4o zbJjc-hXtG|(K>wKf{}1RW5WH>2uj_cYOYLf9Lz^MjtUL;7vQo|K{Ys1|2}& zTwlpw{_3YPs@uFl5J$fU#`|0a;nT&D{K>-)CB1xY2O2%@&{9f;H5DP|6?J;u@Cac$ zRbZB`yf@3A6v=3cde}&I8YFI~9^iyJ2t|ruAi85?t`J0`wag7=NhdhaaHY8qS!a6h zbJM6`y=Ce$uCvIk3ZPSY{?RAIjTKs#zxvTX$dCT+M=a9w_17=tr$76-{NC^Uj#`7A z{O|tj|E>II|MHJb8R~Gr#7osXYDQiG2V2A1Wl#Fl+F4fA9C?=b!yr z@!@ae*S~q8mgEt=m8*+O#gNbC{NlB|Qfv5&-+V2f|LP0*`@jD?dGYO+D)1GPzfvXR zy&~cL%)#bZfDf%>0b2xK0p>xi@y%w*N^%RmPgtnfO?dvXV$vrnq)~}(r4Zemr9oR} z172VCTz`~GJwm~LeT^j^8q0iykcL--v9L)oz#s1{9e`W`UWRyp!Ub4-dKtIw>x&Wdr7eAV>(35D3YGT8#&w z@`Un3I@wUagRZTQEgq$|gx|=tqMcE=oVw&ZtLP|!pbcyHI(Qm%w`L+lr@@|K7$%TJ zs`npme6IIn1iNM(I?Tvi#lV8Zu;|KCV zyON9BOX&c6oUF}@(=~sr*W2j*?A$tL1{{(a?yfjSD8?1)Y)~OhgMf$oqb-?(b*~Lx z`@C&xeV2&G6c}x??$+PXD&&DJKq_84SeaQFi`9${B~WVUiZuq@=IhudxYQ?VIks~4 z=2GwV1FM69u_IWg*5b#XK4(A}_$XKkKl|xV<%8$X*p${Vc4K_Z+Grwhtit&_ic=pI z9`$mjisQugBRq0;JW&~hH0dX*G|$e?sZ1yeb#8C>Nq+i^FXYF+_?2#-|6HCuKGyr_ zRS4g*HpP#B{Ew7`?^*Xmp^ z)F{{-FV#YxlhTGD;)bk=HF@vAir0GI8-*$Wm$3Bku%m|rui?RiQ(DOFO!ozAQY+-3 z7IZsj&lg(GsHcH_$+(aUXzV!#-cf3{GXc$>jH#XMi;g)Bop%bNaqArVA~WRBL+80q zQW|Mb5rlYjSC=|vtrgL@3K4G>LHvWgf@ECtLTZBO@lbo;7&Po zQ>$0*!y9%_MF34+A7yHx$NU@yLZ{DL+ItK;f@4yx)-<`cyF}(S$N|oYQjVw%ZHWs} z``Uy;D6r|h<%vRzdkV{&2A;1)cG{fFSwc?0>|jNY=-6JAq~Al9Qey-^;d$Wj!d(Q; ziz;ZXTc6MYERLhsMYXcu`~L5#0D0~QVkE&IvkDF=gbC_oAfxN$tJivvW@@cn$k%E~ zzP`JbtOxS!o3G`=4?mQ(S~4%*yq0mT*HEGVXtj|~)xF;|GX`t+vQ-aYL5uWycTEfE z2I;%7q;!vT`u(TJCpFn;sJ^aYGRUJ)F%>o z#&qb7+KJ0W8RNSa8XQy!EjMUVdU>U5;~?&kkbbzq+@>j?OXZmSD(p$`imc`<^CJ_?#CY}bfUq>Zw*ua`DZ_u zzx&(&Wb?DXCAeXYw5(>!?VWW^KY<`dnNd{YM{N+@Z%7Y6J=qXPhHzf3AfPwgA8j)y z6v6DgS<564RmZwtZx}ZLHyMKaMAubNuR|3N%6xY79fdCNd&V_pR!@XAcK&6faciw9r3GRnnZ;eAn8{fXMSz50sKR?{ zK}NO|SqdI?AH7pgE|7+e#_bmhk%Verq_?}s7h%vd6SR5GqDpZ{yxoa z`Y$c-aV(40GLx_-&rpG+pqJr(8h68MmRk%hGChIwH(pphtk%@jgpv5ZVpYdQVl5kQ z1J+uGT`JC*k26~q90EM3Y&Pt7)=apmY?`2B2EEHRVxj;5w-_8&ST?A60i6h}@Pm&& zk`F$7u9ne>9;yZR+oszv^XldXi31lb(+I(W!}0us4>=D=cG&AA{qps<^0ph&7dXI>B9#aP~5BQ`-JZ7l?wSwR6A=L?x(Z! zw>(7X5op|UkD*K~9qc_+yN)#7l9V*v6R}UixN+gmy`lfky@vGQ^>4blbt8$+KUiH9 z!*9LWDlUP&uv}rS@2q!UBP@)6b#={RK2fQWB?NS6o5wTReg9J`umAYxKa^_~>U;WU zA)t+dczXOyo;-e{pSLsp^5t9k5C7rsTmQnzTKOvGnrr@k2s6YcMC0)!0D#HiR@%#9>L3(K7Zt z^J)f2Qplr6rAM%ND8SVtm?71C<#kmskHFTKR&bwCY-1hY^%bl~=k!RF=N%_iFlFK; zwUSC~YuY7+SDASGVa+hEVz}8otNOkLeRXA6AJbk3_T6IP5Iux*U5FdS^{$XkDFZ1Y zZ8Vu|n@J%hJHZi9Df#>^1d`kf9GOk63Z!8qTEg19cL3u3wFTD{L#-}mRDX(YD3Wu@ z!a^|>6r_Qx$7*p->yl}Z@ZR?Yyb+MVZ+jHTfG|xxlvXCPIY_#Rg)9Pgte9_{>1koO zcOi|D)<1$uv(EaN6(O5^UR)SLkadn{HgTP>o-_vK$8STE+{f7(?*HY@4YSQK2k3%f+L-T9(pDG61QS0WDez4#rOB|lXN`ic z81MEs8r<4z%-~XXcZoHmyCzeqz>;lMuAC^2{agj^V;v*X?*XwuFuu7tmn#i^&O5Lz zj@5!*Q>X(@Lq)lx^%46?qOFyRbP8Qi-Po*F?;C~yi|_0DApp^U*`nS-CW&T7?0AlP zAz)ir%>@}iq0@QpFa{3+_wF?TfIG31IB_Upk+|K39%+LLc~G2RPFcXY{@}DaPuZ$#?PY1T1TtN@Jk^)vb|Lx zT{Se?wc}9>QOB3sA&<_@4uBUy%o_{Vh2#m>RPN!pUi*WQRjYRajB@M^KR01w6e|`M zf)yvh2$bjd1gae6joIZG@mhe`CPIK96)cySC8|l>omj^4hvce%fJHJ$= zpK1Mk=j4g};iuo15A|~}xz~EHYbL^E_bmLT+~Y!_s>SIeNhiHL7E9&<&-PlaQb0P_ z8VrMlo0f~RzR?sEoixf}^Q4l1FmmaQnZ-KUxbRL^g)aM?wXJ280a|2tkj_@Y3h)f9 zv!39}y`9B&l!H|7lLET2Al zs95wH{W-&oP>`-*>4J8snDf!`S{4df&Dk^;bFmZF5(5m1ps$W&vFvCO?||WN5f@Nz zV_{VY-nAxb(V_!n>%`8xh1cm?N zzx>bD@@o`BekI?&`jXxlgx2@I`vX0+kJMfMrTpgCU(gjlRs}Fip5=zASHchs6v! z#~#(nQ-cI`CQwKSFbTSEqeu>+9YRXfLJBi9-tSMC2^gN>-s?t(7ugR^bj*=%uh5%X zoy<_2%^fPS03-10?Ojw56lPCGmBCgl180DOX4iT>yXx-$@gM!ZJbC^DwT?U9^YiCV z*eLkwYA^rrv(My*Km2nB_^vb<_w9>UJe#jxzL9_Y$Dhe-U6a4~;a|zO-@Kx-|K{tj zPyGCZ64q~a0z@rC8EDD4Pu?EhW zi89z74TMtLYFCnr3gH)PbPM{u-}6BXL6TG)saz=DNGWifz(MnLi!&!k+ch25a% z`Me=MO*jHUzivT6oR*1oGtdxt)>`6;c-AaA+U#JSNv|_DhLv>flE)a_80v^G&x_C= za|sGqo>%s!7p<2E@HhpJ{BMCR-evntJ>@)!8RPh>82tQAlP7>O{p zUEd9|72)laltWEp9AGBap!{QRoiL&ul*vVJL!V5@SlLd`2}||6W8&=Gh6SANE4~A5 zH^rHzuf>?_?@|;_)r}K)g*Q*6-50MZ2a|_8Nx_HP(#_d(?O1$gu+-=XTDfJ&0{2pD zpztdPr#v=ofuUkUhJbF{v24OJ<_Y{X^d|IDnZLnmRb=BZ=K-}DI_{H?6=VMA|MH*9 zKlzhClCNKWrP$=JSR@_mvN_%8>z{D!zxma#<-zGgdGyczsRj%mu;O7FObOni?UX9u zr0*YfpMLvh)L_)tG9MKVQETm?!X0Us<$=1gOP$9LpFCsA?Trf6q1!PM4^s`kI z|I`2Zzmb3Z$v?=Gr%&Wx{eS*D`TVn=((?aC1FQe=;~#7A^@W^Yd?P>p@qaS!O1~TN z0*$Nby{}cd*?v7nX5A9maIGa^Ao)Xu@sU1HI;f5bK|EB2ix>#bWI#q_o`EQ4#Y|7^XT330-2?XCc8QoWta8AAoeM}d4j{I^Vb>cZ$c$e0 zAi5K=qUPw_@{mQAy<|r=FlbLM;a+#L0hLa`s>!halDh3#^2)x6U<)@=eATn<(<cST~NDOP#RbIp=!)=|plY?)t<1WD@sr0CPZ?Pou@clhe&LZBMTw}M6 z=b{{G9~NMaDt5_T>4Dr}3!<7*vJ_zx&coinA*E7+HF(t}z|nZ^j_g(Le7@rWZv}^@ z_iop$r00R3fgM6Rx~C9q|LmXtsr-w7`6moi{o~JmBbP#zQ+XkO{Z~JffB$FyMn3!O7u-u{uU^Uz&tJ(8|Kp!|*OZ|KH*1cY9 zvwrOGT+g$Q&%!cgsBd_eXqfD{5R46A%ei#mP{Q<>p_i`hEE@t#}P+!`*;IxJz zW8dqwRvK(J4v|&5Lp*9krtd$(tQlop9&B2*Sr3lqD7~D)sxE>Tq z^Zk>gLEe{#^KN|M@6|*C42IE0~D&LWvT!?G^R8`nTzBKtL}v?p4-hW zmCx z;$J7T(xwX+QU73#G%0w(CP;-=^hiN1IoxK``gs_N;5H%Lda6C-%t(j;Zr|8gK_bJT z4WlMS$T`Wx$N*D$QKWboy{dB+4nJc` zE;y#hKwF{Bk6L9nS9kh60(>9J)2C0FS_`WV9N2GPek*M_O`fnZBH*ig6Jl#zA}L`d zpFTWhAZ^jj*?pq*HAGr?KU((VaD6Gqvr{X+lv|^6I(K=Rg!I10fv3a(v(4qnsg;X7 z*Fff5g*|}#vkYZZ_etw1z5E`L!eg$pnP~{cGlQ=ktuaqSk9>mG5^FtPF_5wdKJ(D; z$Qyq7;)VR}fB*lJv&;XhWOe^{is8S}z~RdmU+RT-^e~|u@cAYii)J}XEU>@!niI{U z<-fpeAvjU@0*ndt@ayO(4GK}5FfIUE8k99M2N&cDTU?3-o^&6fM#h;MYyHiocQJ3h zW=KzY0^<*!IU2iSF9FiQxfkEZZD%o)gqkE{E)8}KUbV6ZIHTZL144luXx)OfGmgDE zW9&&cl~wl3PJPSX%yx9+O@fhD^B+d3@^G?T2j{(UV{cj(fa{yHyaxw35YiJqK!J4+ zhz|bfLXsQJHkH8K=)nlK0-Cq9at+FC{6_r3P(wOV%iB4Fe|wGG_IDS=qQqS`Yg@l% z@DcS^Q7+N)(8X)-&S_O+v(DyoheJYeTSX`ca&ksz-ej?Ko1o+|K}}AyMOMQKwcy#T zEWp9xV~vBcz!4F34*_W`jl&GW_FH;e=t?1pUaLzvP202coUo!C$9-BHWpmm zx@`gzH+ZJ?04I6t8Vq73B)gDlVQ-Ue)HkouAk|C297TV|!crNE-7ZnQ2iDLSb-cZf zb1+HR7HAv_ZL%Q+E%ET*++E4{e(Vp8c>V=&|o@FTWsZc&x>xt`{7<*YLWblj$4zCsV*z5SwwK^W8 zyOEdPke-^o`X6AL?3r;CDl{@WQ!Lp^5|AL%81^ zlt@K3pRPNE`Sr~uTUEi6z?>Ybr?T>1eZ*z^ods!ilIGr-XQ$(7yeqgkj?DF!T$xqb zJWg@;1>{O@=JecHdt0pJZWRg>;hOV-@GRYsiX@rDt3(ckbV}uY_aV??#7!RMj5;PA zFL&00%EWstoZ zp6z;2eG4u#Huj}%KJl@H1y5_60(wDh3r&r`folgm5}%V#RG*--IlA*n|?W4Z`b~X*|iUl;Uk!pexg}O3AE)H)pS8 zbG%TT_DIeyUIA&PLVf=1`)rQ{*x|wHLfu&uT7SYdxm?{%FHnR^ zZQ0A>5?^mksN$9(w2e2i3QO8a?!ug*9`^*tl#bJsDkU7j0$|6;hvUk zWs04fAZ*{N0`qyg%12-m??q}2iho>S2v1Rw7!V|4U z!Wu%V2AQ!yUQQYf_N7WDc0p!1U3#VH10U8Z6O?QLic0{W#ZRN ze9;4W*HdF6fB*{7EeQ0ePjI&*We+&^nsoABPhb1)|0{2+R_s zNj6aUSto>w7nSC+B9p*kEtC@pFYm>X;&b_4TCW^x)#)QBeh}83Z!&{ihLYjONIl(J z*U&Ob)Eq8h#^kNLa_2(S@W7@dj@0`IYr1JF9dH-j$DKlCSyEo)#Rc<3GZ)R?xRruG zp&STz<*f#o-m2x)$<^(xeD%#2#1wHYq~}7IeEZ^!TGfx`gXd3qEhuL|D5%VagK9Mn zjNxJkkYnSpkQD3K)BU#t1)Oq^BhtDNAyR_K(V4|_RB5>)GH;1Md2&m}F31O2mebO@ zN&csTh{fX8-%)&>ia__#t8~nF2#b*~}RQ^okG!3NalY z9c!SiBQA@xgW#MrR_hwx?219ZhMoRm2uczDxODZ`;cE392^wcLmXZM4J zQ_njDbrbu=WpB49b7STjCtv|F{%a8f*4A zO*nxYR}x4(_y~b*>E=DH?wjiyt7Md2;N)b95l#LS)Vw8iGtZZ9nwB*3F8@l(BM(5Jvb6!;5jR~{Ly@H)Y*-h^_USJ!y z_F*~aoqYcJFZ4h!S)>Q!1T~EZomp6OTFLl|2m1W5GYjM6P;(IszZPRGFq~*zgf{3De!G5 zl+;-;o%Av`5S;maw|s9$YADWeW?j;mdav`9bqld_4B$SaS?^55jQ|=@C_n{eD{&^X zl?QNU1kd>0TM6S4^E_V|aR5paxONqEwhvf~hkI~lYdy1C7^KUg3SbI8dF%xz0yq?x z+`}aU2J7y*0%0YaaXJ*inB3BDr?96?V2GT(wC}xg%oDiuKnBPmOe*OxsAz^+{cJQ3 z>9*(+j38UnRg+up?Z@dR%@aZ7WNj-&Idapm9SUrgJuHczX#U%ZB)Q`Z7R%5(7{U;;y?}it##4x4j3r{fnM#6Fijp0)*%9q z+~O`=F-Ng1Oa_S7FuCIA$*t(vBoQqZw}{7yg%H=8cF{Qqf+mAiOsF=jqWASzU&(fN zu9n|hvJyW0=u>&7LBF?W7lf^lAaSj8{ipx@PbsMOD1q7U*zVq#Gy`K3uo#h0(XnH5 zZ$+~Lwm~uiqVCxs4IF(~Vd$ARcm64ri$e+c56`pr;4qr7LGs5K?3R46mZQ_v%)+v| zC+2y1psH$a5t+KhW+fghl)mTjlc(HMulC<^?qSIyMV?Fza(c6^yN+Yy^fWxs?YTi4 zq|O_tvf<3k@OUbgjvg1vbs~Z~dY2lccPDfqS?ZZnA&UmC4<0-vKFq!0gX}yxqVqDD z^in)a4(HS==d}{JYU6X67=PIFj36-yyog~xaIWU_71RE4_F*kAn2pyMcGMbIeDpMR z#GAn4!nKjXY}|2pg$iTb48-zLQ4R_n`vBL%diKp-F{oH0D2Y?rj6h&@>!DmN!Oi2D z!U-J50(06p65~HC%mqTxn3zm6c$+*HRy2IJ%ta*2MS@U?ONbn>JmQQ5o*X-dPv;4? z?eCdNkv#c3yk(~AWAmg21w#-`bz(VqoD5XJy6P>rz4bi2bnmK;vqcdfcD>m3JiHjv z%)1kyP6pG-Czy>{Xm!AJuXD?VHnZQfS{~7Z?TA4H2<36eZgKbQtN=O>6A3P_Xlb8o zU#c)xoy3Z(>o=}sl7}R`b-GNQ`54HhwU+~}L_;sdmvo=uT z9O+&aS(B}dC)-{@{y08Al-ecPm;nb$*ZcS(A{^dBTfjf~mG>dgdO!f<^r&Duz5G;CMM z<`WuVSRLm)HMU+DJB+!0KhO~4euW^(EvA+HNQ5z#$GKmFf%_0Wtqiv#fnR`)PV!a*6hh`RK7DiL@dauxFz`CtY zvw4YZbH#h@-Qo=hFW|1ANCq6(dJT?4L0j$EbReiBpjiHvLs;Yfqrz;}y6zAaW;RXR zGaK#tN}&V|PCyXscegxD^ZkrCV&mGy0Cb144Gt{=%4#kTj^TR7Ty8vULt)#a zU{4Sz6gpX)C~nO`Gpl#aNU_TEz>aJa0k$B1eY9rH+G`#A`eM#t;@u9G-hy}*s(sy{ z-hx_d*Lu${flbbW=V(k3SlpIWV{8)Obx1EgR_u=fi>~vQ_cK~{#-^y2zql|Pr*2DF zBJL_NJs!BR4BloaNv&fdZoOEy5wr~AfnxFXkL7v*xPqu4t0AebJxMXX&fVG<}j8OcaeqkpMv>018v1(dg=$vvQ8{jdyfEM|-WckKg+;i;U{% zh>UmNeSY1~*=O&y*IFBgCl@?1-6#cPDUm1Kq-e@z8fj^B=zvBR0^|In1=a+rnJW&_ zJXsvu!m}xmn@~OBx^U1gju-ay;UgXxTk>N2dqEBx6Q)J0&6~I%Eg>JyWF*&CmaLEp zqkBJu5)!rq6}F%^Gu99?B+#ifvV#B5`8SP=F7EGpY>r!z=mVR0Kt4=Hr+57 zRHMTRpVg>cr_@*4*8b408J01V#l^tu7!enh0TgjLm=Cz;D^EJeOmbL&PI)<0olT{X zCI&OYSwrBfVbv?6uwK1K{c{lexDrkFo#VU`#_6CoZ3yA(&S|m6sVb>&JQ15 z@WECXW$TC0-QDe|6yoOdg?WU)@7?J6T#6O)X?*(B9vun%_+(tJZ zjcAy)PXcfsGMiyoKXbakA@%I-^!Oy2iM_bMY}#~VmMP|sspLlxYb1TI4PqSH3WCiT z)H#gcz}>MPu=Vi4GXSHhX?-pFK3nFc9Pm11pn@+ft#tqd!(gaf=Rr(|s?@YN95pgb z?sqw)<63_m8B{nB#@TsfS#_grzzDbH17=RZlk(MRN13|pQU_54<0Do)R{lG22=sef zV)jgWWuxFaWBs9Dq(-zVoL!Rc;D~BMk1?~32?3nw(CkANOj=$O4v2^!FpPpd>;~(j z{|fAuRk`P$`=~bes)&czl||`IotR;`M-&bLHmf}7=zTOnBUaqXBR+j!actxLJPfAw zgr;)2HXZ9X)Zk}!FEHm^V@)%1xa)IbfZq9rBB8%*>AUgf%^SOU`_j(OkEI#|%OXk{ z8qFjHLj~!vZ57_nd2BfC8)+&>iLv->^l`3} z!Rc4x?+>m3InN=7#p^%#<_Grt-Dmb^fBt9Qn3@q9!ZSHKKI0}kJ-OihR*=Z{$tNFC z%mKgWNfn%w$U@^_7NxHptFmS)CW*#(!5W}=)pJSO*zLwK?JIxp({tj{t$;T>0z;vl zaAS0F2x2}Vzv|b2=g$~xp z&M6N+;?#DK$psEwKSLivtv0aYmT&@>!5-QHq~*eL+AHom|>)-%MK(@c8 zWq@wOm}>)Ux>p8YCi1)hPkKH%((FDSVq#;^TLjtaRsovNekjo_-dCc6*u;L44nmcL zvi6Dzr!f$!u$8Nw?rRs-Vyr**$Ru)MC10xYR|r71VqartMKiR*UgMfcd#=2yj~r=y zzPC0io1?;vc2H^8z+aP@u4|PE$T16S2|wvqx1Kppbb-J$2N@Cdq3o-jS&N5vxR@(8 zcX%S~@k{-`x}a&qU&kdyb1O#_Cq6j{3m+oup%m8kjW_&x$N(7_(FPqND0RB%=F&7l zCo6(96lf1FPC1uMm~3W{2TvOt8F)6lh~eds<3z>R$lvxw2WCk>TnqDSV*HUWS_J0f zlVb*HWZlP+apP+UOzh?l>M8>(!@@zpM)^csJb%{;hxN+HDg`Gs{!%^fu5KL7j^uBWZz)gOKQD`s40XXg~DpaOvq1s_JV zD#^oDA{K7GY{DC1+yirVtchF4yn7r3QKF}SQfk+|Qmo`(k?B^(24Msy-1oW(6qo~_ zvkDP3;{XShro#OPx;<(g-w)Et)D9A;aZm2;Z!?7#oL)4@Ajwye8lW5uD|#N@59lVUq>o~DGyn?Kaltw#QE48^LF;~elFk>UI$rcc_)q%5ox1eZ>(`)hXnXHalU1{%D z@9@1qql!*i{~WyU6g{QDLX0dD1Ue)QfYR^_R7>^|$PSrM;L}kb(Q{qnT6bG{KJ#GR zNuk{N+RLV9I6kAMko$V{!=VoW69*i`K54_Zxepj^2v$&P+Uivn)p0Y1t0t0w<}d@U z%%-AUSlt~{^vg!ZnB6~+Rr%-rLa;sN94{Kb=Mes|dkMk)wb`L8&b^v(kk}5snbzB- z|9Q-DF_^c5S#88w2Ar}`E~$L3-C^Q&sTMj)$JFqu^6Xf+7MP(TsG1RD_8gdWij$|} z*QtzMQ7kx7BJ)T!6GWgO-IJ;|jEkiWUu0Shno9H%-$ORVEIa{P1qqPyPmaLheh}_> zJ^f=*IRnqe_bnar!JthnJ~UXDcN+#PTmz_8$QFmO8PP=(a>~FYXTM3{cs8EeCHTDv z*!p~l9MIJC`)sGt!B%18Qp=H~p{KNrgur1~v)pCo=~)yy>2Yk1J|k_jUtsjksDhqS z3%+O^=1_4J1&QDL-5=P;pMT7sd*P+KGIocH9zM2<2T%M`G_MZd|K`mLzmHpLN;+?L zwx!|xy|qF+2V~_*_e~Hap;6H<16Y(^DDXd7ESL}>$jS#w4ZIxC8>ea$0_)kVr%KWHQw_B2=|p)mVV_7- zO>#8-_EgtA+74Gpf(^{-%^rP&`pid(cM0`oQ<+R@46Z4VfVQbB+`1+ro45OYrcwj^ z!S8#Sw*?}65Rk`z&-q?uqsq+J*~&rwEjp@Db#3H1yYW*TxFKu|8{ZHutVZR{?*G=1 zHBi{l6K^!x5T}bm0mK24T~|M5{Xm?NP0YEg0lK$z0G;SdImLgE?eT_FJ|Z$H<5olo z|KvPo=Iq@DR3J`oH-h(7s!Z9rf9@`+EMu7!ZgDwR%n?2S-VF0>n3z@0;qsNk;#4!` zkXf&2QZ9iF7bhrxYmJ5i-*@d<-=#xGrR*i$_?gq01O&J~;^4zD8pYJ$fc&6nZkHX> z-Kv*FErV%UnZ$3U`BbC~#50*Swd`mQ;cGCmIffV^#!RjwO_6szDWe3YkGuN#$wRyG zfO36v?HTg}es%WV*1@F=u4Z&mn#eZMv{j;R|F6&*Z0 z)LZbivc9#|QiuJm_e1KWh(5?0=17xUU4{`up(p6&0x0 zTj8bd>gtLFbv!IA)>>XbI03YD;tix}*|KBauuBfdXc*II{CT}G6kad@4IF2K<^!li z7)Z(Ty2vnQIQ(dd?z?h@PIY4lBP7*{-n}*0w(4dlo#xdfAI%iMC~j2Te~y>T!4Xa3 z^ET07*@b^@#jJO`HjJ}XdU3CZ8UDCM2N~1we59&sYRw`Z`k;U}#DolH1mW<9(jOVN zg7}&;_WCEF6TlLO+XO~Lt5<>uz zJX6RWFXBz}Ww|y=6$n({1}sF3a>p_CFuVEq^Djs{#AgH>X5JmqXdRxpz<^O=OBK3i zRdIWJZENqmV{RUM3Z4mn=Ud;2#%f1SbP2Hx%+{&=^3U_LU;Km=Ih4Urz2UkhkoWpp zd^~$-M{vGFQ*v=k$Gg?-(ti2#pQxdfFrDQ|C>c9iQo zv0FyW9Zf~{^0eBBVOps}5;Dz~s!ZM@i`F`hgd*z3`U|u;*?T*ILdc1;b@Kk?QaQcT2FQanxya^sf{VYfELgVGsR|KZi_|Mi~*z#2foTQ z5VT&eIgPJt0w&O$>`>HMJ)E-j;R(~mYl%I#g~5B+32M~q1f^iVW8?HbHevcyPHK^cc#%^2{^IA3xme`E52KJ;`S#sb{y}xGKA|N~F1paQ3_PqjF3KI_frHNP;2A1P zVFV`7iKd<0;p*YWCSC3$Xzr(oOfbkGr%}YywE5mcBaG8ki7+1EiMsJaIQ<1l9}JPZ zCH%6l9R_)8I2eg_uN264Yx$FGX%;gHo@WACw0g7guXC zFDikdDpO^48RhN}MV=~xe(Y9rT1)*tJY#>BKm5HP*sIqsyvo|p&tc=&cz@-M5|qmb>JGM&0tcGbcfb8zUbiq$H6UdfD;_e+H24xv{AXS~ zd}5Ehu}FNH8I*58-@NTibVv?KO@cliJUO@bAD^29Z}Nr!^=}fJskNcDeIoc)5zpRd z9NG1Dm&Yn61$%;}dD;(ju!L;2W%k9avqs($Vxq9NZ7gh8Ys0|yL9k!CH)B6O869gY+&adrQeU-4>ZDc(=9@4t@y_lo!y%Lycl>WAt zFRPKSz*oIpRK3jnz?IP%4)mG@R6cVp^|9vh?9l|J%p2<=?sIEmW??O(DG$3=c#hQm zfiPL^b;39J?5uDLrWfr>j5b$Y^BoeeTMj+Ry~Oh zeg)n|rpplfJ%_J!?U$AEwQu>FJ|e2`8o2Es;2*L!^!Lone+DT}1$4mS4lfrTq z%y{a}r!6z8h+Yohk-#i12!HV`Vn zGwla?XQ=yMXxzkcNjad5fN0bw(dQD`XliP*P9g}_Y}&XnF$iP5ys<}qABWF&y3R0s zYUx>Fv4+dom>WM!z+Hp_03|@x$=9}IKB>Vr8G{7&6!|WPrFL^rrl-SvIqeVivM>8V zQQIb|M{x+ptQXdb{LqX)j z-9&{{XG?zVS5)=mdk_2PcSyx+qc@Umk3qAt|4M_JpYiFl_l4Uc$aFV0zgcj?GO)0w zRfCM4s~F{jrQQ0C^^JIRymHL(f_NE%R_j50o_2OJ@hsan*SZll1gp{%bQnzB*oB28 zH%sh^y%Zr)n+W=%^;pMCBL1@cn%50$(e>2 zjT187aD-#L=V@sS3?()k85UVS$HdaYwgMgKe6OJ(!*4v4=`@U{O1W2FD#K_wExoZ5 z4{n13tREP&c?_`xyMjtiG>8BLglCAUDT^$XERuc*{;D|GtsjJF*l_}m|335b8QIy) zn=~-np`w#bp$H_67GjBo!-Ww6RXpM3cKhkLQw4MAnRksv8NOfUDs6?M#RRXIS-mgNKtHv1lE9>8D)2lYpN8oFT6%r( zvuBBVIB&)6sKW z0a{|Ingf@>tW(jD1U4+1J=*2*4V9`Wd$_qL)@vG7+4=p_CvK$qy9Rp?Bw=_YfD z3U<`mw*i|qggkut+9r1tK$M}Qnk|==HR~;dHq=}+Uk9HU%#ZbrWq&Bi|C~aO=?`+k z({HA^ZFrDDAZJj{QBK)jc8U`dUIV#O&N3Cpf)Y%BNx?S2^)^MU2r}sm3)dgS&NHsb zj>@?Ep#fuXYQur1$Yy}~ zE`4*{rdzwdy|u}!S2p|nOX6^#IBDXsxZ0p7&5!2v{l!?QT2_(L1A0^uMF~~LU;C?n z$u6&6@gT(aeevqGS4j)|{&#-hf6lpa5x`!*eaQ`iV9hnh3aIyt`HVjk6f@dba)OT3 zm=7ik24nS1A;2WVFD zTx~oAuZGV`6hxMm78z<5?U7}6>X=xh0Qa@O^0?P3R&2KCJ`>j@kG7}Bh_bRN&7-tZ z6_m~|o|4gW<@b5Dx)m%GKVQ{OrZ9?Ow@Uk%eM#&zl#awDVb)PTAC%5bg$T_8m#$2K zaXCj#p(g%N_Dl~-IgkY=^?Y_5NYHRCoqF?JbNCYbBnaGW=I@5sKQaX?akyfGLVU!5 zxc>alI@!Ob@Xsi%;LUz3Ww4syS&3EC#dElCFcfV8%dLVnvuGPe${ed&7TwGm=x2?A z$D7WRG>4dYkit`>Ok=;vQL#2li|zeL>S2YrQ7N0_J+0SL0val1G-u-Vw(2eM@4*JC zzlzo17NRo5z@meamBYZyr(ud+X>0Vn7%HXBF9tUV3#*MWR|R&S7~Q_&1mTSb=&d(} zmX|kn`{u2cySKdFDLT<}@3i`#QcZC}fEIWoC#p12R##U$GJw97*$Gb-46V&-fjzP0yhuwq~@eJ44BxLZT)o9E>t5|kD0I*Jw;kS{(18XM?92*-r zy7F2r9y&5~0ASmT;(ccqr|aRj5i(_A=W~wl6cu)~Gp+d?#uby!ubDLJLY@ zQ}#hP#{o(KMyirqRS0bnPRY5IMU5p+_8?11zA610c&~9?wjq8}8CyooSbX8=?x(Z)^engjUbIF4#~U8g z@Ck=3KQ|l&1~J^KU0I$9s(~~euje6BVSu<-Y`h1wLp#`JPkU@b9Fh(YPhPKyk-{lI zC7Pc}(VH}4;N@VN;Qf%9uU5>MyYQsm_&sENq1&Z&0j1vWlEzVdwbE?DAE(42oW>;i zwXm*e{S+U{1cf;^)%xy5`k_{p{s zR3I|~E~miMaazH0?SbZIX>UD1U%z-`!}SY72(yKDpd;p5SWm$h8OlA ztQk|&Ibp{3$~rp94Z;J5un^t#q7@OMVFN}m1mv;Xbst%g0wVefXrxggiQf?3_;W>I zhrK5JNN&O4(Jmzng(eU(+LQBB572+zUSM1j>ZneGYJc>5KeC73xC0*;-EzPX6p%ib2){znA*#aZll2EMJ3mT(o>vxyt-WqKnN^ z<<=qht?pNJ&DjrjaQc_D0sB)OHH46r}7rUOzrB7(u0<+KC?w)eV4$ zMit)-DiNB1#G=rle+wFr>$^4ngKKNz$qS&;?ds0^8dEkEcZ@G`nZ)E4*twRd@CBEs z={+(mOce!#v{e{Huu7$5)|;AREM1dpVp&GQ!PpZ5T!~D+*?SKW=SGCZXmzN-z$LnI zY!d+*ry5QTP|9f6dA#rsCgXKvQyF4`tmYl{_ZvYTcb?I`@(g-=^M*J1$REgjvl}^m zEK!n#DtO@2PR2C~&=vzj6MFy%&KiLwEV3hKlYTMm;!v41)-RG@|XLxQTd(DNerKkfVW< z#)@P=PDiD)D2Mv)d?_G*f2rhCaf_# z@_Tn|a_}1%fWR50!8-Zb;+~ST&1z|&SO8q*wFk`E!b?!cgg^WISCp?`dzSp{>0?gM z9zg9viF!Ks_gvXGzvWr;@r;WP5C)5H&Q6r%o>>qwfmU49>ib}+A3duzXU_t6Q&216 zn#Ust4Z0E|x>DuZ@?k~5j*O5jAw2&Z&b%AK6|v&U+CW3aC2XwyOC1KVKY%Ni$iu1F z2pQBfyk3i7#99LH{iCD$j^M36%)k=5H<|NCwjBd@;l}px@iTk#>Lu3*4Y{mBCl*vy z-5adCu}9K$WOm?C!g7Gm5XX_#+ODVpHSWPZ$=eRqY%<9z<9(_A6}&?Fy-3YhD$Y9$ zBQ-O{fmWGIy5yEY7YvU&k8tY&5WyVm4a^EmN20o663m8`lcu$_VI5k7Kjq)uz~GNK z(3YCjS9q=uSfLr&5&)Oh5Cbijv_pVb3;m|)S-&H6XoyWXcx|dIyyO_ZET+adQ#4f> ze0#3}SeawGmtjP8cn}u#L7KAn@~BhT>;13yuO=wXJ^sA!>5qQ>bH~6O#CI%uy&YJ( z9?#W816Bmy>y(2a=L*naFrp5p2a%0m{BBF^2M^%RZ~mQkXwy2`%(L0)Qo$S_j_?96 zMtJ88Y>H-|Jxj_doRDL8jx_y&O0HBhsL=Fx@}|XBnE1^*P8hG`*ph$G>SS;%c1xIq zD#4Q@S;|ux7@#(+)AN_5A4Hh+;l^bumO*vx_&*0=_YUgL? zblSsMs)3Y7Dc>q>4$p1_Jas-Y`hN2o^gobfX>mBt(&8# zs&1df>E;Wg?vxaJv$|!bN(iBw#wN;IyTOUAAgs8+&4?*0K4~qErdh#79->ifsf-W{ zkLzY1oRukCe4iRh`q#35re((<&~?XrKGCN0!|(w;k#D@Rp&~L;Mb0iP0@Sh=9#yYg ze{s)-5%UZN$gnrzF>CKNunvEXST)wJ>Cj;{SE~1ngh~|w=_A3IP{gHxE&6vJ`So2K&+X}n4k17$ zJ%^Hd#y#lp$^PIsY&NtM>+qphZYj1}Q}ZJQh#>+j#THC$L=kMV_}NwVKJ*)HzDa4Q~}c;-oLcv`WS)^h3~=U zr<@xHp_=r*+K_gvhPPy{8D}6`?EOCVqh4SPu*{Uh;4855wn_H2 z@o9&U(!J-9f__>Rwfickn{jII5&5jJ8>NtAW}NujwOJ&8$aPaN7fg18ya^#&mKPC% zbHmbi-kg~T;j$^khRxg*69z>N1F*mii-oJ(zyK>Ltt<@NJBeI~X~hP}(Lk8QG-T%V zgF3$;_uqNBbm_r%mHmYFj3hbzPReH`lP$Fi^}lR}nRDO?&SpD4sAS@Pq-4w{lG6{%V&ntQjHolZrW&&f{F=W-qbAo`+IfNc_42&DFpn~I%BYn;hzjz?Sz#R zn`}AYok52O>0zaiH%`GrJBduP8G8VA_yZbk^yEzeo0yGwa~jz=2mS_uQxfv=-_xLo zvC$LzCxz&V7Z%OqAsRUd&h!r%s$Hqso~aXJp<-iWtzL8Wj!snoQv%uuyjOnQ%D$dF zeNHjc<=absK7A&YyZdI6GGru9TKhZxTlEJ~CY;91lg}mRufZFK|Hd^Ox(5Et@rI-k z^RDziyk{Q}$2z7ISwJ81y$~daJ&K^rWWryIo)iwoQAz3t{GInk?ryF=m;SxioaqQIJ)X&f2j}+q;X|&&9*X6Z?*-U4m>CrXXxr{S(kQ z{*tIoy_In-9ei(xIcUeH=YI1}Ng&^O*$i|RH>bn&t;wtJpHV?O( zf#&TyKmwDPW|4Fa@l~sS#ZVo45>hR%HyLu9cu*WVC+I60m35b01xE{@3A2HS`D zI5y~{qrZfLg*NUm2xg!MNwnl@8O~}kOrhk}o%!F||AU@W370>UxTPhWBkz%+MAyAq z+*%s{y9BQkPlJ9AA)b?G-0s)jFn0KTB+E-ngDt-W$$cJA*IAft_*K_w*aO|?CgA~M zk?A8-2Ap$ybIZ7K#EIh*!V$Z+`ZHVL&}&+rwoQeljMW=V%$CcIZGDKBUn+Xn^F=MGUV|!-Lu!d0F&2{rVxAS~-F; z0(P%CZsZL6!$5gO+h>#;{yk`X>6P>oQkB`r{tN%Yz_ zVcj&d@zM$sT@DW@69%$&t?9{aN~6qJn3!;}NtZ}*!s6X+#TzBm&{kp0MED&(L3l}f zYuftN+Nx=JZAiesp_t^P_*~p{P;>c*KKAbV@BGg9O{@!<)Jxe|$b;UjcC56flexT= z4ITNJ%+HGkf0md|tqs(UB|jD}f^uoKE<|n9qRgbd+4y%nuj-{jid{9QDax7wv6QT9 zM1w~#iJGvIEQ>o!bfV&c;fuk06w1JHfI!m029+Sz+9Vok${H0Maj7%kCt91C&n4Gp zVy?+%G_NWaJ?_QY5RBknMA6gh0>Y^vuffdzgwBUUugM-(vDm=fclh3tV)kY)yp`U` zVjyV1a2Yf1dJxp#!?5>@sB6P2MqLk{$cUBU+t~a<#Z8qc`Z>@cq@$SZGB6=fiH_{H z=TFW7kI4B@)4uyK+^>c2gV#VTHTkZpGD0)mWVB$l zR29QPxoeW`$D$qFzme6k?=97aY$Z(`zV@EkQhbl^QO6ah#~|C1#7)O4-beW{6T4wR z_7nVQ&QV8nrZN$#QxbDv>RC1L>-D6OM7J&M-ePHWS<1jECk(eN^Q~HJ@>-N_qMT7j ze_}PGU`9P`<$8r1*c(fho`HFgPxBT-HaFtDrX7PawkjJJ%zD9yaNNu>r;TTZmp6Cz zxnJKLI5(zlbShAVZYvP@;_y?9 z8#qS>UjsBINUS}$tyaK{2fG1Y?V0DW4r3{nvwQWL$o43&6a7QrCb)|Ot4op>plkz; zNWRiLIT03RTU>@{_54K~;JZg$4whXw$Rnf3(!5+|m^NAJRcl>-* zkX32fD7qi$6I5B&Do_3?6(-orscQwoOAc#DZRm2a4|I@qgq0=^*KO)otoEq6X^ELT zblA%)r0uFxoQAuWaAf3xm(%!-hbBIie>(;b3%PRy_7Y{EE>T8jNX8nk0KlQ_*_Y~- z#jerFDHISsN0C^FiaV z5#4S_OXPvQA|6hFPM{@NEiDQPR=E96!!LHhtU_Sl)#l!=nx%zBG0=fQJZv^Ob7n=! zKF9~Xm|m7b!Mgu*&y!ZwX7!NUhgehZzKmZJF~G>`sGV`H&8&d~Tyy0<4Asq#&o~VO z&QBY^;F)j8qoWwr9)86ZCk42*Qv7L{EF_XCa8vS}+a_>3sidsg2jY(1(~jkf{8a_! z=dr0$Vxd_yi&TQ}bnc-X>y+X2@es)8Z4d`NgUuWqTDC)!(HI4vIO$m2Y8)!yW6!DN z!}qSkxP1T(rcdM;=RP{(gIxU(aF(0G4S~{5jZ<)SRYp#_x}b$gLIR6Sb2`-wH5^b_ zgs3JE3Y8zHny^Vd zu{z+ORPUC^o`L7rCLjVy&5$kd$egRpBdAnlr-ba=>TA;&{F44z!8!~VfKo#Nj+`Mz-8W3SnjB?sH2Xuv}`z=-kJu6iVgJ?O~G-Kj}h zX$wA07Ew6=M1Y=3@Cu> zAyzf68UOwIr8b_mMo-eifNeSr|KDjvUoD#Yz#B`>_~K}Hz9v0Cj&B4ChB(R-_jQ~h6sDvFK1_K{hQz-qmBql6!~F#@+t zn(QDwwEF@2(Zfe}a>4Vo+jTV#0$A$4d;3wZObe;7y%pOi&m)d`o<37e50VwgcGj zS@+5_(H-Qp9zYU&9vp5!AnMmx)N88i%2o}8hvz4xDyg|t{K0vq?Tx`TRDNC#VWA*1 z?WrWf&yW%fn?nw3jRJHunef?;+VwcZAO&Ngqr7<41aBtaDHYJfC@Yi9!(+r z@eG&`x+5F`CDzQp_km~LPmVf=cpP){4B-|TIB0HZ%2U7HDJURoo%`oMc8u79W=AGR zBVkTo+FJC=-7afGKYaAie*B{!6L-hsn)rLv4a%$yo05Fw>WZe%$?;Z`BhiOIfy90B z;7)wKG*Om!HqK%UKJB=w51LORg{!HBZ-b;5Mahyv`u-BwxN9GEwx6Q$TvVf{~I};AyjBJw}!KlilQ`nX= z5g8P`L=08-)=UI55k@R*TaJfJz0VR2m4h-|>&1HcV)r|oG&3soR=phR7Dp5IB9Iva zE`Tu-46X3oQGGFpPbY*due>38eSO0KU8;eB{4H>_gt zCDdrX zX->sb1D}9hoNg$)d}BFOU~>|&60 zEEVhwJecLtl6VyqmNTy|Kp+BkO^Gpat{ux>8pQM}x9Bs`)$&uD7@vh4@)7@Q2nTFe zH(@?C@HD;g>$>(e|7I=jW<9(b!T}xWLXVH<_N~XKe$S?y5qa&U;L^Y6&Og`YxRV+Y zfz7Yu_!Q8Ms7PphP#_W1KYAlaNroJ{N5j_t^PzXEzx~Z`#^TXN#rN^x1k^BywSa7H z>`JFs#eXT9$cK;%NH2JyH>&y zK_5T31SOF}4ALYrU_h|s`YLS|L}4@KdK< zsL9L>`-@rj@=jmt1yAug#39J}hnpR%h$wv2oX;8}eRg)rL%74*&xz31+><84b7&6d zy=RX6S(J?kC#leFc zjYa}={+jmT0med}%SErU7FlZRH+jN$@hr3K_?bzva8A3 zjwS>7o*N0a&s*%&GYz&OmT zkrBx}YhXJ>TvPf#6n&2}&%x@v$|mIDpe|su>e)`%1SeLV_E{~9G+#@bfV9vMjrd1- zu%LxKc3lspI-FPmt=becdq$&4GCvJA4Kw`kCvKWrA}2PX@Ute-fFf6S&|n4h8eqR^ zk?&4g4LVg)Q&q1uqm}=46Laz^gjA<(R|u(T_Dw9kO|j9^B7&1ORaq-lAl5mU8R!9B zU%#>6{N^M2g5#?0{2tw2-}xRG*eL7?DR|YHSDF_{gDKrlLJ58k&d%W>{*WFqpTBrx zZ!h1Hlt9{J;KJLDCb3{YpP!!b{@ywy@#f7XdmGhUU&4<@)ZOVcW=)3sUJeZb0=@@- zOoIn>M}z?5#HNDefHmX40pH0U7Yn=y0Hh>}H z_sW8!wY&;CZs}=)=K*@+jc4G?U2EU`;2j0WZc2|4;>o){!e~2|6@7?r z-dm;L;aPSQE&7%dL}YNkM+o)P3ALa?;J}4pwD+XHITDa88`FK~KCwzHZ3;E(M17f> zDd(y*6DPkWHC!LG9gRjI=%4Utq{s?X%Qc~*$+Q_q3t%08_j})Gmigw*TMm4%==7rs zLlYjDC~a^}EP{R699Em`QZ-|Ps6jme&1M47}2x=9}9ET z_k+`zhM*+z%A|HuVaE zb|HjFY7F5oERlJvDnmnd$qbDEmtc!5Q)=EIbanff$fC@zXQ@7E24tk)Z*$wIp_eW}S+<<=Qf%0zYnGYtZ+%4H`sWd+FU5jXk=!hb-1f=oy z*6*`7MX#GaaPXKm!IBvVOV38;jFVP6;_y>Y;=IX*F-r?Sh|&0fZ}fa2u>f%9a}U^8 z{_IbAh>7Y*hzW3&e;vGOIl+ZAz3-#E23@b`>oy3~eju$V>(@X4su_c?-PB;g5k^7w zFCjt-jFwc$ywN?z=pw=!^H6=Y3Nl&K)oFhk-#disATUq8R`k4Dgbsa*QD*(V(G@XT zsKKD@HpWWT43b%K*nKu^w1*K>35EyC>McIcZrr@345MLFlPXmYzjic_0&G)fK(?J4 ztZmH21H*^S?V)9MH>WiJ#EwroyLj}J*0L|Z{LEf`@tGR2gdHa#pb95SP8abit()n9 zPRgb&C99L~YvAZ(0!saFRSc?9n~>{A>xj*A92oDs^A1nxUwr(9ee}_145CP?d=cAU z`rYUDAO5X>&z?Uyvd=$xWB=v<`=8jq{F9H&j~@1Q@cyq}zP8t|UfZKbPe|9R-Z5NX z>}TyryQ6r{pFO6=fB3-%%;aybul)O8GSk-DDh$9_FW}^3%o+YQSgx+5hb9<6~MG~K|ON(+Kdjn_ivPP^94g3t@lTLAq z(;|MS$eJ1cld!&AX(uc%)XW&zNp6{$!q5bnATo~xNvSUi5c!zMh3a8K%oQJi%{^2L6L!#%eS*(Thdo?bWFRRw zqbwK_9UNjqlf&0lr6hUPz5IPa?L&rsJHz;>PS=D+1b#4kdY~cg)U*M1OaThYzlq)W zeY(kIYzC2%#Rt0!F0a4;wAWlXuNS7FY((aU5)bZO$qzG3-p0&61a5d~E*?J>PRH&# zb8AaU9BDk3HHMoyj>rZUvs}R&1IC~^=AVY!Xp~8|+6A+Kfwk9R2=8tw-3A?q6$iz- zz#$L3-K!$`p*M5}+*Pj&!Uz*KwHVIH(~d58utg@_G%)VO%~TERS($~&JJ(&RQ=-jA zFfc?2QRAL)mG*$79`7u`Gh`n%H=bo{I$q64!)gDi{S^?HqDC zCFO00jJ~P&w6zo1d>+ktF#X9t|Nq%yG1Y-N451DcZLzQ)fU01@{X*=#YsL(l`xpHE zpxem|DjHIu#;ie_S%0JEB=GIWzD|ygPwjeD?BD$PuW64k^W^F5Xlj4+Z~USCr+@p$ zc6!v?&;R0c`{|$l!v4*_`K9fAeJpR+sucV_-Q6zPq0VGy>3=CC?_W25cRd*Og)unSu~&5x3o~exF6)(_FsnP_O86#< zB4Dg8zLb3 zWEya56}l0oItnGSXijaG44e~$O^a1bluodSRh3{L&7pvCnsCsokWQ`=3EjH|?$^TK z1H5HqJM)gr3NS2Cjl!hG+Q89FSr8f;=VvE&zQE7~b+7T83N2JVUUjU%Z1F5Bm0O2l zI&S1i%w1%5J`ryl&j8I)Tq1m+JKq$~zXRO#n2QjNDy-h^`VAK+0x`3{VK1>~7-*!1 z6=E zBTcQ5IARQ-!K|>VAZ%l@hB9$+QzN+U)g+NsO9;bkG_qlRMtO#)p&e?*+yvwk_pKm&yN{XinW#rBc7h@vseuo-iQ*3Y4V_o4TYvjIN>;Mah;iIiI_@b;k~t$hAUl^h~?$(kV`5=$~Nn~67$`?T==dg=lC zohP@RXdDxA!S?`$`KSN%CwAg+;Kf;Ezy8$=`?r7brLW$FdIW=oAS5d4UJwN;&c$NF zDriapn)h0KpI%;F@hZTFK709!YXY-7$LSdK_!8v)l4L)K>mG<J zdg0jCjc0w}U*0YKbt_=x9snMki_<*QEI$QkElOk1u9T>teA@ozR!24tVo7RT)r^Z} zdo`+wlO1mbd=sBPMNP2CefBl6Au8Z?yRy!Cni)K0&Dkknw?!WE1hcIFcRZPj%!ZM9GY8QrOOfZ6- zpvHY--$BC#s#$*tnZF=4s{FjlId-gfafFFWUOAI~I_u{q#5HNj??5H!FX? zvuEBPdgIr$93A6uz(2fr$jRoMWbglW0A)a$zu}(;W8iQ&AwXX{%nD}5d~wI?0Nk?+ zB~z7J^QpC3JEHLQQMD^6+~c_x!B}er{_+$%ReRZ@!$?(UvYJ{|G0zY-s$|3D97We} z561UsbN5&>c3&m<)z=4;#wvzgEIJYXysmDpsZ|H948N#`^M~JI3W~!Ea0H{l$wZSk zXbFl^I4gG?qSKk9^lexkmvL+i@#Y*{=4e!bV#eknVS_0lh{<%&C?lxWTG>4!q;Yz1 zR@O@q!s^n4@{Qd=^|%Ec&NF2{Twc6*Z6AO3%7cu<2fo0rJUFkjGByMW1g|5g2mN8A zLZCXZYXaKXONmi2G*JqrqVYY5n)rLmnQ<+xHu(^e*eR)3Ci1{L)TiF5Mq}(Plu&~f zKfOgv{Ti|=I-@`Bgo{73j2vhtv}0M%k~#zgc(AZXe0aLB$LGH3ppqgtv^IAz;@+`H z$EWdgZ~b22IU(rNG7*~}5x?|C_mtOj1wYSaPZ z0X?Z}=Da`S6qMA29q44_30JGmpxZ{^1y<7${{~}539B*$f)sV)P2Q5@44NCgKuQcC zHE>inq-u5Dk(8c{xV_i{y{0(RaA&g)lX_J|YP>W$9fNAc;Lrt_6@hq&K7kBuq!8;` zc^Fe5G-%G>bRw}2C$}_v#)d4QgT*oOTC92mkjw<|$-6IVHdK9eEEc{3q$#XngQ4HBb8p8O?V$GX^X{Bu* z4nX)?7JZ11sN~xJcdXq=59*7AARyj=+QP;dL>U`(o+q3bz0kl>g85Sl0h&5;#G3ay3&M}NkR!A#(!7FrmJ-|$e zk9rAobxE>0*duHIExMZrAnzg<$3lm&67(wG-*3vOmKQc0@W3ib{yad;Pt~&*cYNysn?(jJKyfc|-7_AF10ByM zELs5z~Ag>FR$0 z2fb>TgG@#S^^qwCEl{YIpj16Pn@=Mz86>@o6VBz z3f8s*DWQ2hSupw)nQJaD$UpvAii!gfFgVskvvBwRK-KUvA1~}p6%+5wNWYMufi2}KZCCR zCKa|w@o#aYf8~3NHD8P8ibq`&eyTgp$y?DVY0~PX#6v*YgTTt*Y{G0%j;3&}f;kZR zyDP`Rwr$YrBI7~XFleAF4{G|?u?52E+C{>n4&Il!W3g=bav(ajc*!e*cTTU z_W0Smekcgj?zbDO1u}18LpnVfC%7-ytVY)S96bkS?$1O$h8%vr7UjLHHABh3?2;44 zV|O&MfmBZEefZxnc}jHvr7tA-Xmh>PJK-S4=On8yrs?9pNnBz)9#Y_dms`LgMa^8A_WM2E(dS&adlhxarqjr{ptncB z2NJC$t7<$s*>y?;+9EIp_kAaBaMyrKHdF5=DZtaO*o<_srrG;q07u3_dhz(NLz1`L z6T*%U%VaK)aoB9Sr+laZE2>36LSrdld+4c^y~60;7g@Lb$<+j&dw^c}Ub_XYj+zHm ziumMs9!61$_C0Xy$(4rzR zl#p#(9n#rTdWj5x!Vd(&qf;B!$DYw%8|ZFoz^QxQ)=~i(`W6pi!|A$Ud<>gw9uAvI zKrcN{S%$JI6EC7>v6SsQJ`{ir0u7urDLm>(z)+R=I86+@l~T zrQ)a^gTd&aRRYH?3sW*FIdIwHB z%w@2HW-yO}<5&zwtw=NIi3);SX0nNDIru9qBTH5`y>aZZ90}$qSp$IaY?1Y@mbcyz zT1K$ziS;8>y}o`WM?}yUmpa5yx}$2sdf;A3lBaJrfdQr&rTuvj?XwF}2w{p)_NkdH zx?J^Bu00ar`oc43UMV0!X4&6LZFzdWkf%dr;cX)fpPZ5uJ&Pm~CgF@$`$IYzf(2@v zTTfU<#_%1#esm0MUidsHW_bT58lO9=*78`5P`T)PvI}Sh^il-Wlan(q`QNAl2!;XI zuV@^~7_D-jVsU1Gv{FgECkJ}79_bx2cw9?DrXz_}bA>2L|iZaw9* zR;i_iAlE;t!d?jrD$*CPUfEwbOamn^o(K{^{D?1Jercb6{3#p$sAAu|`qIAq{A2so zM<3f~pMTCi6k%69yEs&USy!zFf-y7zveuOw3jJB^V6Xb0n9y|W2L-09uc;zkYERX% zXH65zLhMtgN;l-T}V{MHvMR_(K)0baV}pUp=hpMU0x9vTyNBXYa;7bFl?FO(7F)^5$nlJq5!f=I_nM1X!b6q%V2hI ztW{*l$o!b;4e@yb6Djfjb+k?nY%Hm^p>_Z*PjOwVmP~W;WND8T*yi^~c^+l6xU@WP#^8X>&9i z$6tEArh=CkM%&VXkp3;4$yI{-hyXXE&-yUb!x+M-Bd!Sy%rKY?@H%i%%@|lv#l3oS z>CbX)M;PYZiCIG*WK;EL0rgl+=eFv7qUa$n@dN2G5B@sn;4t{a*W#~w&-fY|qk=c)4-ROcAcYu$< zK%0h1&7Klf&A9b*BxP)4x(TzUzBOTzD-uLFLK>vs{=SO5x1RDYEC_4Q~9q(>~(B*5c5*k7FlKr=0ysj3OBl` z)I=76g)_vYV8IPx*H|;h@IfFoFUHlBSU^ae;FLF1K}<9*>cfJu5hSf!2rvB44K{V0 ztXjzXL7!}Bw#q;GK-&;Qj2L%fR$4PAT#F3Ti`9u2$bx?T(QoW0KmD0~^IIR<`Q(H` zi^UNjJ%?u;XkU5-fF|ld>}^NdVufdRy)wfiUoUK)^vXu>?l!!)7*so-U3hRl*O~$R z!YtSW_EF0+9|9MwhilK`5eo5hkddP~iiyixhuLntq62q$$3~t8zc!RH_g3c^BJk=y z?P3_K7Pa6B1*9CF75V^mR-h7Y%1z#O-dLXt$eK%Kjh?AF77xZvs5aZ#blisU*D0o*$MN; zA(%S(W1tcSbbtejBiZ~JE@2?1rss)QZI2&6v3K8l-!9Hic`r#VT(1cyo}HdjjDzaw z_3aJCDcGZ@4<6Xb#Y2i&0G;)IkKTCTUV*i=-LfBn#wC4nAQ#^j9rmrBeXUaQ{{cZ3 zU+e5`>@<-kCk>NMRC}r!s)%XLdks&=eNl z=ptr@Iv=v@tag!BMKJ+;;QzJJ3?aI+`ggpF^cZN>7X|%6VVj@Uyg{E0Gma z{Wv1P@5`IWp20icc_sv0yp?%8Fjr+Ri9A@!?7^7^=Eo+7X$06H=FCuW)+Po1DG9rN zuDbK*zS!S;&o{W2nn!bd=DBAguRSAP60%tD;6OIjB;`gP-6`xXbhlcw1Z2zmW}h-Vs`HYwnk5*sB2{DHh(RZ$zQG#+!h|Kww*z?c=PHIyJ& z9mPhxGmRs++JGwX16$f(;(Jd)dS)=d*smF_UIFP~I0S;&BrV9mIa+k|yuNz#)*I!w zo+zxT^u_xjXgz=S*skBa76g^$YDX1Z9krH+dp_J%VtklQ3l?0Q)I`?<|&Dvvhsd&dFd6v8;xCSqy8xJhsFext2eL6 z*np4>&%2vS^z`uJf#dH_XzG9U_6-LdGb!?Y0rf0`I5O}R{c+Y>j0H;Dz5jfU`HuAT zh%C8^io~ipgfMDyC{wf&^vtn=_gjMV;ji%^jKF-T65I=%%Dvxq@7_yL)P3U{AFwn4 z5BbKMT)_&}!b*pVD6$1LNurBDgRjcTh7X4BbVZ}1*s8&4P>JBYu(0>!h^bB%I*J~` zb({SO#OozuFtFp#J^)vj*GTI}Ze?o{0aTbnGU|X| zij7UDc)Z#ioytglZ!N(`(s1zpxKKeAoWY-~SKE8RrCJDE1n!q)r~Qp>>yURF=;gLL6WkfC7ilx%S}u>dhzq zv#yv03+GfuxLP*!*sk8;pwrQzklgI*QmDq>u8#~jtK_SKiV{#xj)+2t5ci|CxG%Wp z`gsT*#$c*SW**8p(n6W-HBu`!?I=nbg##&QR~Ar&?G1(^2Oa-j1GLq(P%BCC?yL?9 z9kX&Q;~^TUxV{+mHE9)`hmaq`jSW`5UAtr-09Yyfp0}RyAqnc5faR>v_zUF=RCCj2 z9+_A(2Hxs@^0i=)g27N>jreq5omE(qq>>Lxa0LPR!Z*sGt4g(v>YDx~2=czC+DT$U z;cY-3sZOHL}7za#R3p5i}M-C599{jZ{Qq&!7#icrymsVLZsWR(Jiqs-oWG@mbq_+__R4 z;|pI4zV?+2`!HEZWlsuVwQ}+3iB698h6_ZEhs;x1Gsc3sQEI3*s<-MXf(8KiyI3q} z{tck&L19Q(A-n)gTvW~Ol35J#v5cJ zGH+HTg?W6yQ7TmobgKywfHsCW5H*ZejDhMeQo=QEi1Mgr%tPRJ*gSK3a7e|47xa$t zu}boQ0J-k!&OeI>wuh&W>|}mIp7oK#6RADswclLc*xR?S$gc3(Jf=Diql4Wz%Eyco z!H0ay*B~>Ij8?cR_~+F;NE!2tpG(cxb{q%+yd2pL%6~S3{aTc5i)GN#Pg}1|fvajw zXpK}@scwR%6^DG^6jMM@^QwRtb`r(?g|cW1@G<2`>1VRqe?tw%3?9P)BiSu5U3DRMqFqG3TSB8Sl;OH!n@X zn}OH33;h6{5Sw<~wPhMh^AcEe%K2+$`2EJ#n4(quhX);=iTr0eR(kYC&zf)q zg)m@KWVb18FJHbShyV2af`Rqq?36tX1XcLcOi_h<2L0IK zkgLa!?9!_X99&Qt-d*3Y$1rR)`fcXdckI>5lP6DX;cI{6v8`>cxR|{!WZyTzeV$lGY(gqfbH|k}|y>_f}y}I*Ya3>gJLb0gE990ZEB(XUjP8oLW8;l!S6L5#HsBE&b^~4Dz1I<>rY5SnF#Tiv1+s&14 z@^)+2S6|XLcDcTdfRgy{=Z10tG6oiZrQ6aXRBTLrCo|ugFE2V26G$hK13a62QlIWoOY=rW2ynmZ&Qam=m zm_^a3UxEcuEmMt0Q90FTQ#W%nid^bgE%r^CI{bFuuaIU`P!*@4WHl0{jI3FG%OE$O zE_fKf@CF$;(hnb;c*WE6o;p&`JqA&c1>d}ir3O|%ZFp2v%rp*le4h4xz^IEZ9|RBv zi*WQ~C1`1^Mm2y#aM2_@UXtxIZprz3HZc>wCeIs6|0(WLBDU?fL6z;97$Csj-rd+I zAOD7p`1jubhF4}ALUHdp){ggl{rVLr2OUiSgPgK~`ufWkcI3f)Gr{25YrDo|^Fj2) zmRa}I&OOjSfBp`~YN3i9I3iEb%ZSsrVr`^=M955;2L^3I1}YX^A)%DiJj}x|#@nwd z2kSjO4A%EB>XhyU?|ncwlYfZ*yL;n!4%B?NP@yev?bwg0l|vo3H}J{GR4w5H0Q&>` zg6liFwhi!C;Fi}fiIv@5-O)M`F>f)KCj&NbuFx+{OcMFSO}MdfwWgX4shQS>og*t* znyiCb*HYwwN8cwIqf5BpWo*{8ap0aCWQ|QQNTP8$M1WO1PHe7>8=LcIQY>@@_VEOb zlG!SBVzp7Y&(w2W?2R%D92ztgAH-f6^8O);u2=m#hB%P20)WO9i_@7TrBA|MlzB~J zk}+DCTuXiY{GQF&inkzh{%e2yx9mUokN;C!c(WIZoj?6o|J?r3fBWCqhu{8={qVvm1_mO|9<2MsnZKNv0E2&#z5w2o4&;5LF&NT8vh@n1wp=-X;qLo9T5m ze3yg2rvu2Ls{2UcYGvNkG_@j&JhgNIwj#7C6Z;zt26#LrFt0VSwzW zdM`j0yP&FFoS)hI?>x7sPcCfkSoZR6X^25cx@O+3e)!}un~P}rop~@mJ_2#!*uMPi zb5b?Y*LnHswI?1g2_LR0Y%8MYMnkuod6XclYi5rhJ+?<@=eB#g^+5l~e)fxB_@9@d z?iEB@(M){w`4Iy989y(4ig=%ks(TBTQLWr7Q>7dR*b0UGmV0~nt7hxv;919LcDD~ve(s+g)a1$Re)iSE5U;%h0vI&yWaX66OAjU?;#q@!s zT9i+Qyqzm0Em!h;WG^K!aVUY>05%j|GwnnP8H~-tfN)H_<9IeYNKzHI98zQosbPwf z&Di)*0G9Aa!8Byt@cs3}%EJAvZT5}B+Qcc5#VLc6M|GPtNt#(3+FGfQ5(pN|+&AHB zHQ4X|&R?>B|8M*UzBn&D7(ngixbu(ysxNkjGmaPb=4NTP*Ke7Tz?|ypHq*o8TW{a- zU@&-qys}#l(i=<%M_Yj+70>Lt6CJ9Z=1-!c!S|EM9|u+&6tBA2N@QMIxG}^5_p((m zM01lFZNN5YQo=l^Hi@TkA8ahmP2b1p*D~uZvAa;-!m6@1wkS^+x$747X=FgAU~dOy zt$s|3tXNGB#9Fd0QX3exww9VoTCq5o0EL0|F`ZWaa;wd3`=3v9FB6O*dY*of;~eV7 z6nH400vLP2U)u)9{99qao3$v9P;&OTR?Z?^b3MQ&0Y72K3^hEW0Uh;wABeUMv#0}E za{c?*z-spgSkvqw5B@hQSo8-uf)=#MzI$=WEe3lm7IS;>@PbnCm!1fI_QjX}`-QC_25U5p zzK`iFP&~umWH7}H+^Z*#AA3)tv-9I)d-M7=ty`C**=qQ$KCt#18?@d(s*ODydh`;a z%)9KH%C+*3`&iu$55Xa;0o?90W)6dNecip_oMOEKs|UaZo6#>m|J<%#y|DIdZm(u5 z52$Z!d40mkC3y>g{l+ttD=sF;Qqgrr@Pb*<^4hzq%WKcdZg_eF=s%ugQ4QoTQ zVp(*BLtbef4{}HyK5N0>MKFh=3=_e-I+!v_`?3=bp7&-VyWlH>R?}}p0Rtog1_ac0 zG$=wqF0$}UfIyOP-4djK{%2F65>aXTzan*y zoL}sZome98KYqvYxuvC}Y~TOji3jN$dwu!ZG0h{p+0N}ZpI_SXB8g`VzY@Ry$0sui zcMh8yrDk5iYZY(wV9`~$hhh~4SFXXz&MC!eFGCQ3{^T04JuIMxYVgRD9R$uamfR_L zWJ3g?Pd@p?o1Pz2?SkAv%?TD{t`SkFc4K*U1fVjw20><2{ez-QbOjgfQz?>QPXVJ1%J9>-{bfc zP2n{gvMWp-^21^pQ@s)RWvifr0-x~e>aE|mS9W@OOhyY#l15<`t|W(m#D9T;_u8}O z&p!LiK6iMd_x*f+eoi%yQx|8Ndd+`Mt9 z!aw-r$nwfJ{msfY!-8f>UMyITis|HUC3e>Ez&9zZ~5rcweI&GDc$D{nh&NJ*;Q=M)nZEMSM~B{FHj;q`zu!HBHZRJ8Z8 zX%(!ywh9CEUbT6M%)hFrWVXVun)od(oy-W+L@CX@F4SP-gy67SC0{m%^VSDP6Y)mx zspef4pV)5%c%?@Z+*kh|G&*4!iss#BXVYP2Po~9AJs3Y|PVIXizH6U(SA3nfJS^K5 z^g2Hz;rrp4(0ZqlN}^jfJgm5XIaX>r;<4kxiqaj2!VryJW)hJhl%%FEZ(kb>mXh~) zf8do|zlvabeQ?o*k=s~`TN4c`|2Jexl_@he2%{veR+p7cWT^(}mWMBK;cg=A6dScU zm@8Q9UItVfTqPQV7hat#=BKnhkWqg+A}xPMQ0dk&J1)(AZljfoH3?ebvPA{~2Rn-_xrj@hC`H%eFHz3-Rcebs1~;}Qq{?^? zpz%fgUQ;*|mmRz}zcpV+EMB!W#f?omlS z=%5QYi9xOGnFZ zCu1*Ro+SD~cpdQRW{{AEQ%S%{D&oXj96&UGZ)<67_YM~X+R7*2Pl?$>LH7@fU>XEr zfGS=N&B&}y0lVP3C}5-g!VuDZ1>(HgvdN6DN{dN8{%;7BZymw`1L)baXZFyWd9UAI zsd8!$v3?z*IDFo|eM?t61nMokc;NBUP6=ya>I%eluN<>~`G_0_P^hFcD?LjJT$i_50CAn251g;6@`s zbWH8>(EG%H zh6iLwW838hM&LGe$m+zu@7ulzKmCiJ+CTjtKelJ*|G6*F_lTE*M}goVQ=U8qIPOTwgXG3O(QIl$G*t^x*5n@8BkT91_ggn>@e*G*Hf8L_nSWl2S(6M z*+po($fSdIMm1qW<`1~HfG-%YkZ`mz!>U1?^e@xodsImb;`l66f^9sk!J@%uABNpM zta%qzQ4ZDWh_{AMbUoN~7^M&tNpyw)iQyi&KgSLi++J^aP&1K=dxgYJ3?6?D{wF4) zU_W4>@}2j(KKj+K?c`)`&!0cHhYuf)YQ?cKDV3q50}%%PuRZX>S{Mri0r=(y9zrWG zn?fS**K&UTfMc&j;cV@}#VLg?%gZZW69>%7DwhXUn?_$~M9ZV&xt(8}*?aFjcPK>4 zL?n#U$z)G09qFwpppG&I*Zsj3Rlpc$4;HE&;{E}Nel3GOSl2X$M@B|ZjVTpt;2O>* zn8Sw*8q-wP#6uyk*1AVV*sHW>#uQo4q$3TEKGObPm}q^3DcO!yoqJ>8{CH-k9NK^Y z4eV6i^KoJU3H|Wo)#m4b*(`Mwl7lS_TSBeK&aE%ZsbkM+wX?Tt%`xOnZ__B@X1jJgZZp)1l_PC z+A@hn0Lukv-=zLq`*J zYI5ybUtjw{dgS-%#_@hIAu=0+V2$(~lkN9q=kMXE`~>cEew}mw{d?~{^Q`;Y`w*|} zy&t^Kp}1{iSImYX=VkSzMTZ7a4liOlps}3aceurpNP7(W0AJGr6qF(7G-XR|OK`Si&uewy#^$Ni>Faact2d(5b#8n9?o(jS7EXvf2NOBY3d-DbBuz+Q=+62Uj|R2 ztWxbt3gv{DG|i8!jBh)gY4~sr&R=}?g=f7pd*|I}9zY*yuzLzvFH}izyJ3FoIl2$k4#+5zLo!`A)p? zz?3}jocKYoK?ad@I%Nh$Q#tF0&zYCOk1mda?iMm|1kGMe0A#J8mEljrfwO8I*Shl( z>y16&_ZjdHGICN^-SPkhO<+@4(GwQnXAu^4l(WtuI1 z_O8?uI?L$N7x%30|%<+V|?3rL1LT>0EHz zOw*(UZxe_mz#Q=JpZP}o;ORqq@x{mXqbcl219y%rSCxJ{iix<$(@cSYfjE!BHP!DK z6N-H^X3q<)`oMz_ma4RP&s|3V!=}e1>n@sYgx6vkNXO|udu)CTkZGUgR1b=p5epwo zc6b5f#)+(^()$jZXFLQNH50Lcaerv>YBoX%hdAQMey|juNB1fRq{GeLG$V{sJ5VL$ z`Nzi#N}d79kvBY>g)pQg{3TvF*5ZOf7Cavu)*M?Fr}tqatimbe;U5I;5_oCNsOx9M z>(I|&YzRgNu-|ra&OZTFkV;Aut(M6P*d2Wsd}-`rAq0ZhfPvHq*5_yEc6#=J`y5Sv zTn4KK>~Zu^aQ*A#nDUKh%2(b@yk@f+5LTIj0fwnFrw+>wgjhcR{0k1Mz|Vntmzk@t z`K#+YCQE=4I4#ES#Vw!?BpqNQ<$%bN=(M7WCSlMBlDHmF{(R4GDZmob%bMmOAe-%j z^d46GDvj~CO;o8cjO zf2DuOARyJSES)PO2i(9r^YnW>8HLQ7ZH0S3X);lXP z9HHKmGVCju8bA(%Ml<#e(s+eqw%9b`VNoF({A)*b-h=aVKSa)KaWW${4cGhj>W9gU6L$Ums2i3V>GqPPgi?^4Tc5{0}EEs_qZw6KeCgva}U|=q?_9G9X zkNk6;z}e4#&RgG?SDqzc92ONT*_t@9Ubng2P5D>@&ey>&(j`e$g=z!r;2;cbI z*VgT=S0wq4--Ck@LzYo}61N}1;vo*ZL+EW>^Yw7P7l_k6tbhEs$i_?AXX6?*s44Uv zrvv)}xxIk^ViHFE8bt$T9>YYG(;Q7-GXzt%qte!hr)6tm0~dK)#D>P=*X9+en+>=m z6PFPVRO%9-y>L1C=G;#ZyG#%{74flvgXLq9Q|P9%fu&?Y$jFP zE~W!x`U`IRdT?CKgYK)FJA30e8oJR~gpk>QCX_1Ffzup|*R!*>cTjQzIukHpbc9R&eY(y-&{p z&UMbGuPHD0v-fN;`3KYOseGgB;BFj7aG22_{`zXrrfHJxxxDBzO^d^oMQ(L?9n`Ua zAs#(^WWWF8AJIYpR<#(gyjc9gKK|rO$EBD0d2Pc=nGMtJj-MYv@0Y*&m3{ohrw(zP z+tVjcS+&3QzzUJl(vu3n6{s-jyON@kfI=~;$-af9=yoSudyttID(vZ8Fco0K)3Y-> zJ)QGCF!Te>!v<@~|K-v%>zkXElBMW7UaORt;uoomgq^BPyoRlM@E-)= zOwY|xU1E+_xOAhHviAIqce_#yVdgf@cE}KTr9lsN86@}|g=q)lZp+dHS zX*OF_W7|xD5!T5Jd$(=w9Y_*#<&na6xTSN&Lq+7*VF)MypEGCnqp(H?KNRNPqk8i6 zvBP_FLY!b)OoE9tRI7v{xi}IYG|rJAt^DGC^U3FyFdfDdl($#6{Jzy@NA5D7>tMZD z69S{Hecf_x@cH7PLQuf86L?KK%mK2(6bvyBH6C>hi`knr&e4$MqoN$Jo1K=^jJqULdT0jsMQUG^&-#JqV*{ z4G#70m-`Qbp8Hu7VY)5G3T-r(kaqi?nIVg7$>|iQ`2CrcwW!H6^DezpscFeO2VFIi%kq!cym~p1rgoaKjB1`NqUVoQ0F&LzO24ZCYo{}S2HU8hT zX(nZ^)D7K+yBsmMcH9UR3K){08_Wd+zP8&m{BKkkudXqgtFcpGOxfX?n<30@%1+N5 zs&#)Z#}`w3{_w;mp3UrXaAP51NACa!o(Je>4%@u*&F|aCzxvd(@+*7v;3nd4`|!yTcv4$r0iXOhyi z@~%@l4A4Ua1nud4B~zFTm`NDOUP%t?15>4j%zyBEyYxT`HR{a@8SRAj!o}C(+t+WE zKqT474xVkNFn>aJ-lJiN5oR=vDz^0IKE|if&YF?J}M*irnIPrA| zL1yxmIgI(tuM=XFv*RPOn&3H}ux3e?+A@j2fPKsspqE;?9-1ww(pid;wE5L zi|3j8Q2@ay-i@eHGJ>isgi5oMiO&$6Sa~70#L4l!RW!lIjKAl0vks4kmiJw1x6SBQ zXLW;gGUUk-=oD;i%yhM}@H2Y87s}+idARP#HxJm%M4j91wsEV2SIlWGF$A}000sSC zx@lmxO{~er@y{C`Hjke?95HqMED2#KMoKY6wF+yBrp#+&*Jt9m?E0D#?UU&d-;*o? zKhSBEKc8~L_hHV{#5$|C3%Do4vKJrQ*Oeoa2aF6sVwFb6YN*%yq#B&fMm)TYszX&p z3}FpZsj83!T=&|8@vB?RoP>kihSl=x*KeZA+lr-x=LomMUIs>!X66MzPne+_*xl#; z>_VBFqp{e8y?`i>T4M(qR?||*BH*lm|+fl2gmP+z2@L>7qG8hMcvzC#>Bpb;+OMS5Ta;uBhRJKAsZaeb~ zaDGO1$27?e0|qPHK$v-liN@WXO$H2!)MRBS9EZWPxhx*AHi4RZRph~sm-{eaO}dG+)D(@R{3C4U$+g2-j^&8G{^4ZHos`t3~+S z7I{U~8;`%UF~bKg`VSUl8^$+Qu`Lq?2r5PhWfr74HX79wjZ=J{O-Ne*+yCyrv(4Sk z-t`XodVNRS4x^=nS;hjTX;eoebT$v06bG^@3p9V0S6|9kBuNya;8`@#wUt0dDn|>! zPL#A`UaIj@_yuzxd=}82pc>=ERJadz8e6sPYZJ2P&&Na+!Y*Ayn5S+UL7C+qmWQe@ zwc#xhA|9333g8s9SWxQFv@#vOZP2WWi5*loRonYDt<=a>;0vxW50o}!+%Xy4@8Rj` zf()lyG`G;`>$=!@wx{=nIZ_i7Rx0M$#d|`1hc&xigIUu+L+wA`8}~>!{ClS}t=IKd z6K*iw9?zVx-~qom5JBS9+gE(61tRP)xoNm;2|5d2I^-mY7>pFexnN1 z#OzplX8fz)d~6@TxUwy1wXlfwD&p1Kw^Z_hqg;j<+%aqdy7X)GecZx^0M#ri4=DOD z8L6pEmqB?Xe%MwOI$a8>71$~vVzSiH-7t@zuL$DtjC|FtZQh_d%XYVV&FjU1fw*&d zdCdwHkOl2RVMNwNW3KG)S8aCGIi$EpeT>_yYq8$H+Ka0Jw+@NjaZrc$Lp>}@(1R-s zq99-HsSXu;w|o{8+%s?sC)1u7E4ltfGXqhI)9DF|z0^}R?E?=nrhS@ULRKx0*WNUJ z*J6;RP6KRO8Ft0V-NdiwCbs5N)s zu!3{)_`8l^swXota**pcz-6~;c(7)(+E5tSl$?8@owreP64x)xJSG!0OK<(&B2&PK ztxQSmQg)%3T!G0oz=3zQK_z}H#wn$#H&;9p7eiz4Uc|yqHw)V=SIjU

Sk=X<;IX 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 Date: Thu, 5 Oct 2023 17:34:36 +0900 Subject: [PATCH 16/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC,=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9,=20=EB=A6=AC=EB=B7=B0=20=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 68 ++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 656ce40e..8fe61199 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -3,12 +3,17 @@ package com.everymeal.presentation.ui.restaurant import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource 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.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -24,22 +29,32 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow 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.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import com.everymeal.presentation.R +import com.everymeal.presentation.components.RestaurantRating +import com.everymeal.presentation.components.RestaurantTitle import com.everymeal.presentation.ui.save.SaveTopBar import com.everymeal.presentation.ui.theme.EveryMealTypography +import com.everymeal.presentation.ui.theme.Gray300 import com.everymeal.presentation.ui.theme.Gray500 +import com.everymeal.presentation.ui.theme.Gray600 +import com.everymeal.presentation.ui.theme.Gray700 import com.everymeal.presentation.ui.theme.Gray900 import kotlinx.coroutines.launch @@ -102,11 +117,54 @@ fun DetailRestaurantImage( fun DetailRestaurantInfo( ) { - Column { + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp) + .background(color = Color.White) + ) { Text( - text = "정보", + modifier = Modifier + .padding(top = 16.dp) + .clip(RoundedCornerShape(4.dp)) + .background(color = Gray300) + .padding(vertical = 3.dp, horizontal = 6.dp), + text = "술집", + color = Gray600, + fontSize = 12.sp, style = EveryMealTypography.labelSmall, ) + Text( + modifier = Modifier.padding(top = 6.dp), + text = "스타벅스 서울대 입구점", + color = Color.Black, + fontSize = 22.sp, + style = EveryMealTypography.titleMedium, + ) + Spacer(modifier = Modifier.padding(5.dp)) + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_active_star_mono), + contentDescription = stringResource(R.string.icon_star), + ) + Text( + modifier = Modifier.padding(start = 2.dp), + text = "5.0", + color = Gray700, + fontSize = 12.sp, + fontWeight = FontWeight.Medium, + ) + Text( + modifier = Modifier.padding(start = 2.dp), + text = "(100)", + color = Gray700, + fontSize = 12.sp, + fontWeight = FontWeight.Medium, + ) + Spacer(modifier = Modifier.weight(1f)) + } } } @@ -172,5 +230,11 @@ fun DetailRestaurantTabLayout( @Preview @Composable fun PreviewDetailRestaurantScreen() { + DetailRestaurantScreen() +} + +@Preview +@Composable +fun PreviewDetailRestaurantImage() { DetailRestaurantImage() } From 183054b68794356fb2cd5af27f051f81c5ae54d7 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Thu, 5 Oct 2023 18:05:42 +0900 Subject: [PATCH 17/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20=EA=B3=B5=EC=9C=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0,=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=B7=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 55 +++++++++++++++++++ .../main/res/drawable/icon_download_mono.xml | 12 ++++ presentation/src/main/res/values/strings.xml | 3 + 3 files changed, 70 insertions(+) create mode 100644 presentation/src/main/res/drawable/icon_download_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 8fe61199..d7f485f7 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -3,6 +3,7 @@ package com.everymeal.presentation.ui.restaurant import androidx.compose.foundation.ExperimentalFoundationApi 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.layout.Box @@ -13,6 +14,7 @@ import androidx.compose.foundation.layout.aspectRatio 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.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager @@ -51,6 +53,7 @@ import com.everymeal.presentation.components.RestaurantRating import com.everymeal.presentation.components.RestaurantTitle import com.everymeal.presentation.ui.save.SaveTopBar import com.everymeal.presentation.ui.theme.EveryMealTypography +import com.everymeal.presentation.ui.theme.Gray100 import com.everymeal.presentation.ui.theme.Gray300 import com.everymeal.presentation.ui.theme.Gray500 import com.everymeal.presentation.ui.theme.Gray600 @@ -165,6 +168,58 @@ fun DetailRestaurantInfo( ) Spacer(modifier = Modifier.weight(1f)) } + Spacer(modifier = Modifier.padding(12.dp)) + Row( + + ) { + Row( + modifier = Modifier + .background( + color = Color.White, + shape = RoundedCornerShape(12.dp) + ) + .border( + width = 1.dp, + color = Gray300, + shape = RoundedCornerShape(12.dp) + ) + .padding(vertical = 12.dp) + ) { + Image( + modifier = Modifier.size(24.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_heart_mono), + contentDescription = stringResource(R.string.icon_star), + ) + Text( + modifier = Modifier.padding(start = 4.dp), + text = "89", + color = Gray500, + fontSize = 15.sp, + style = EveryMealTypography.displaySmall + ) + } + Row( + modifier = Modifier + .background( + color = Gray100, + shape = RoundedCornerShape(12.dp) + ) + .padding(12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_download_mono), + contentDescription = "restaurant share", + ) + Text( + modifier = Modifier.padding(start = 6.dp), + text = stringResource(R.string.restaurant_share), + color = Gray600, + fontSize = 15.sp, + style = EveryMealTypography.displaySmall + ) + } + } } } diff --git a/presentation/src/main/res/drawable/icon_download_mono.xml b/presentation/src/main/res/drawable/icon_download_mono.xml new file mode 100644 index 00000000..b499ae0b --- /dev/null +++ b/presentation/src/main/res/drawable/icon_download_mono.xml @@ -0,0 +1,12 @@ + + + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 704c8e77..eb845567 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -85,4 +85,7 @@ 비속어 및 혐오 발언 음란성 게시물 무엇으로 신고하시나요? + + + 공유하기 From 4a3244fff8207b0181aaba3aceb14aea38e06408 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Fri, 6 Oct 2023 20:45:58 +0900 Subject: [PATCH 18/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20Pager=20=EC=83=81=EB=8B=A8?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=99=84=EB=A3=8C=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index d7f485f7..b2155fc6 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -6,6 +6,7 @@ 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.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -16,6 +17,7 @@ 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.layout.windowInsetsEndWidth import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -170,7 +172,8 @@ fun DetailRestaurantInfo( } Spacer(modifier = Modifier.padding(12.dp)) Row( - + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, ) { Row( modifier = Modifier @@ -183,7 +186,9 @@ fun DetailRestaurantInfo( color = Gray300, shape = RoundedCornerShape(12.dp) ) - .padding(vertical = 12.dp) + .weight(1f) + .padding(vertical = 12.dp), + horizontalArrangement = Arrangement.Center, ) { Image( modifier = Modifier.size(24.dp), @@ -198,6 +203,7 @@ fun DetailRestaurantInfo( style = EveryMealTypography.displaySmall ) } + Spacer(modifier = Modifier.width(8.dp)) Row( modifier = Modifier .background( From 9e37e431528e77d7c5e6c597b807cfa747033410 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sat, 7 Oct 2023 02:16:06 +0900 Subject: [PATCH 19/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=B9=20=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20=ED=83=AD?= =?UTF-8?q?=20=EB=B7=B0=20=EA=B5=AC=ED=98=84=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 58 ++++++++++++++++--- .../src/main/res/drawable/icon_call_mono.xml | 10 ++++ 2 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 presentation/src/main/res/drawable/icon_call_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index b2155fc6..f08b793a 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -4,8 +4,6 @@ import androidx.compose.foundation.ExperimentalFoundationApi 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.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -17,7 +15,6 @@ 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.layout.windowInsetsEndWidth import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState @@ -33,13 +30,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.snapshotFlow 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.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource @@ -51,15 +48,15 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import com.everymeal.presentation.R -import com.everymeal.presentation.components.RestaurantRating -import com.everymeal.presentation.components.RestaurantTitle import com.everymeal.presentation.ui.save.SaveTopBar import com.everymeal.presentation.ui.theme.EveryMealTypography import com.everymeal.presentation.ui.theme.Gray100 import com.everymeal.presentation.ui.theme.Gray300 +import com.everymeal.presentation.ui.theme.Gray400 import com.everymeal.presentation.ui.theme.Gray500 import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray700 +import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 import kotlinx.coroutines.launch @@ -79,7 +76,7 @@ fun DetailRestaurantScreen( DetailRestaurantImage() } item { - DetailRestaurantInfo() + DetailRestaurantMainInfo() } item { DetailRestaurantTabLayout(detailRestaurantViewModel) @@ -119,7 +116,7 @@ fun DetailRestaurantImage( } @Composable -fun DetailRestaurantInfo( +fun DetailRestaurantMainInfo( ) { Column( @@ -281,13 +278,56 @@ fun DetailRestaurantTabLayout( HorizontalPager(state = pagerState) { page -> when (page) { - 0 -> Text("This is Page 0", modifier = Modifier.fillMaxSize()) + 0 -> DetailRestaurantTabInfo(Modifier.padding(horizontal = 20.dp)) 1 -> Text("This is Page 1", modifier = Modifier.fillMaxSize()) 2 -> Text("This is Page 2", modifier = Modifier.fillMaxSize()) } } } +@Composable +fun DetailRestaurantTabInfo( + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier.padding(top = 20.dp), + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + modifier = Modifier.size(20.dp), + imageVector = ImageVector.vectorResource(R.drawable.icon_pin_location_mono), + contentDescription = "location", + colorFilter = ColorFilter.tint(Gray400), + ) + Text( + modifier = Modifier.padding(start = 4.dp), + text = "서울특별시 관악구 관악로 1", + color = Gray800, + fontSize = 14.sp, + style = EveryMealTypography.bodySmall + ) + } + Spacer(modifier = Modifier.padding(6.dp)) + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_call_mono), + contentDescription = "call", + ) + Text( + modifier = Modifier.padding(start = 4.dp), + text = "1533-2233", + color = Gray800, + fontSize = 14.sp, + style = EveryMealTypography.bodySmall + ) + } + } +} + @Preview @Composable fun PreviewDetailRestaurantScreen() { diff --git a/presentation/src/main/res/drawable/icon_call_mono.xml b/presentation/src/main/res/drawable/icon_call_mono.xml new file mode 100644 index 00000000..c2a371ae --- /dev/null +++ b/presentation/src/main/res/drawable/icon_call_mono.xml @@ -0,0 +1,10 @@ + + + From 18fe7c1791b8eec2a1cf77334010c7e5ffe81e7a Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 8 Oct 2023 03:00:03 +0900 Subject: [PATCH 20/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20Floating?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=B7=B0=20=EC=99=84=EC=84=B1=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 37 ++++++++++++++++++- .../src/main/res/drawable/icon_link_mono.xml | 14 +++++++ .../main/res/drawable/icon_pencil_mono.xml | 10 +++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 presentation/src/main/res/drawable/icon_link_mono.xml create mode 100644 presentation/src/main/res/drawable/icon_pencil_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index f08b793a..1df2f5aa 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Divider +import androidx.compose.material3.FabPosition import androidx.compose.material3.Scaffold import androidx.compose.material3.Tab import androidx.compose.material3.TabRow @@ -58,6 +59,7 @@ import com.everymeal.presentation.ui.theme.Gray600 import com.everymeal.presentation.ui.theme.Gray700 import com.everymeal.presentation.ui.theme.Gray800 import com.everymeal.presentation.ui.theme.Gray900 +import com.everymeal.presentation.ui.theme.Main100 import kotlinx.coroutines.launch @Composable @@ -67,7 +69,23 @@ fun DetailRestaurantScreen( Scaffold( topBar = { SaveTopBar(title = "") - } + }, + floatingActionButton = { + Row( + modifier = Modifier + .padding(bottom = 20.dp) + .clip(RoundedCornerShape(100.dp)) + .background(color = Main100) + .padding(12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_pencil_mono), + contentDescription = "floating", + ) + } + }, + floatingActionButtonPosition = FabPosition.End, ) { innerPadding -> LazyColumn( modifier = Modifier.padding(innerPadding), @@ -325,6 +343,23 @@ fun DetailRestaurantTabInfo( style = EveryMealTypography.bodySmall ) } + Spacer(modifier = Modifier.padding(6.dp)) + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_link_mono), + contentDescription = "link", + ) + Text( + modifier = Modifier.padding(start = 4.dp), + text = "카카오맵 이동하기", + color = Gray800, + fontSize = 14.sp, + style = EveryMealTypography.bodySmall + ) + } + Spacer(modifier = Modifier.padding(18.dp)) } } diff --git a/presentation/src/main/res/drawable/icon_link_mono.xml b/presentation/src/main/res/drawable/icon_link_mono.xml new file mode 100644 index 00000000..755997df --- /dev/null +++ b/presentation/src/main/res/drawable/icon_link_mono.xml @@ -0,0 +1,14 @@ + + + + diff --git a/presentation/src/main/res/drawable/icon_pencil_mono.xml b/presentation/src/main/res/drawable/icon_pencil_mono.xml new file mode 100644 index 00000000..d1a1e280 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_pencil_mono.xml @@ -0,0 +1,10 @@ + + + From 662ae7647ad39314f2b597559d0db523c2db9e90 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 8 Oct 2023 21:41:38 +0900 Subject: [PATCH 21/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EA=B7=B8=EB=A6=AC=EB=93=9C=20=EB=B7=B0=20=EC=82=AC?= =?UTF-8?q?=EC=A7=84=20=EC=B6=94=EA=B0=80=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 1df2f5aa..3e4d1620 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -16,6 +16,9 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape @@ -297,8 +300,8 @@ fun DetailRestaurantTabLayout( HorizontalPager(state = pagerState) { page -> when (page) { 0 -> DetailRestaurantTabInfo(Modifier.padding(horizontal = 20.dp)) - 1 -> Text("This is Page 1", modifier = Modifier.fillMaxSize()) - 2 -> Text("This is Page 2", modifier = Modifier.fillMaxSize()) + 1 -> DetailRestaurantTabImage() + 2 -> DetailRestaurantReview() } } } @@ -363,6 +366,48 @@ fun DetailRestaurantTabInfo( } } +@Composable +fun DetailRestaurantTabImage() { + // Mock Data + val items = listOf( + R.drawable.food_ex_1, + R.drawable.food_ex_2, + R.drawable.food_ex_3, + R.drawable.food_ex_1, + R.drawable.food_ex_2, + R.drawable.food_ex_3, + R.drawable.food_ex_1, + R.drawable.food_ex_2, + R.drawable.food_ex_3, + ) + + Column { + for (rowItems in items.chunked(3)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 3.dp), + ) { + for (item in rowItems) { + Image( + painter = painterResource(id = item), + contentDescription = null, + modifier = Modifier + .padding(end = if(rowItems.indexOf(item) != 2) 3.dp else 0.dp) + .weight(1f) + .aspectRatio(1f) + ) + } + } + } + } +} + +@Composable +fun DetailRestaurantReview() { + +} + @Preview @Composable fun PreviewDetailRestaurantScreen() { From 2c61c32957fac5cbf91cf12556904fe8345f5f6a Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 8 Oct 2023 22:40:06 +0900 Subject: [PATCH 22/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20Sta?= =?UTF-8?q?te=20=EC=B6=94=EA=B0=80=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantContract.kt | 2 ++ .../ui/restaurant/DetailRestaurantScreen.kt | 26 ++++++++++++++++++- .../restaurant/DetailRestaurantViewModel.kt | 7 +++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt index f9e9498d..520d8445 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantContract.kt @@ -9,10 +9,12 @@ import com.everymeal.presentation.base.ViewState data class DetailRestaurantState( val uiState: LoadState = LoadState.SUCCESS, val selectedTabIndex: Int = 0, + val isFabClicked: Boolean = false, ) : ViewState sealed class DetailRestaurantEvent : ViewEvent { data class OnTabSelectedChanged(val selectedTabIndex: Int) : DetailRestaurantEvent() + data class OnFloatingButtonClick(val isFabClicked: Boolean) : DetailRestaurantEvent() } sealed class DetailRestaurantEffect : ViewSideEffect { diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 3e4d1620..e10c7a0e 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -22,6 +23,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button import androidx.compose.material3.Divider import androidx.compose.material3.FabPosition import androidx.compose.material3.Scaffold @@ -34,7 +36,10 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState 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.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -69,6 +74,8 @@ import kotlinx.coroutines.launch fun DetailRestaurantScreen( detailRestaurantViewModel: DetailRestaurantViewModel = hiltViewModel(), ) { + val viewState by detailRestaurantViewModel.viewState.collectAsState() + Scaffold( topBar = { SaveTopBar(title = "") @@ -79,7 +86,10 @@ fun DetailRestaurantScreen( .padding(bottom = 20.dp) .clip(RoundedCornerShape(100.dp)) .background(color = Main100) - .padding(12.dp), + .padding(12.dp) + .clickable { + detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnFloatingButtonClick(!viewState.isFabClicked)) + }, verticalAlignment = Alignment.CenterVertically, ) { Image( @@ -104,6 +114,20 @@ fun DetailRestaurantScreen( } } } + if (viewState.isFabClicked) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha=0.5f)) + .clickable { + detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnFloatingButtonClick(false)) + } + ) + Box(contentAlignment=Alignment.BottomEnd){ + Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=80.dp, bottom=120.dp)){ Text("Button 1") } + Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=80.dp, bottom=60.dp)){ Text("Button 2") } + } + } } @Composable diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt index ef6440fe..cb8b54c7 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantViewModel.kt @@ -18,15 +18,22 @@ class DetailRestaurantViewModel @Inject constructor( selectedTabIndex = event.selectedTabIndex ) } + is DetailRestaurantEvent.OnFloatingButtonClick -> { + reflectUpdateState( + isFabClicked = event.isFabClicked + ) + } } } private fun reflectUpdateState( selectedTabIndex: Int = viewState.value.selectedTabIndex, + isFabClicked: Boolean = viewState.value.isFabClicked, ) { updateState { copy( selectedTabIndex = selectedTabIndex, + isFabClicked = isFabClicked, ) } } From 598b75eb0b05777f1f09a5352c0f20338f918b09 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Sun, 8 Oct 2023 23:41:59 +0900 Subject: [PATCH 23/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=ED=94=8C?= =?UTF-8?q?=EB=A1=9C=ED=8C=85=EB=B2=84=ED=8A=BC=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=ED=99=94=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index e10c7a0e..6acec065 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -17,9 +17,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape @@ -36,10 +33,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState 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.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -85,16 +79,25 @@ fun DetailRestaurantScreen( modifier = Modifier .padding(bottom = 20.dp) .clip(RoundedCornerShape(100.dp)) - .background(color = Main100) + .background(if(viewState.isFabClicked) Gray100 else Main100) .padding(12.dp) .clickable { - detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnFloatingButtonClick(!viewState.isFabClicked)) + detailRestaurantViewModel.setEvent( + DetailRestaurantEvent.OnFloatingButtonClick( + !viewState.isFabClicked + ) + ) }, verticalAlignment = Alignment.CenterVertically, ) { Image( - imageVector = ImageVector.vectorResource(R.drawable.icon_pencil_mono), + imageVector = + if(viewState.isFabClicked) + ImageVector.vectorResource(R.drawable.icon_x_mono) + else + ImageVector.vectorResource(R.drawable.icon_pencil_mono), contentDescription = "floating", + colorFilter = ColorFilter.tint(if(viewState.isFabClicked) Gray800 else Color.White), ) } }, @@ -113,19 +116,23 @@ fun DetailRestaurantScreen( DetailRestaurantTabLayout(detailRestaurantViewModel) } } - } - if (viewState.isFabClicked) { - Box( - modifier = Modifier - .fillMaxSize() - .background(Color.Black.copy(alpha=0.5f)) - .clickable { - detailRestaurantViewModel.setEvent(DetailRestaurantEvent.OnFloatingButtonClick(false)) - } - ) - Box(contentAlignment=Alignment.BottomEnd){ - Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=80.dp, bottom=120.dp)){ Text("Button 1") } - Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=80.dp, bottom=60.dp)){ Text("Button 2") } + if (viewState.isFabClicked) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = 0.5f)) + .clickable { + detailRestaurantViewModel.setEvent( + DetailRestaurantEvent.OnFloatingButtonClick( + false + ) + ) + }, + contentAlignment=Alignment.BottomEnd + ) { + Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=20.dp, bottom=160.dp)){ Text("Button 1") } + Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=20.dp, bottom=100.dp)){ Text("Button 2") } + } } } } @@ -417,7 +424,7 @@ fun DetailRestaurantTabImage() { painter = painterResource(id = item), contentDescription = null, modifier = Modifier - .padding(end = if(rowItems.indexOf(item) != 2) 3.dp else 0.dp) + .padding(end = if (rowItems.indexOf(item) != 2) 3.dp else 0.dp) .weight(1f) .aspectRatio(1f) ) From 0e389e513b25b59337fa9d04dc70102dfcbe1101 Mon Sep 17 00:00:00 2001 From: sgsk88 Date: Mon, 9 Oct 2023 00:07:39 +0900 Subject: [PATCH 24/24] =?UTF-8?q?[feature/detail=5Frestaurant]=20=EB=94=A4?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=20=EB=B2=84=ED=8A=BC=20=EB=91=90=EA=B0=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/restaurant/DetailRestaurantScreen.kt | 42 +++++++++++++++++-- .../main/res/drawable/icon_camera_mono.xml | 14 +++++++ .../main/res/drawable/icon_document_mono.xml | 14 +++++++ presentation/src/main/res/values/strings.xml | 3 ++ 4 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 presentation/src/main/res/drawable/icon_camera_mono.xml create mode 100644 presentation/src/main/res/drawable/icon_document_mono.xml diff --git a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt index 6acec065..883628fa 100644 --- a/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt +++ b/presentation/src/main/java/com/everymeal/presentation/ui/restaurant/DetailRestaurantScreen.kt @@ -79,7 +79,7 @@ fun DetailRestaurantScreen( modifier = Modifier .padding(bottom = 20.dp) .clip(RoundedCornerShape(100.dp)) - .background(if(viewState.isFabClicked) Gray100 else Main100) + .background(if (viewState.isFabClicked) Gray100 else Main100) .padding(12.dp) .clickable { detailRestaurantViewModel.setEvent( @@ -130,8 +130,44 @@ fun DetailRestaurantScreen( }, contentAlignment=Alignment.BottomEnd ) { - Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=20.dp, bottom=160.dp)){ Text("Button 1") } - Button(onClick={/*Handle click*/},modifier=Modifier.padding(end=20.dp, bottom=100.dp)){ Text("Button 2") } + Row( + modifier = Modifier + .padding(end = 20.dp, bottom = 160.dp) + .clip(RoundedCornerShape(6.dp)) + .background(color = Gray100) + .padding(vertical = 7.dp, horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_camera_mono), + contentDescription = "camera", + ) + Text( + modifier = Modifier.padding(start = 2.dp), + text = stringResource(R.string.restaurant_only_picture), + color = Gray900, + style = EveryMealTypography.bodySmall + ) + } + Row( + modifier = Modifier + .padding(end = 20.dp, bottom = 100.dp) + .clip(RoundedCornerShape(6.dp)) + .background(color = Gray100) + .padding(vertical = 7.dp, horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + imageVector = ImageVector.vectorResource(R.drawable.icon_document_mono), + contentDescription = "review", + ) + Text( + modifier = Modifier.padding(start = 2.dp), + text = stringResource(R.string.restaurant_review), + color = Gray900, + style = EveryMealTypography.bodySmall + ) + } } } } diff --git a/presentation/src/main/res/drawable/icon_camera_mono.xml b/presentation/src/main/res/drawable/icon_camera_mono.xml new file mode 100644 index 00000000..bbe6e048 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_camera_mono.xml @@ -0,0 +1,14 @@ + + + + diff --git a/presentation/src/main/res/drawable/icon_document_mono.xml b/presentation/src/main/res/drawable/icon_document_mono.xml new file mode 100644 index 00000000..bc1613b0 --- /dev/null +++ b/presentation/src/main/res/drawable/icon_document_mono.xml @@ -0,0 +1,14 @@ + + + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index eb845567..dfb0b110 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -88,4 +88,7 @@ 공유하기 + 사진만 올리기 + 리뷰 작성하기 +