From 094cca3052064d9e0bcdce96529723434201e640 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Tue, 24 Dec 2024 16:14:52 +0000 Subject: [PATCH 01/11] feat: notes are now loaded and saved. --- .../com/example/paintracker/MainActivity.kt | 25 ++--- .../paintracker/RecordNotesFragment.kt | 93 ++++++++++++++++++- .../example/paintracker/RecordPainFragment.kt | 13 +-- .../main/res/layout/fragment_record_notes.xml | 14 +++ 4 files changed, 121 insertions(+), 24 deletions(-) diff --git a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt b/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt index c6cc28a..9d39734 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt @@ -14,12 +14,15 @@ import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.example.paintracker.databinding.ActivityMainBinding import com.google.android.material.bottomnavigation.BottomNavigationView +import dagger.hilt.android.AndroidEntryPoint import java.time.LocalDate +@AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var binding: ActivityMainBinding + private var selectedDate: LocalDate = LocalDate.now() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -66,27 +69,27 @@ class MainActivity : AppCompatActivity() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_content_main) as? NavHostFragment val currentFragment = navHostFragment?.childFragmentManager?.primaryNavigationFragment var painVisualiser: PainVisualiser? = null + var recordNotesFragment: RecordNotesFragment? = null if (currentFragment is RecordPainFragment) { painVisualiser = currentFragment.painVisualiser } - - if(painVisualiser == null) { - Toast.makeText(this, "Pain visualiser not found", Toast.LENGTH_SHORT).show() - return + else if(currentFragment is RecordNotesFragment) { + recordNotesFragment = currentFragment } - val year = painVisualiser.selectedDate.year //calendar.get(Calendar.YEAR) - val month = painVisualiser.selectedDate.monthValue - 1 //calendar.get(Calendar.MONTH) - val day = painVisualiser.selectedDate.dayOfMonth //calendar.get(Calendar.DAY_OF_MONTH) + val year = selectedDate.year + val month = selectedDate.monthValue - 1 + val day = selectedDate.dayOfMonth val datePickerDialog = DatePickerDialog( this, { _, selectedYear, selectedMonth, selectedDay -> - // Handle the selected date - val selectedDate = "$selectedDay/${selectedMonth + 1}/$selectedYear" - Toast.makeText(this, "Selected Date: $selectedDate", Toast.LENGTH_SHORT).show() + val curSelectedDate = "$selectedDay/${selectedMonth + 1}/$selectedYear" + Toast.makeText(this, "Selected Date: $curSelectedDate", Toast.LENGTH_SHORT).show() - painVisualiser.selectedDate = LocalDate.of(selectedYear, selectedMonth + 1, selectedDay) + selectedDate = LocalDate.of(selectedYear, selectedMonth + 1, selectedDay) + painVisualiser?.selectedDate = selectedDate + recordNotesFragment?.selectedDate = selectedDate }, year, month, diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt index 0a8f11e..c3237c3 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt @@ -1,34 +1,119 @@ package com.example.paintracker import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout.INVISIBLE +import android.widget.LinearLayout.VISIBLE import com.example.paintracker.databinding.FragmentRecordNotesBinding +import com.example.paintracker.interfaces.IPathService +import com.example.paintracker.interfaces.Path +import com.google.android.material.floatingactionbutton.FloatingActionButton +import dagger.hilt.android.AndroidEntryPoint +import java.io.File +import java.nio.file.Paths +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import javax.inject.Inject -class RecordNotesFragment : Fragment() { +@AndroidEntryPoint +class RecordNotesFragment : Fragment () { + @Inject + lateinit var pathService: IPathService + + var selectedDate: LocalDate = LocalDate.now() + set(value) { + field = value + + isDirty = false + reflectIsDirty() + + loadNotes() + } private var _binding: FragmentRecordNotesBinding? = null private val binding get() = _binding!! + private var saveButton: FloatingActionButton? = null + private var isDirty: Boolean = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentRecordNotesBinding.inflate(inflater, container, false) + saveButton = _binding!!.saveButton + + saveButton!!.setOnClickListener { + saveNotes() + isDirty = false + reflectIsDirty() + } + return binding.root } - /*override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - }*/ + + binding.notesEditText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + isDirty = true + reflectIsDirty() + } + }) + + loadNotes() + } override fun onDestroyView() { super.onDestroyView() _binding = null } + + private fun reflectIsDirty() { + saveButton!!.visibility = if (isDirty) VISIBLE else INVISIBLE + } + + private fun loadNotes() { + val dataRoot = pathService.getPath(Path.APPDATAROOT) + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = selectedDate.format(formatter) + val datePath = Paths.get(dataRoot).resolve(datePart) + val notesPath = datePath.resolve("notes.txt") + val notes = File(notesPath.toString()) + if (notes.exists()) { + val fileContents = notes.readText() + binding.notesEditText.setText(fileContents) + } + else { + binding.notesEditText.setText("") + } + } + + private fun saveNotes() { + val dataRoot = pathService.getPath(Path.APPDATAROOT) + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = selectedDate.format(formatter) + val datePath = Paths.get(dataRoot).resolve(datePart) + val notesPath = datePath.resolve("notes.txt") + val notesDirectory = datePath.toFile() + if (!notesDirectory.exists()) { + notesDirectory.mkdirs() + } + + val notesContent = binding.notesEditText.text.toString() + File(notesPath.toString()).writeText(notesContent) + } } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt index 748b28d..1c9f200 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt @@ -7,17 +7,12 @@ import android.view.View import android.view.ViewGroup import com.example.paintracker.databinding.FragmentRecordPainBinding -/** - * A simple [Fragment] subclass as the default destination in the navigation. - */ class RecordPainFragment : Fragment() { var painVisualiser: PainVisualiser? = null private var _binding: FragmentRecordPainBinding? = null - // This property is only valid between onCreateView and - // onDestroyView. private val binding get() = _binding!! override fun onCreateView( @@ -27,14 +22,14 @@ class RecordPainFragment : Fragment() { _binding = FragmentRecordPainBinding.inflate(inflater, container, false) - painVisualiser = _binding!!.painVisualiser - return binding.root } - /*override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - }*/ + + painVisualiser = _binding!!.painVisualiser + } override fun onDestroyView() { super.onDestroyView() diff --git a/PainTracker/app/src/main/res/layout/fragment_record_notes.xml b/PainTracker/app/src/main/res/layout/fragment_record_notes.xml index 5782352..8f57a66 100644 --- a/PainTracker/app/src/main/res/layout/fragment_record_notes.xml +++ b/PainTracker/app/src/main/res/layout/fragment_record_notes.xml @@ -5,6 +5,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:fitsSystemWindows="true" tools:context=".RecordNotesFragment"> + + \ No newline at end of file From dae4914ccb59a6d2acadf72d80ef48e5f4977d9d Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Tue, 24 Dec 2024 17:17:26 +0000 Subject: [PATCH 02/11] feat: fixed a whole bunch of shit and made other bits super messy, Kotlin sucks... --- .../com/example/paintracker/MainActivity.kt | 19 +++------- .../com/example/paintracker/PainVisualiser.kt | 4 ++ .../paintracker/RecordNotesFragment.kt | 38 ++++++++++++------- .../example/paintracker/RecordPainFragment.kt | 21 ++++++++++ .../com/example/paintracker/ServiceModule.kt | 8 ++++ .../paintracker/interfaces/IPainContext.kt | 7 ++++ .../paintracker/services/Observable.kt | 17 +++++++++ .../paintracker/services/PainContext.kt | 11 ++++++ 8 files changed, 97 insertions(+), 28 deletions(-) create mode 100644 PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt create mode 100644 PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt create mode 100644 PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt diff --git a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt b/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt index 9d39734..0a04a4c 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt @@ -10,15 +10,18 @@ import androidx.navigation.ui.setupActionBarWithNavController import android.view.Menu import android.view.MenuItem import android.widget.Toast -import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.example.paintracker.databinding.ActivityMainBinding +import com.example.paintracker.interfaces.IPainContext import com.google.android.material.bottomnavigation.BottomNavigationView import dagger.hilt.android.AndroidEntryPoint import java.time.LocalDate +import javax.inject.Inject @AndroidEntryPoint class MainActivity : AppCompatActivity() { + @Inject + lateinit var painContext: IPainContext private lateinit var appBarConfiguration: AppBarConfiguration private lateinit var binding: ActivityMainBinding @@ -66,17 +69,6 @@ class MainActivity : AppCompatActivity() { } private fun showDatePickerDialog() { - val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment_content_main) as? NavHostFragment - val currentFragment = navHostFragment?.childFragmentManager?.primaryNavigationFragment - var painVisualiser: PainVisualiser? = null - var recordNotesFragment: RecordNotesFragment? = null - if (currentFragment is RecordPainFragment) { - painVisualiser = currentFragment.painVisualiser - } - else if(currentFragment is RecordNotesFragment) { - recordNotesFragment = currentFragment - } - val year = selectedDate.year val month = selectedDate.monthValue - 1 val day = selectedDate.dayOfMonth @@ -88,8 +80,7 @@ class MainActivity : AppCompatActivity() { Toast.makeText(this, "Selected Date: $curSelectedDate", Toast.LENGTH_SHORT).show() selectedDate = LocalDate.of(selectedYear, selectedMonth + 1, selectedDay) - painVisualiser?.selectedDate = selectedDate - recordNotesFragment?.selectedDate = selectedDate + painContext.selectedDate = selectedDate }, year, month, diff --git a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt index 9ab0a5d..42f1c43 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt @@ -34,6 +34,10 @@ class PainVisualiser @JvmOverloads constructor( var selectedDate: LocalDate = LocalDate.now() set(value) { + if(field == value) { + return + } + field = value visualiserLayerIoService.loadAll(value, visualLayers, signaturePad.width, signaturePad.height) diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt index c3237c3..e485127 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt @@ -10,36 +10,30 @@ import android.view.ViewGroup import android.widget.LinearLayout.INVISIBLE import android.widget.LinearLayout.VISIBLE import com.example.paintracker.databinding.FragmentRecordNotesBinding +import com.example.paintracker.interfaces.IPainContext import com.example.paintracker.interfaces.IPathService import com.example.paintracker.interfaces.Path +import com.example.paintracker.services.PainContext import com.google.android.material.floatingactionbutton.FloatingActionButton import dagger.hilt.android.AndroidEntryPoint import java.io.File import java.nio.file.Paths -import java.time.LocalDate import java.time.format.DateTimeFormatter import javax.inject.Inject @AndroidEntryPoint class RecordNotesFragment : Fragment () { + @Inject + lateinit var painContext: IPainContext @Inject lateinit var pathService: IPathService - var selectedDate: LocalDate = LocalDate.now() - set(value) { - field = value - - isDirty = false - reflectIsDirty() - - loadNotes() - } - private var _binding: FragmentRecordNotesBinding? = null private val binding get() = _binding!! private var saveButton: FloatingActionButton? = null private var isDirty: Boolean = false + private var existingNotes: String = "" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -69,11 +63,22 @@ class RecordNotesFragment : Fragment () { } override fun afterTextChanged(s: Editable?) { - isDirty = true + isDirty = (existingNotes != s.toString()) reflectIsDirty() } }) + val painContext: PainContext = painContext as PainContext + painContext.addChangeListener { propertyName, oldValue, newValue -> + loadNotes() + } + + loadNotes() + } + + override fun onResume() { + super.onResume() + loadNotes() } @@ -87,14 +92,19 @@ class RecordNotesFragment : Fragment () { } private fun loadNotes() { + if(_binding == null) { + return + } + val dataRoot = pathService.getPath(Path.APPDATAROOT) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = selectedDate.format(formatter) + val datePart = painContext.selectedDate.format(formatter) val datePath = Paths.get(dataRoot).resolve(datePart) val notesPath = datePath.resolve("notes.txt") val notes = File(notesPath.toString()) if (notes.exists()) { val fileContents = notes.readText() + existingNotes = fileContents binding.notesEditText.setText(fileContents) } else { @@ -105,7 +115,7 @@ class RecordNotesFragment : Fragment () { private fun saveNotes() { val dataRoot = pathService.getPath(Path.APPDATAROOT) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = selectedDate.format(formatter) + val datePart = painContext.selectedDate.format(formatter) val datePath = Paths.get(dataRoot).resolve(datePart) val notesPath = datePath.resolve("notes.txt") val notesDirectory = datePath.toFile() diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt index 1c9f200..8891c0f 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt @@ -6,8 +6,16 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.example.paintracker.databinding.FragmentRecordPainBinding +import com.example.paintracker.interfaces.IPainContext +import com.example.paintracker.services.PainContext +import dagger.hilt.android.AndroidEntryPoint +import java.time.LocalDate +import javax.inject.Inject +@AndroidEntryPoint class RecordPainFragment : Fragment() { + @Inject + lateinit var painContext: IPainContext var painVisualiser: PainVisualiser? = null @@ -29,6 +37,19 @@ class RecordPainFragment : Fragment() { super.onViewCreated(view, savedInstanceState) painVisualiser = _binding!!.painVisualiser + + val painContext: PainContext = painContext as PainContext + painContext.addChangeListener { propertyName, oldValue, newValue -> + if(propertyName == "selectedDate") { + painVisualiser!!.selectedDate = newValue as LocalDate + } + } + } + + override fun onResume() { + super.onResume() + + painVisualiser!!.selectedDate = painContext.selectedDate } override fun onDestroyView() { diff --git a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt index 66c28d4..86bf448 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt @@ -3,10 +3,12 @@ package com.example.paintracker import android.content.Context import com.example.paintracker.interfaces.IBitmapLoaderService import com.example.paintracker.interfaces.IConfigService +import com.example.paintracker.interfaces.IPainContext import com.example.paintracker.interfaces.IPathService import com.example.paintracker.interfaces.IVisualiserLayerIoService import com.example.paintracker.services.BitmapLoaderService import com.example.paintracker.services.ConfigService +import com.example.paintracker.services.PainContext import com.example.paintracker.services.PathService import com.example.paintracker.services.VisualiserLayerIoService import dagger.Module @@ -47,4 +49,10 @@ object ServiceModule { fun provideBitmapLoaderService(): IBitmapLoaderService { return BitmapLoaderService() } + + @Provides + @Singleton + fun providePainContext(): IPainContext { + return PainContext() + } } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt new file mode 100644 index 0000000..0cb6f4c --- /dev/null +++ b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt @@ -0,0 +1,7 @@ +package com.example.paintracker.interfaces + +import java.time.LocalDate + +interface IPainContext { + var selectedDate: LocalDate +} \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt new file mode 100644 index 0000000..80d38b0 --- /dev/null +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt @@ -0,0 +1,17 @@ +package com.example.paintracker.services + +open class Observable { + private val listeners = mutableListOf<(String, Any?, Any?) -> Unit>() + + fun addChangeListener(listener: (propertyName: String, oldValue: Any?, newValue: Any?) -> Unit) { + listeners.add(listener) + } + + fun removeChangeListener(listener: (propertyName: String, oldValue: Any?, newValue: Any?) -> Unit) { + listeners.remove(listener) + } + + protected fun notifyListeners(propertyName: String, oldValue: Any?, newValue: Any?) { + listeners.forEach { it(propertyName, oldValue, newValue) } + } +} \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt new file mode 100644 index 0000000..9b64a72 --- /dev/null +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt @@ -0,0 +1,11 @@ +package com.example.paintracker.services + +import com.example.paintracker.interfaces.IPainContext +import java.time.LocalDate +import kotlin.properties.Delegates + +class PainContext : Observable(), IPainContext { + override var selectedDate: LocalDate by Delegates.observable(LocalDate.now()) { _, oldValue, newValue -> + notifyListeners("selectedDate", oldValue, newValue) + } +} \ No newline at end of file From 5bd476c7f1a01288e6e1d05e7d14bd299e351c84 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Tue, 24 Dec 2024 18:18:13 +0000 Subject: [PATCH 03/11] chore: slight refactoring --- .../java/com/example/paintracker/PainVisualiser.kt | 13 +++---------- .../com/example/paintracker/RecordNotesFragment.kt | 2 +- .../com/example/paintracker/RecordPainFragment.kt | 2 +- .../java/com/example/paintracker/ServiceModule.kt | 2 +- .../paintracker/{services => base}/Observable.kt | 2 +- .../paintracker/{services => data}/PainContext.kt | 3 ++- .../app/src/main/res/menu/bottom_nav_menu.xml | 7 ++++--- 7 files changed, 13 insertions(+), 18 deletions(-) rename PainTracker/app/src/main/java/com/example/paintracker/{services => base}/Observable.kt (93%) rename PainTracker/app/src/main/java/com/example/paintracker/{services => data}/PainContext.kt (80%) diff --git a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt index 42f1c43..a00a2fa 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt @@ -31,6 +31,8 @@ class PainVisualiser @JvmOverloads constructor( private val configService: IConfigService private val visualiserLayerIoService: IVisualiserLayerIoService + private val frontImageRes = R.drawable.body_front + private val backImageRes = R.drawable.body_back var selectedDate: LocalDate = LocalDate.now() set(value) { @@ -73,6 +75,7 @@ class PainVisualiser @JvmOverloads constructor( } } + private var signaturePad: SignaturePad private var imageView: ImageView private var frontButton: Button @@ -86,15 +89,8 @@ class PainVisualiser @JvmOverloads constructor( private var isDirty = false private var selectedCategory: PainCategory? = null private var selectedVisualiserLayer: VisualiserLayer? = null - - // Images for front and back - private val frontImageRes = R.drawable.body_front - private val backImageRes = R.drawable.body_back - - // Storage for drawing data private var frontDrawing: Bitmap? = null private var backDrawing: Bitmap? = null - private var visualLayers: MutableList = mutableListOf() init { @@ -107,10 +103,8 @@ class PainVisualiser @JvmOverloads constructor( configService = entryPoint.getConfigService() visualiserLayerIoService = entryPoint.getVisualiserLayerIoService() - // Inflate the layout LayoutInflater.from(context).inflate(R.layout.pain_visualiser, this, true) - // Find views signaturePad = findViewById(R.id.signaturePad) imageView = findViewById(R.id.imageView) frontButton = findViewById(R.id.buttonFront) @@ -120,7 +114,6 @@ class PainVisualiser @JvmOverloads constructor( saveButton = findViewById(R.id.saveButton) deleteButton = findViewById(R.id.deleteButton) - // Set initial image imageView.setImageResource(frontImageRes) frontButton.setOnClickListener { diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt index e485127..6b9b971 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt @@ -13,7 +13,7 @@ import com.example.paintracker.databinding.FragmentRecordNotesBinding import com.example.paintracker.interfaces.IPainContext import com.example.paintracker.interfaces.IPathService import com.example.paintracker.interfaces.Path -import com.example.paintracker.services.PainContext +import com.example.paintracker.data.PainContext import com.google.android.material.floatingactionbutton.FloatingActionButton import dagger.hilt.android.AndroidEntryPoint import java.io.File diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt index 8891c0f..21d8858 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt @@ -7,7 +7,7 @@ import android.view.View import android.view.ViewGroup import com.example.paintracker.databinding.FragmentRecordPainBinding import com.example.paintracker.interfaces.IPainContext -import com.example.paintracker.services.PainContext +import com.example.paintracker.data.PainContext import dagger.hilt.android.AndroidEntryPoint import java.time.LocalDate import javax.inject.Inject diff --git a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt index 86bf448..9e6f936 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt @@ -8,7 +8,7 @@ import com.example.paintracker.interfaces.IPathService import com.example.paintracker.interfaces.IVisualiserLayerIoService import com.example.paintracker.services.BitmapLoaderService import com.example.paintracker.services.ConfigService -import com.example.paintracker.services.PainContext +import com.example.paintracker.data.PainContext import com.example.paintracker.services.PathService import com.example.paintracker.services.VisualiserLayerIoService import dagger.Module diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt b/PainTracker/app/src/main/java/com/example/paintracker/base/Observable.kt similarity index 93% rename from PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt rename to PainTracker/app/src/main/java/com/example/paintracker/base/Observable.kt index 80d38b0..497037d 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/Observable.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/base/Observable.kt @@ -1,4 +1,4 @@ -package com.example.paintracker.services +package com.example.paintracker.base open class Observable { private val listeners = mutableListOf<(String, Any?, Any?) -> Unit>() diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt b/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt similarity index 80% rename from PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt rename to PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt index 9b64a72..fad4dc0 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/PainContext.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt @@ -1,5 +1,6 @@ -package com.example.paintracker.services +package com.example.paintracker.data +import com.example.paintracker.base.Observable import com.example.paintracker.interfaces.IPainContext import java.time.LocalDate import kotlin.properties.Delegates diff --git a/PainTracker/app/src/main/res/menu/bottom_nav_menu.xml b/PainTracker/app/src/main/res/menu/bottom_nav_menu.xml index 5555e14..a8eb0c5 100644 --- a/PainTracker/app/src/main/res/menu/bottom_nav_menu.xml +++ b/PainTracker/app/src/main/res/menu/bottom_nav_menu.xml @@ -2,9 +2,10 @@ + android:icon="@android:drawable/ic_menu_report_image" + android:title="@string/BottomNavMenuPain" /> + android:icon="@android:drawable/ic_menu_recent_history" + android:title="@string/BottomNavMenuNotes" /> \ No newline at end of file From d6adfd0844329f54afaef24e2f0aafe2035d6980 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Tue, 24 Dec 2024 18:18:27 +0000 Subject: [PATCH 04/11] chore: string res' --- PainTracker/app/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PainTracker/app/src/main/res/values/strings.xml b/PainTracker/app/src/main/res/values/strings.xml index 0267612..86bd8b5 100644 --- a/PainTracker/app/src/main/res/values/strings.xml +++ b/PainTracker/app/src/main/res/values/strings.xml @@ -14,4 +14,6 @@ Save Clear Enter your pain notes here + Pain + Notes \ No newline at end of file From b61e278d405ef92930c405fd33fe59c81ae21e70 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Tue, 24 Dec 2024 19:04:44 +0000 Subject: [PATCH 05/11] feat: can now delete all layers when show all is checked --- .../com/example/paintracker/PainVisualiser.kt | 27 ++++++++++++------- .../interfaces/IVisualiserLayerIoService.kt | 1 + .../services/VisualiserLayerIoService.kt | 19 +++++++++++-- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt index a00a2fa..09af233 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt @@ -150,14 +150,17 @@ class PainVisualiser @JvmOverloads constructor( } deleteButton.setOnClickListener { - if(!showAllLayers) { // Can't delete all layers yet + if(showAllLayers) { + visualiserLayerIoService.deleteLayers(selectedDate, visualLayers) + } + else { visualiserLayerIoService.deleteLayer(selectedDate, selectedVisualiserLayer!!, if(isFront) Side.FRONT else Side.BACK) - frontDrawing = selectedVisualiserLayer?.frontDrawing - backDrawing = selectedVisualiserLayer?.backDrawing - isDirty = false - reflectIsDirty() - switchDrawing() } + frontDrawing = selectedVisualiserLayer?.frontDrawing + backDrawing = selectedVisualiserLayer?.backDrawing + isDirty = false + reflectIsDirty() + switchDrawing() } signaturePad.setOnSignedListener(object : SignaturePad.OnSignedListener { @@ -185,17 +188,21 @@ class PainVisualiser @JvmOverloads constructor( saveButton.visibility = if (isDirty) VISIBLE else INVISIBLE } - private fun mergeAllLayers(): Bitmap { + private fun mergeAllLayers(): Bitmap? { Log.i("VisualiserLayerIoService","Merging all layers.") val resultBitmap = Bitmap.createBitmap(signaturePad.width, signaturePad.height, Bitmap.Config.ARGB_8888) val canvas = Canvas(resultBitmap) + var containsData = false for (visualLayer in visualLayers) { val drawing = if (isFront) visualLayer.frontDrawing else visualLayer.backDrawing - drawing?.let { canvas.drawBitmap(it, 0f, 0f, null) } + if(drawing != null) { + containsData = true + drawing.let { canvas.drawBitmap(it, 0f, 0f, null) } + } } - return resultBitmap + return if(containsData) resultBitmap else null } private fun checkAndSaveIfDirty(onCompleted: () -> Unit) { @@ -261,7 +268,7 @@ class PainVisualiser @JvmOverloads constructor( if (drawingToShow != null) { signaturePad.signatureBitmap = drawingToShow - deleteButton.visibility = if(showAllLayers) INVISIBLE else VISIBLE + deleteButton.visibility = VISIBLE } else { signaturePad.clear() deleteButton.visibility = INVISIBLE diff --git a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IVisualiserLayerIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IVisualiserLayerIoService.kt index 7f49e0c..ed4895e 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IVisualiserLayerIoService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IVisualiserLayerIoService.kt @@ -11,4 +11,5 @@ interface IVisualiserLayerIoService { fun loadAll(localDate: LocalDate, layers: MutableList, width: Int, height: Int) fun saveLayer(localDate: LocalDate, layer: VisualiserLayer, side: Side) fun deleteLayer(localDate: LocalDate, layer: VisualiserLayer, side: Side) + fun deleteLayers(localDate: LocalDate, layers: MutableList) } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt index 39c9774..f032b7f 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt @@ -44,12 +44,12 @@ class VisualiserLayerIoService @Inject constructor( if(frontPath.exists()) { Log.i("VisualiserLayerIoService","Loading front image '${frontPath.parent}'") - visualLayer.frontDrawing = BitmapFactory.decodeFile(frontPath.toString()) + visualLayer.frontDrawing = BitmapFactory.decodeFile(frontPath.toString()) // bitmapLoaderService.loadBitmap(frontPath.toString(), width, height) } if(backPath.exists()) { Log.i("VisualiserLayerIoService","Loading back image '${backPath.parent}'") - visualLayer.backDrawing = BitmapFactory.decodeFile(backPath.toString()) + visualLayer.backDrawing = BitmapFactory.decodeFile(backPath.toString()) // bitmapLoaderService.loadBitmap(backPath.toString(), width, height) } } } @@ -94,6 +94,21 @@ class VisualiserLayerIoService @Inject constructor( } } + override fun deleteLayers(localDate: LocalDate, layers: MutableList) { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = localDate.format(formatter) + val datePath = Paths.get(dataRoot).resolve(datePart) + for (visualLayer in layers) { + val layerPath = datePath.resolve(visualLayer.painCategory?.id) + val frontPath = layerPath.resolve("front.png") + val backPath = layerPath.resolve("back.png") + Files.deleteIfExists(frontPath) + Files.deleteIfExists(backPath) + visualLayer.frontDrawing = null + visualLayer.backDrawing = null + } + } + private fun saveBitmapToFile(bitmap: Bitmap, path: String) { val file = File(path) try { From 83a9f7345a608eaae74189fd62d0ea9f0eb88198 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 10:53:18 +0000 Subject: [PATCH 06/11] chore: moved some stuff around --- PainTracker/app/src/main/AndroidManifest.xml | 2 +- .../paintracker/{ => ui}/MainActivity.kt | 3 +- .../{ => ui}/RecordNotesFragment.kt | 2 +- .../{ => ui}/RecordPainFragment.kt | 3 +- .../{ => ui/widgets}/PainVisualiser.kt | 654 +++++++++--------- .../app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/fragment_record_notes.xml | 2 +- .../main/res/layout/fragment_record_pain.xml | 4 +- .../app/src/main/res/menu/menu_main.xml | 2 +- .../app/src/main/res/navigation/nav_graph.xml | 4 +- 10 files changed, 341 insertions(+), 337 deletions(-) rename PainTracker/app/src/main/java/com/example/paintracker/{ => ui}/MainActivity.kt (98%) rename PainTracker/app/src/main/java/com/example/paintracker/{ => ui}/RecordNotesFragment.kt (99%) rename PainTracker/app/src/main/java/com/example/paintracker/{ => ui}/RecordPainFragment.kt (94%) rename PainTracker/app/src/main/java/com/example/paintracker/{ => ui/widgets}/PainVisualiser.kt (97%) diff --git a/PainTracker/app/src/main/AndroidManifest.xml b/PainTracker/app/src/main/AndroidManifest.xml index cf6e620..83287f2 100644 --- a/PainTracker/app/src/main/AndroidManifest.xml +++ b/PainTracker/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:theme="@style/Theme.PainTracker" tools:targetApi="31"> diff --git a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt b/PainTracker/app/src/main/java/com/example/paintracker/ui/MainActivity.kt similarity index 98% rename from PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt rename to PainTracker/app/src/main/java/com/example/paintracker/ui/MainActivity.kt index 0a04a4c..30ad84b 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/MainActivity.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ui/MainActivity.kt @@ -1,4 +1,4 @@ -package com.example.paintracker +package com.example.paintracker.ui import android.app.DatePickerDialog import android.os.Bundle @@ -11,6 +11,7 @@ import android.view.Menu import android.view.MenuItem import android.widget.Toast import androidx.navigation.ui.setupWithNavController +import com.example.paintracker.R import com.example.paintracker.databinding.ActivityMainBinding import com.example.paintracker.interfaces.IPainContext import com.google.android.material.bottomnavigation.BottomNavigationView diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt similarity index 99% rename from PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt rename to PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt index 6b9b971..821adb2 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordNotesFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt @@ -1,4 +1,4 @@ -package com.example.paintracker +package com.example.paintracker.ui import android.os.Bundle import android.text.Editable diff --git a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordPainFragment.kt similarity index 94% rename from PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt rename to PainTracker/app/src/main/java/com/example/paintracker/ui/RecordPainFragment.kt index 21d8858..458c045 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/RecordPainFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordPainFragment.kt @@ -1,4 +1,4 @@ -package com.example.paintracker +package com.example.paintracker.ui import android.os.Bundle import androidx.fragment.app.Fragment @@ -8,6 +8,7 @@ import android.view.ViewGroup import com.example.paintracker.databinding.FragmentRecordPainBinding import com.example.paintracker.interfaces.IPainContext import com.example.paintracker.data.PainContext +import com.example.paintracker.ui.widgets.PainVisualiser import dagger.hilt.android.AndroidEntryPoint import java.time.LocalDate import javax.inject.Inject diff --git a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt b/PainTracker/app/src/main/java/com/example/paintracker/ui/widgets/PainVisualiser.kt similarity index 97% rename from PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt rename to PainTracker/app/src/main/java/com/example/paintracker/ui/widgets/PainVisualiser.kt index 09af233..2ee85ec 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/PainVisualiser.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ui/widgets/PainVisualiser.kt @@ -1,326 +1,328 @@ -package com.example.paintracker - -import android.app.AlertDialog -import android.content.Context -import android.content.res.ColorStateList -import android.graphics.Bitmap -import android.graphics.Canvas -import android.util.AttributeSet -import android.util.Log -import android.view.LayoutInflater -import android.widget.Button -import android.widget.CheckBox -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.PopupMenu -import com.example.paintracker.data.PainCategory -import com.example.paintracker.data.VisualiserLayer -import com.example.paintracker.interfaces.IConfigService -import com.example.paintracker.interfaces.IVisualiserLayerIoService -import com.example.paintracker.interfaces.Side -import com.github.gcacace.signaturepad.views.SignaturePad -import com.google.android.material.floatingactionbutton.FloatingActionButton -import dagger.hilt.android.EntryPointAccessors -import java.time.LocalDate - -class PainVisualiser @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : LinearLayout(context, attrs, defStyleAttr) { - - private val configService: IConfigService - private val visualiserLayerIoService: IVisualiserLayerIoService - private val frontImageRes = R.drawable.body_front - private val backImageRes = R.drawable.body_back - - var selectedDate: LocalDate = LocalDate.now() - set(value) { - if(field == value) { - return - } - - field = value - - visualiserLayerIoService.loadAll(value, visualLayers, signaturePad.width, signaturePad.height) - frontDrawing = selectedVisualiserLayer?.frontDrawing - backDrawing = selectedVisualiserLayer?.backDrawing - isDirty = false - reflectIsDirty() - - switchDrawing() - } - private var painCategories: List = emptyList() - set(value) { - field = value - if (value.isNotEmpty()) { - Log.i("VisualiserLayerIoService","Pain categories have changed, updating visual layers.") - visualLayers.clear() - value.forEach { category -> - visualLayers.add(VisualiserLayer(category, null, null)) - } - - selectedCategory = value[0] - updateSelectedVisualLayer() - updateCategoryButtonColor() - updateDrawingColor() - - visualiserLayerIoService.loadAll(selectedDate, visualLayers, signaturePad.width, signaturePad.height) - frontDrawing = selectedVisualiserLayer?.frontDrawing - backDrawing = selectedVisualiserLayer?.backDrawing - isDirty = false - reflectIsDirty() - - switchDrawing() - } - } - - - private var signaturePad: SignaturePad - private var imageView: ImageView - private var frontButton: Button - private var backButton: Button - private var categoryButton: FloatingActionButton - private var saveButton: FloatingActionButton - private var deleteButton: FloatingActionButton - private var showAllButton: CheckBox - private var isFront = true - private var showAllLayers = false - private var isDirty = false - private var selectedCategory: PainCategory? = null - private var selectedVisualiserLayer: VisualiserLayer? = null - private var frontDrawing: Bitmap? = null - private var backDrawing: Bitmap? = null - private var visualLayers: MutableList = mutableListOf() - - init { - Log.i("VisualiserLayerIoService","Initializing PainVisualizer...") - - val entryPoint = EntryPointAccessors.fromApplication( - context.applicationContext, - HiltServiceBridge::class.java - ) - configService = entryPoint.getConfigService() - visualiserLayerIoService = entryPoint.getVisualiserLayerIoService() - - LayoutInflater.from(context).inflate(R.layout.pain_visualiser, this, true) - - signaturePad = findViewById(R.id.signaturePad) - imageView = findViewById(R.id.imageView) - frontButton = findViewById(R.id.buttonFront) - backButton = findViewById(R.id.buttonBack) - categoryButton = findViewById(R.id.categoryButton) - showAllButton = findViewById(R.id.showAllButton) - saveButton = findViewById(R.id.saveButton) - deleteButton = findViewById(R.id.deleteButton) - - imageView.setImageResource(frontImageRes) - - frontButton.setOnClickListener { - checkAndSaveIfDirty { - isFront = true - imageView.setImageResource(frontImageRes) - switchDrawing() - } - } - - backButton.setOnClickListener { - checkAndSaveIfDirty { - isFront = false - imageView.setImageResource(backImageRes) - switchDrawing() - } - } - - categoryButton.setOnClickListener { showCategoryDropdown() } - - showAllButton.setOnClickListener { - checkAndSaveIfDirty { - showAllLayers = showAllButton.isChecked - val signaturePad = findViewById(R.id.signaturePad) - signaturePad.isEnabled = !showAllLayers - switchDrawing() - } - } - - saveButton.setOnClickListener { - saveCurrentDrawing() - isDirty = false - reflectIsDirty() - } - - deleteButton.setOnClickListener { - if(showAllLayers) { - visualiserLayerIoService.deleteLayers(selectedDate, visualLayers) - } - else { - visualiserLayerIoService.deleteLayer(selectedDate, selectedVisualiserLayer!!, if(isFront) Side.FRONT else Side.BACK) - } - frontDrawing = selectedVisualiserLayer?.frontDrawing - backDrawing = selectedVisualiserLayer?.backDrawing - isDirty = false - reflectIsDirty() - switchDrawing() - } - - signaturePad.setOnSignedListener(object : SignaturePad.OnSignedListener { - override fun onSigned() { - //isDirty = true - //reflectIsDirty() - } - - override fun onClear() { - isDirty = false - reflectIsDirty() - } - - override fun onStartSigning() { - isDirty = true - reflectIsDirty() - } - }) - - painCategories = configService.getCurrent().painCategories - Log.i("VisualiserLayerIoService","PainVisualizer initialized.") - } - - private fun reflectIsDirty() { - saveButton.visibility = if (isDirty) VISIBLE else INVISIBLE - } - - private fun mergeAllLayers(): Bitmap? { - Log.i("VisualiserLayerIoService","Merging all layers.") - val resultBitmap = Bitmap.createBitmap(signaturePad.width, signaturePad.height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(resultBitmap) - var containsData = false - - for (visualLayer in visualLayers) { - val drawing = if (isFront) visualLayer.frontDrawing else visualLayer.backDrawing - if(drawing != null) { - containsData = true - drawing.let { canvas.drawBitmap(it, 0f, 0f, null) } - } - } - - return if(containsData) resultBitmap else null - } - - private fun checkAndSaveIfDirty(onCompleted: () -> Unit) { - if (isDirty) { - Log.i("VisualiserLayerIoService","Changes have not been saved, prompting to save.") - AlertDialog.Builder(context) - .setTitle("Unsaved changes") - .setMessage("Do you want to save your changes?") - .setPositiveButton("Yes") { _, _ -> - saveCurrentDrawing() - onCompleted() // Proceed after saving - } - .setNegativeButton("No") { _, _ -> - onCompleted() // Proceed without saving - } - .setOnCancelListener { - onCompleted() // Treat cancel as proceeding without saving - } - .show() - } else { - onCompleted() // If not dirty, proceed immediately - } - } - - private fun updateSelectedVisualLayer() { - Log.i("VisualiserLayerIoService","Updating selected visual layer.") - val curSelectedVisualiserLayer = visualLayers.find { it.painCategory == selectedCategory } - if(curSelectedVisualiserLayer != null) - { - frontDrawing = curSelectedVisualiserLayer.frontDrawing - backDrawing = curSelectedVisualiserLayer.backDrawing - selectedVisualiserLayer = curSelectedVisualiserLayer - } - } - - private fun saveCurrentDrawing() { - Log.i("VisualiserLayerIoService","Saving current visual layer.") - val bitmap = Bitmap.createBitmap( - signaturePad.width, - signaturePad.height, - Bitmap.Config.ARGB_8888 - ) - val canvas = Canvas(bitmap) - - signaturePad.draw(canvas) - - if (isFront) { - frontDrawing = bitmap - selectedVisualiserLayer?.frontDrawing = frontDrawing - } else { - backDrawing = bitmap - selectedVisualiserLayer?.backDrawing = backDrawing - } - - visualiserLayerIoService.saveLayer(selectedDate, selectedVisualiserLayer!!, if(isFront) Side.FRONT else Side.BACK) - deleteButton.visibility = VISIBLE - } - - private fun switchDrawing() { - Log.i("VisualiserLayerIoService","Switching to ${if (isFront) "front" else "back"}.") - var drawingToShow = if (isFront) frontDrawing else backDrawing - drawingToShow = if (showAllLayers) mergeAllLayers() else drawingToShow - - if (drawingToShow != null) { - signaturePad.signatureBitmap = drawingToShow - deleteButton.visibility = VISIBLE - } else { - signaturePad.clear() - deleteButton.visibility = INVISIBLE - } - } - - private fun updateCategoryButtonColor() { - Log.i("VisualiserLayerIoService","Updating category button colour.") - selectedCategory?.let { - categoryButton.backgroundTintList = ColorStateList.valueOf(it.colour) - } - } - - private fun updateDrawingColor() { - Log.i("VisualiserLayerIoService","Updating drawing colour.") - selectedCategory?.let { - signaturePad.setPenColor(it.colour) - } - } - - private fun showCategoryDropdown() { - Log.i("VisualiserLayerIoService","Showing pain category dropdown.") - val popupMenu = PopupMenu(context, categoryButton) - painCategories.forEachIndexed { index, category -> - val menuItem = popupMenu.menu.add(0, index, index, category.displayName) - menuItem.isChecked = !showAllLayers && category == selectedCategory - menuItem.isCheckable = true - } - - popupMenu.setOnMenuItemClickListener { menuItem -> - Log.i("VisualiserLayerIoService","Selected pain category.") - - for (i in 0 until popupMenu.menu.size()) { - popupMenu.menu.getItem(i).isChecked = false - } - - checkAndSaveIfDirty { - showAllLayers = false - showAllButton.isChecked = showAllLayers - signaturePad.isEnabled = !showAllLayers - menuItem.isChecked = true - val selectedIndex = menuItem.itemId - selectedCategory = painCategories[selectedIndex] - updateSelectedVisualLayer() - updateCategoryButtonColor() - updateDrawingColor() - switchDrawing() - } - - true - } - - popupMenu.show() - } -} +package com.example.paintracker.ui.widgets + +import android.app.AlertDialog +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Bitmap +import android.graphics.Canvas +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.widget.Button +import android.widget.CheckBox +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.PopupMenu +import com.example.paintracker.HiltServiceBridge +import com.example.paintracker.R +import com.example.paintracker.data.PainCategory +import com.example.paintracker.data.VisualiserLayer +import com.example.paintracker.interfaces.IConfigService +import com.example.paintracker.interfaces.IVisualiserLayerIoService +import com.example.paintracker.interfaces.Side +import com.github.gcacace.signaturepad.views.SignaturePad +import com.google.android.material.floatingactionbutton.FloatingActionButton +import dagger.hilt.android.EntryPointAccessors +import java.time.LocalDate + +class PainVisualiser @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + private val configService: IConfigService + private val visualiserLayerIoService: IVisualiserLayerIoService + private val frontImageRes = R.drawable.body_front + private val backImageRes = R.drawable.body_back + + var selectedDate: LocalDate = LocalDate.now() + set(value) { + if(field == value) { + return + } + + field = value + + visualiserLayerIoService.loadAll(value, visualLayers, signaturePad.width, signaturePad.height) + frontDrawing = selectedVisualiserLayer?.frontDrawing + backDrawing = selectedVisualiserLayer?.backDrawing + isDirty = false + reflectIsDirty() + + switchDrawing() + } + private var painCategories: List = emptyList() + set(value) { + field = value + if (value.isNotEmpty()) { + Log.i("VisualiserLayerIoService","Pain categories have changed, updating visual layers.") + visualLayers.clear() + value.forEach { category -> + visualLayers.add(VisualiserLayer(category, null, null)) + } + + selectedCategory = value[0] + updateSelectedVisualLayer() + updateCategoryButtonColor() + updateDrawingColor() + + visualiserLayerIoService.loadAll(selectedDate, visualLayers, signaturePad.width, signaturePad.height) + frontDrawing = selectedVisualiserLayer?.frontDrawing + backDrawing = selectedVisualiserLayer?.backDrawing + isDirty = false + reflectIsDirty() + + switchDrawing() + } + } + + + private var signaturePad: SignaturePad + private var imageView: ImageView + private var frontButton: Button + private var backButton: Button + private var categoryButton: FloatingActionButton + private var saveButton: FloatingActionButton + private var deleteButton: FloatingActionButton + private var showAllButton: CheckBox + private var isFront = true + private var showAllLayers = false + private var isDirty = false + private var selectedCategory: PainCategory? = null + private var selectedVisualiserLayer: VisualiserLayer? = null + private var frontDrawing: Bitmap? = null + private var backDrawing: Bitmap? = null + private var visualLayers: MutableList = mutableListOf() + + init { + Log.i("VisualiserLayerIoService","Initializing PainVisualizer...") + + val entryPoint = EntryPointAccessors.fromApplication( + context.applicationContext, + HiltServiceBridge::class.java + ) + configService = entryPoint.getConfigService() + visualiserLayerIoService = entryPoint.getVisualiserLayerIoService() + + LayoutInflater.from(context).inflate(R.layout.pain_visualiser, this, true) + + signaturePad = findViewById(R.id.signaturePad) + imageView = findViewById(R.id.imageView) + frontButton = findViewById(R.id.buttonFront) + backButton = findViewById(R.id.buttonBack) + categoryButton = findViewById(R.id.categoryButton) + showAllButton = findViewById(R.id.showAllButton) + saveButton = findViewById(R.id.saveButton) + deleteButton = findViewById(R.id.deleteButton) + + imageView.setImageResource(frontImageRes) + + frontButton.setOnClickListener { + checkAndSaveIfDirty { + isFront = true + imageView.setImageResource(frontImageRes) + switchDrawing() + } + } + + backButton.setOnClickListener { + checkAndSaveIfDirty { + isFront = false + imageView.setImageResource(backImageRes) + switchDrawing() + } + } + + categoryButton.setOnClickListener { showCategoryDropdown() } + + showAllButton.setOnClickListener { + checkAndSaveIfDirty { + showAllLayers = showAllButton.isChecked + val signaturePad = findViewById(R.id.signaturePad) + signaturePad.isEnabled = !showAllLayers + switchDrawing() + } + } + + saveButton.setOnClickListener { + saveCurrentDrawing() + isDirty = false + reflectIsDirty() + } + + deleteButton.setOnClickListener { + if(showAllLayers) { + visualiserLayerIoService.deleteLayers(selectedDate, visualLayers) + } + else { + visualiserLayerIoService.deleteLayer(selectedDate, selectedVisualiserLayer!!, if(isFront) Side.FRONT else Side.BACK) + } + frontDrawing = selectedVisualiserLayer?.frontDrawing + backDrawing = selectedVisualiserLayer?.backDrawing + isDirty = false + reflectIsDirty() + switchDrawing() + } + + signaturePad.setOnSignedListener(object : SignaturePad.OnSignedListener { + override fun onSigned() { + //isDirty = true + //reflectIsDirty() + } + + override fun onClear() { + isDirty = false + reflectIsDirty() + } + + override fun onStartSigning() { + isDirty = true + reflectIsDirty() + } + }) + + painCategories = configService.getCurrent().painCategories + Log.i("VisualiserLayerIoService","PainVisualizer initialized.") + } + + private fun reflectIsDirty() { + saveButton.visibility = if (isDirty) VISIBLE else INVISIBLE + } + + private fun mergeAllLayers(): Bitmap? { + Log.i("VisualiserLayerIoService","Merging all layers.") + val resultBitmap = Bitmap.createBitmap(signaturePad.width, signaturePad.height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(resultBitmap) + var containsData = false + + for (visualLayer in visualLayers) { + val drawing = if (isFront) visualLayer.frontDrawing else visualLayer.backDrawing + if(drawing != null) { + containsData = true + drawing.let { canvas.drawBitmap(it, 0f, 0f, null) } + } + } + + return if(containsData) resultBitmap else null + } + + private fun checkAndSaveIfDirty(onCompleted: () -> Unit) { + if (isDirty) { + Log.i("VisualiserLayerIoService","Changes have not been saved, prompting to save.") + AlertDialog.Builder(context) + .setTitle("Unsaved changes") + .setMessage("Do you want to save your changes?") + .setPositiveButton("Yes") { _, _ -> + saveCurrentDrawing() + onCompleted() // Proceed after saving + } + .setNegativeButton("No") { _, _ -> + onCompleted() // Proceed without saving + } + .setOnCancelListener { + onCompleted() // Treat cancel as proceeding without saving + } + .show() + } else { + onCompleted() // If not dirty, proceed immediately + } + } + + private fun updateSelectedVisualLayer() { + Log.i("VisualiserLayerIoService","Updating selected visual layer.") + val curSelectedVisualiserLayer = visualLayers.find { it.painCategory == selectedCategory } + if(curSelectedVisualiserLayer != null) + { + frontDrawing = curSelectedVisualiserLayer.frontDrawing + backDrawing = curSelectedVisualiserLayer.backDrawing + selectedVisualiserLayer = curSelectedVisualiserLayer + } + } + + private fun saveCurrentDrawing() { + Log.i("VisualiserLayerIoService","Saving current visual layer.") + val bitmap = Bitmap.createBitmap( + signaturePad.width, + signaturePad.height, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + + signaturePad.draw(canvas) + + if (isFront) { + frontDrawing = bitmap + selectedVisualiserLayer?.frontDrawing = frontDrawing + } else { + backDrawing = bitmap + selectedVisualiserLayer?.backDrawing = backDrawing + } + + visualiserLayerIoService.saveLayer(selectedDate, selectedVisualiserLayer!!, if(isFront) Side.FRONT else Side.BACK) + deleteButton.visibility = VISIBLE + } + + private fun switchDrawing() { + Log.i("VisualiserLayerIoService","Switching to ${if (isFront) "front" else "back"}.") + var drawingToShow = if (isFront) frontDrawing else backDrawing + drawingToShow = if (showAllLayers) mergeAllLayers() else drawingToShow + + if (drawingToShow != null) { + signaturePad.signatureBitmap = drawingToShow + deleteButton.visibility = VISIBLE + } else { + signaturePad.clear() + deleteButton.visibility = INVISIBLE + } + } + + private fun updateCategoryButtonColor() { + Log.i("VisualiserLayerIoService","Updating category button colour.") + selectedCategory?.let { + categoryButton.backgroundTintList = ColorStateList.valueOf(it.colour) + } + } + + private fun updateDrawingColor() { + Log.i("VisualiserLayerIoService","Updating drawing colour.") + selectedCategory?.let { + signaturePad.setPenColor(it.colour) + } + } + + private fun showCategoryDropdown() { + Log.i("VisualiserLayerIoService","Showing pain category dropdown.") + val popupMenu = PopupMenu(context, categoryButton) + painCategories.forEachIndexed { index, category -> + val menuItem = popupMenu.menu.add(0, index, index, category.displayName) + menuItem.isChecked = !showAllLayers && category == selectedCategory + menuItem.isCheckable = true + } + + popupMenu.setOnMenuItemClickListener { menuItem -> + Log.i("VisualiserLayerIoService","Selected pain category.") + + for (i in 0 until popupMenu.menu.size()) { + popupMenu.menu.getItem(i).isChecked = false + } + + checkAndSaveIfDirty { + showAllLayers = false + showAllButton.isChecked = showAllLayers + signaturePad.isEnabled = !showAllLayers + menuItem.isChecked = true + val selectedIndex = menuItem.itemId + selectedCategory = painCategories[selectedIndex] + updateSelectedVisualLayer() + updateCategoryButtonColor() + updateDrawingColor() + switchDrawing() + } + + true + } + + popupMenu.show() + } +} diff --git a/PainTracker/app/src/main/res/layout/activity_main.xml b/PainTracker/app/src/main/res/layout/activity_main.xml index 6d45d0f..1d6129c 100644 --- a/PainTracker/app/src/main/res/layout/activity_main.xml +++ b/PainTracker/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - tools:context=".MainActivity"> + tools:context=".ui.MainActivity"> + tools:context=".ui.RecordNotesFragment"> + tools:context=".ui.RecordPainFragment"> - + tools:context="com.example.paintracker.ui.MainActivity"> From 30f254b34281f8ca2b57cd1522200e3504309c33 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 11:24:05 +0000 Subject: [PATCH 07/11] chore: refactored loads notes io logic into separate service --- .../com/example/paintracker/ServiceModule.kt | 8 ++++ .../example/paintracker/data/PainContext.kt | 4 ++ .../paintracker/interfaces/INotesIoService.kt | 8 ++++ .../paintracker/interfaces/IPainContext.kt | 1 + .../paintracker/services/NotesIoService.kt | 46 +++++++++++++++++++ .../paintracker/ui/RecordNotesFragment.kt | 42 ++++------------- 6 files changed, 75 insertions(+), 34 deletions(-) create mode 100644 PainTracker/app/src/main/java/com/example/paintracker/interfaces/INotesIoService.kt create mode 100644 PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt diff --git a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt index 9e6f936..50fcc1b 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ServiceModule.kt @@ -9,6 +9,8 @@ import com.example.paintracker.interfaces.IVisualiserLayerIoService import com.example.paintracker.services.BitmapLoaderService import com.example.paintracker.services.ConfigService import com.example.paintracker.data.PainContext +import com.example.paintracker.interfaces.INotesIoService +import com.example.paintracker.services.NotesIoService import com.example.paintracker.services.PathService import com.example.paintracker.services.VisualiserLayerIoService import dagger.Module @@ -55,4 +57,10 @@ object ServiceModule { fun providePainContext(): IPainContext { return PainContext() } + + @Provides + @Singleton + fun provideNotesIoService(pathService: IPathService): INotesIoService { + return NotesIoService(pathService) + } } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt b/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt index fad4dc0..11a604c 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/data/PainContext.kt @@ -9,4 +9,8 @@ class PainContext : Observable(), IPainContext { override var selectedDate: LocalDate by Delegates.observable(LocalDate.now()) { _, oldValue, newValue -> notifyListeners("selectedDate", oldValue, newValue) } + + override var showAllLayers: Boolean by Delegates.observable(false) { _, oldValue, newValue -> + notifyListeners("showAllLayers", oldValue, newValue) + } } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/INotesIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/INotesIoService.kt new file mode 100644 index 0000000..06c52a6 --- /dev/null +++ b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/INotesIoService.kt @@ -0,0 +1,8 @@ +package com.example.paintracker.interfaces + +import java.time.LocalDate + +interface INotesIoService { + fun loadNotes(date: LocalDate): String? + fun saveNotes(date: LocalDate, notes: String) +} \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt index 0cb6f4c..7899831 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPainContext.kt @@ -4,4 +4,5 @@ import java.time.LocalDate interface IPainContext { var selectedDate: LocalDate + var showAllLayers: Boolean } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt new file mode 100644 index 0000000..5fc9830 --- /dev/null +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt @@ -0,0 +1,46 @@ +package com.example.paintracker.services + +import com.example.paintracker.interfaces.INotesIoService +import com.example.paintracker.interfaces.IPathService +import com.example.paintracker.interfaces.Path +import java.io.File +import java.nio.file.Paths +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import javax.inject.Inject + +class NotesIoService @Inject constructor( + private val pathService: IPathService +) : INotesIoService { + + override fun loadNotes(date: LocalDate): String? { + val dataRoot = pathService.getPath(Path.APPDATAROOT) + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = date.format(formatter) + val datePath = Paths.get(dataRoot).resolve(datePart) + val notesPath = datePath.resolve("notes.txt") + val notes = File(notesPath.toString()) + if (notes.exists()) { + val fileContents = notes.readText() + return fileContents + } + else { + return null + } + } + + override fun saveNotes(date: LocalDate, notes: String) { + val dataRoot = pathService.getPath(Path.APPDATAROOT) + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = date.format(formatter) + val datePath = Paths.get(dataRoot).resolve(datePart) + val notesPath = datePath.resolve("notes.txt") + val notesDirectory = datePath.toFile() + if (!notesDirectory.exists()) { + notesDirectory.mkdirs() + } + + File(notesPath.toString()).writeText(notes) + } + +} \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt index 821adb2..119e966 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/ui/RecordNotesFragment.kt @@ -12,28 +12,24 @@ import android.widget.LinearLayout.VISIBLE import com.example.paintracker.databinding.FragmentRecordNotesBinding import com.example.paintracker.interfaces.IPainContext import com.example.paintracker.interfaces.IPathService -import com.example.paintracker.interfaces.Path import com.example.paintracker.data.PainContext +import com.example.paintracker.interfaces.INotesIoService import com.google.android.material.floatingactionbutton.FloatingActionButton import dagger.hilt.android.AndroidEntryPoint -import java.io.File -import java.nio.file.Paths -import java.time.format.DateTimeFormatter import javax.inject.Inject @AndroidEntryPoint class RecordNotesFragment : Fragment () { - @Inject - lateinit var painContext: IPainContext - @Inject - lateinit var pathService: IPathService + @Inject lateinit var painContext: IPainContext + @Inject lateinit var pathService: IPathService + @Inject lateinit var notesIoService: INotesIoService private var _binding: FragmentRecordNotesBinding? = null private val binding get() = _binding!! private var saveButton: FloatingActionButton? = null private var isDirty: Boolean = false - private var existingNotes: String = "" + private var existingNotes: String? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -96,34 +92,12 @@ class RecordNotesFragment : Fragment () { return } - val dataRoot = pathService.getPath(Path.APPDATAROOT) - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = painContext.selectedDate.format(formatter) - val datePath = Paths.get(dataRoot).resolve(datePart) - val notesPath = datePath.resolve("notes.txt") - val notes = File(notesPath.toString()) - if (notes.exists()) { - val fileContents = notes.readText() - existingNotes = fileContents - binding.notesEditText.setText(fileContents) - } - else { - binding.notesEditText.setText("") - } + existingNotes = notesIoService.loadNotes(painContext.selectedDate) + binding.notesEditText.setText(existingNotes) } private fun saveNotes() { - val dataRoot = pathService.getPath(Path.APPDATAROOT) - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = painContext.selectedDate.format(formatter) - val datePath = Paths.get(dataRoot).resolve(datePart) - val notesPath = datePath.resolve("notes.txt") - val notesDirectory = datePath.toFile() - if (!notesDirectory.exists()) { - notesDirectory.mkdirs() - } - val notesContent = binding.notesEditText.text.toString() - File(notesPath.toString()).writeText(notesContent) + notesIoService.saveNotes(painContext.selectedDate, notesContent) } } \ No newline at end of file From d312119d5518b56b4afb726d8b6d524ae4087ca1 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 11:33:10 +0000 Subject: [PATCH 08/11] chore: refactoring --- .../paintracker/interfaces/IPathService.kt | 8 +++++-- .../paintracker/services/NotesIoService.kt | 7 +++--- .../paintracker/services/PathService.kt | 19 +++++++++++++--- .../services/VisualiserLayerIoService.kt | 22 ++++--------------- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPathService.kt b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPathService.kt index c2d7e1c..fcfe277 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPathService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/interfaces/IPathService.kt @@ -1,12 +1,16 @@ package com.example.paintracker.interfaces import android.content.Context +import com.example.paintracker.data.VisualiserLayer +import java.nio.file.Path +import java.time.LocalDate -enum class Path { +enum class SpecialPath { APPDATAROOT } interface IPathService { fun initialize(context: Context) - fun getPath(path: Path): String + fun getPath(path: SpecialPath): String + fun getVisualLayerPath(date: LocalDate, layer: VisualiserLayer) : Path } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt index 5fc9830..16db47e 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/NotesIoService.kt @@ -2,7 +2,7 @@ package com.example.paintracker.services import com.example.paintracker.interfaces.INotesIoService import com.example.paintracker.interfaces.IPathService -import com.example.paintracker.interfaces.Path +import com.example.paintracker.interfaces.SpecialPath import java.io.File import java.nio.file.Paths import java.time.LocalDate @@ -14,7 +14,7 @@ class NotesIoService @Inject constructor( ) : INotesIoService { override fun loadNotes(date: LocalDate): String? { - val dataRoot = pathService.getPath(Path.APPDATAROOT) + val dataRoot = pathService.getPath(SpecialPath.APPDATAROOT) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val datePart = date.format(formatter) val datePath = Paths.get(dataRoot).resolve(datePart) @@ -30,7 +30,7 @@ class NotesIoService @Inject constructor( } override fun saveNotes(date: LocalDate, notes: String) { - val dataRoot = pathService.getPath(Path.APPDATAROOT) + val dataRoot = pathService.getPath(SpecialPath.APPDATAROOT) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val datePart = date.format(formatter) val datePath = Paths.get(dataRoot).resolve(datePart) @@ -42,5 +42,4 @@ class NotesIoService @Inject constructor( File(notesPath.toString()).writeText(notes) } - } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/PathService.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/PathService.kt index 6b6397c..21dce99 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/PathService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/PathService.kt @@ -1,9 +1,13 @@ package com.example.paintracker.services import android.content.Context +import com.example.paintracker.data.VisualiserLayer import com.example.paintracker.interfaces.IPathService -import com.example.paintracker.interfaces.Path +import com.example.paintracker.interfaces.SpecialPath +import java.nio.file.Path import java.nio.file.Paths +import java.time.LocalDate +import java.time.format.DateTimeFormatter class PathService : IPathService { private lateinit var _context: Context @@ -12,9 +16,18 @@ class PathService : IPathService { _context = context } - override fun getPath(path: Path): String { + override fun getPath(path: SpecialPath): String { return when (path) { - Path.APPDATAROOT -> Paths.get(_context.filesDir.absolutePath, "data").toString() + SpecialPath.APPDATAROOT -> Paths.get(_context.filesDir.absolutePath, "data").toString() } } + + override fun getVisualLayerPath(date: LocalDate, layer: VisualiserLayer) : Path { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val datePart = date.format(formatter) + val dataRoot = getPath(SpecialPath.APPDATAROOT) + val datePath = Paths.get(dataRoot).resolve(datePart) + val layerPath = datePath.resolve(layer.painCategory?.id) + return layerPath + } } \ No newline at end of file diff --git a/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt b/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt index f032b7f..150d3e5 100644 --- a/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt +++ b/PainTracker/app/src/main/java/com/example/paintracker/services/VisualiserLayerIoService.kt @@ -6,13 +6,11 @@ import com.example.paintracker.data.VisualiserLayer import com.example.paintracker.interfaces.IBitmapLoaderService import com.example.paintracker.interfaces.IPathService import com.example.paintracker.interfaces.IVisualiserLayerIoService -import com.example.paintracker.interfaces.Path import com.example.paintracker.interfaces.Side import java.io.File import java.io.FileOutputStream import java.io.IOException import java.nio.file.Files -import java.nio.file.Paths import java.time.LocalDate import java.time.format.DateTimeFormatter import javax.inject.Inject @@ -24,16 +22,13 @@ class VisualiserLayerIoService @Inject constructor( private val bitmapLoaderService: IBitmapLoaderService ) : IVisualiserLayerIoService { - private val dataRoot: String by lazy { pathService.getPath(Path.APPDATAROOT) } - override fun loadAll(localDate: LocalDate, layers: MutableList, width: Int, height: Int) { val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val datePart = localDate.format(formatter) Log.i("VisualiserLayerIoService", "Loading all images for '${datePart}', width = ${width}, height = ${height}.") - val datePath = Paths.get(dataRoot).resolve(datePart) for (visualLayer in layers) { - val layerPath = datePath.resolve(visualLayer.painCategory?.id) + val layerPath = pathService.getVisualLayerPath(localDate, visualLayer) val frontPath = layerPath.resolve("front.png") val backPath = layerPath.resolve("back.png") @@ -55,10 +50,7 @@ class VisualiserLayerIoService @Inject constructor( } override fun saveLayer(localDate: LocalDate, layer: VisualiserLayer, side: Side) { - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = localDate.format(formatter) - val datePath = Paths.get(dataRoot).resolve(datePart) - val layerPath = datePath.resolve(layer.painCategory?.id) + val layerPath = pathService.getVisualLayerPath(localDate, layer) val frontPath = layerPath.resolve("front.png") val backPath = layerPath.resolve("back.png") val path = if (side == Side.FRONT) frontPath else backPath @@ -74,10 +66,7 @@ class VisualiserLayerIoService @Inject constructor( } override fun deleteLayer(localDate: LocalDate, layer: VisualiserLayer, side: Side) { - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = localDate.format(formatter) - val datePath = Paths.get(dataRoot).resolve(datePart) - val layerPath = datePath.resolve(layer.painCategory?.id) + val layerPath = pathService.getVisualLayerPath(localDate, layer) val frontPath = layerPath.resolve("front.png") val backPath = layerPath.resolve("back.png") val path = if (side == Side.FRONT) frontPath else backPath @@ -95,11 +84,8 @@ class VisualiserLayerIoService @Inject constructor( } override fun deleteLayers(localDate: LocalDate, layers: MutableList) { - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val datePart = localDate.format(formatter) - val datePath = Paths.get(dataRoot).resolve(datePart) for (visualLayer in layers) { - val layerPath = datePath.resolve(visualLayer.painCategory?.id) + val layerPath = pathService.getVisualLayerPath(localDate, visualLayer) val frontPath = layerPath.resolve("front.png") val backPath = layerPath.resolve("back.png") Files.deleteIfExists(frontPath) From b476c59ff6032e4581f8443a7076973b0edf5ef5 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 12:25:07 +0000 Subject: [PATCH 09/11] chore: readme updates --- .../Screenshot 2024-12-25 122152.png | Bin 0 -> 60650 bytes .../Screenshot 2024-12-25 122254.png | Bin 0 -> 28316 bytes .../Screenshot 2024-12-25 122336.png | Bin 0 -> 62116 bytes .../Screenshot 2024-12-25 122359.png | Bin 0 -> 38002 bytes README.md | 46 +++++++++++++++++- 5 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 Documentation/Screenshots/Screenshot 2024-12-25 122152.png create mode 100644 Documentation/Screenshots/Screenshot 2024-12-25 122254.png create mode 100644 Documentation/Screenshots/Screenshot 2024-12-25 122336.png create mode 100644 Documentation/Screenshots/Screenshot 2024-12-25 122359.png diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122152.png b/Documentation/Screenshots/Screenshot 2024-12-25 122152.png new file mode 100644 index 0000000000000000000000000000000000000000..4569318e702c4335aed229c8e3aaef1463c19ef8 GIT binary patch literal 60650 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

6G&BJJ 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π{|OvWie$TSO$mecFatQxkrr3t_3=# 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 A`~Uy| literal 0 HcmV?d00001 diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122254.png b/Documentation/Screenshots/Screenshot 2024-12-25 122254.png new file mode 100644 index 0000000000000000000000000000000000000000..9e57515809ab12b751baf13fd3418753f7fc955c GIT binary patch literal 28316 zcmeFZRa8~s*Dk&g0Yy5MR8VQ@E@^|1?%H%qcPL6DqBPRo(hbtm-3^kPhE2!+-M@3L z&ea*?eCJ&J$9KWldu>*{Ip;H<`OFpkL0$$MlMEArAndnqB$Xft1qMN=j~<|dU!3@o zTEGX2qmqm`R6Ibj1rF|;iOGpUP-(=YYeO_}{P5!&O-BgAX+!>@blK$^Ly#@|TS+k$ zH@)3?S2txC5%qPLYekd znD!)kH?1r!Q}^TQCUTwU%y=mBACa5y;LnY>1N^+gjc4nPyc^#(!#t!=@bTZSJ|n@y zkM!K4Iu%|?thR-9m%XU5UlpKfr9JS1^E^1f#Y@B=Mz!r4*wv`@cu}m|j1J{$=TOx- zZ=s8dik9X{IFj~BP0H(bz*O%(-9XTy!j)KI4|lzo*L6F46sx+Jw+$Crso|){`Q>@K zp}%xOmFeNes{OxB{IOg;)E6PKA9@G%`6Ak6aMC;~$>=rHGffk&-oAg|_T3eu&75of zoI2(9hKoYPL4#TP%7t<$UGq_CToBdk`rG-h`o32w8igZUPUp7UXRuPaW0JnMI&3Q& z)BY}6(bj%#-VRuzjbo3cIjnCZgWcdD@qDjqe~d#)kqvw||4{O*CyJrK7N7a%yf@r5jg~ zKiMpa5QKqCEtwK~1wjj*8{XCnb>`a2y}h4ohY;$FxVfj?oJ1opE{Pl0f{Gq0#dC3SDV8%D+>wv=Xv3&28(VF9 z|N+G0ESPB=r zVc%X=P%M{bIia4y-P+oMaWbL%qeKX+Jq8CsK|$>`!>erWtwaqYaN@ZpM~sDqg@com zx_y!#K}Wn`4V?_k4Lcf-@M`iuzqGp5*J!qHtiY3Y@t+#Opl*&RP5Gv*f96@#oGrq@ z|FHb_*VoQ)GOHeCC8dMo64B-9oRsk>K@N*;NiWe|jIhTy4+nmQcepAycWK+<5+rJ} zKgK#ZI{A`Lzd6=KC?q8GJuWUN_b>g)&H~}v?zbO*+dogocr#B2r{Q|8!mP$m)^-Dy z$Zy4!CexeGvHde|2>^gj4cl36C>-_jq?{bv1*5^XfKd-+pNcrBoxq z8tpJVk@q)j9J5fPk^-z@39!4_Zmul+I{2OKu(nI6lDI_s*4ABO)~2~nNA2UP4XBbW zF0qm=ucN@GfR{9VJ0=}mtxsucLy%8KCd7m|9&Q|*dP?9wc@kWwFtd;fy4_3B86kZ7 zSgZ24w@?pJ>(%%q0|UePe)HW}AePG@t&hep0dGv-{wu;Wg1t1iQi9DJ2RkALYftm9 zK~!G6whMm-z1`?a_~O zpGzqoXf-#%*zwmK>2RneysRls_pa3o9q84?m^r^tPFES#uRCu!m~crvzKkN0yU{;h zx7=n@DY`GE$Ymq#CGc)E+qUg8;Zi~dhZZzI^!obeOlP5Z^gByU*{q|4Es7_Cmz;%~ z)g)kN!lI*Ju{Nb{>DS9sjtLxpz<|7N*WBb5p`}Wn5{qoggNfI2H)~AlT!`i2$RRp7 zw@ncJz5_*j47KT@1f$4|i*-)?gld>HEwr@tQf|BqjGRh=67gZFeNaTWgt<9=kLDLc zFE615@>`LnBo0dO4?fpRX6R|UY}Cwp;#M7r$r0Qi{ZX%9)w}qHha`Adp^HL`WBV*h*O1z>&z|!HzS-F1t;sqMmK0|Os zT(f})O>Yc3M8u$UA7XQw5`_HF95)I^t!Hb{AUt0YDrl%s)$u+WdYW^A8U!WD2WDX4 zph8N@$|#U>wp<7K&1Hs1r6mN}+1dRPa3KJ8iqHN?a$PX7J>{E(iZKx;=_@S%7Qf8Q z=hk}F_+p1^9IZ7H1V$xWSC}naCRn>Ln>f36Mk*}r zGWeoA^4Bk5q@z}!R?QV~>@!SzULT*q`YQ$ql=FmOjL|Z+J;VnCS8YShcA|34YQNOzR~<_VEp?^%PDDw>BAj;X zoFTu1gM&hG2*1@z2AFPkwWJlbaH1+&etI_+!7I3X*G+nTy#b_X3Tz58wPBlNeg_%Pz~u z8165pwe6SR4vi&NOP3&gb&nxGtI6Vm-4IfyViD5#K*4*QXXaAs#d`RmDzPPVz7br4 z3sf9LkhM?$1u&ECG~t|P13^;x6(?MOIM0{%x{z>;g49s6TL!C0ow{D)E8RF4}hm&Hc z=qL~ty1&$W19(+o$)jg4-mk1irkHP!j&kBrQRY2Nh}GXJvLJLFI1$BtauSn0r<6pO zavx&WX?UZYJn!!ugLxk#<2`^b8z`}uk5Hkob1tj4dr&CHo#{BED%aY&uov{;@7#yR z?Iohxvp`>iN*z&3e$2le=cL0KEB$?(5ee0{&%m~{l z;-pRc;cC~RQb}@+(*?n8!WC(P&=r@ZO3Am>)TfC3*(0Z)*^iF~K6r83-va|4GB95k zB3HHxKhzJAg8cG+W-nEX`gGA{NH1-V7o3}p+($n6veA_CH(`!!>#aY=*yL!AY#V6R z;U)Ra$E~9m*7H@wz!bXGO>;titRlR-pC)saAJNGt|LGph`H)w~F!zXvKD7xK--Ml7 zpHbs?s>a&)fm~AgU;SOC*F31SU0#-)*S)I6P@`T+9y!moa9Mrt26iW@!7@E3{m4eo?;$u=Qh`XFlIBjuCri!v?W&A)~f7K;<6 zDV@HEuL65B8J@Ub0=^hrtLsl$hxQ%&kiOD0F2C*UC(l(qdwb1x<5^+8pu-~SaPmN_ z+6omq7;;}a(>K$=ey>ySgRL-8^5_BiKurx_eRA{i$^4rgN@)|8} zE5q9q$FxyRiumX0LY}Fg`*9Hpz?G7XIV z_G({rtXN-$*=I>EQHXmI9zqL%Lats>f`+W|3lSb1G)yAA(4<$BV$3s57EHEt4QWmC zZ{LbF^Ikq7^FEFXiUr?2RIUX;Y96f9>YbfV=k6v9^sg_0Q=2nMI3yiJz;@}TNm_g!*NKGlhtU zBxjMk5ANN$L{uK0e^R}R#Wt~2OHN9-w2CZOOp!)$9w9@>XV(StfZRB9z;rx@@LczP zjh9h@p^jnhy~NUrArF_vx^v?LE2Y!~P6GXzu$e_pJC^sEO@9N?qHAwe5zM( zt-2eJF};(gHhhNPvz=wdZBkvbpx7!-LzJPXxVKP~^X01~{VeaU(g-1ERNN-!yBh&) z?on+KR${Weo%vD){+g@r1SAA$I(&}9+jgBP0wpT+>Y5K91%DVw3Y(N&Y_wA7_-?Ht zP`RJ)zAsP-X9CZ8SFmmqwe_>9++*k>hJ&(qI|Q zV^k1D6t3UQ2rr5S2N$Q#)w-x_RvK5T>bHs0M16H6W$3O(yt{~d_pUrgn_jvx{g>dA z5@dtn>b4(Vb?8=Y%SitaLpDal!}rUNnD510wnLJ^^r~9y+r%$~*(H*0=eph2EU&ry zD`E$ARbA}nGvZm1_tbdvMXA_YYHj<%s;44&(ef78@umuUHu|o3K@AK}R1tZVHljD~ zLUg=XQ@z&tLe%6sjx`$D8xA2Y&1y@3hrKcP7edVM-0zZ>6Hb!^8&V(t2!A(7>S=Ln z3n#IO0;gt4l~43kD>tdn%1A{i4p4{|Fef)lB3nyf`+^blM)uMpMBwIPD)c|iDZl*L zQ^a(~;E#bd-f*VRxxs*(vTyzMQT}%c6STb^hrT^;IC2M(L-R!RrdUVF@ht|sla>l&NKEcMAdRl8kx%cgSQZ$>b-_|D%WoZH)CxUf3-g-WAoHlM6Q4Vg4 ziYD+&8{`EJyRF#Z0wRerMdTQEMqDVpRp|S`7*mq&W7{5h;r(q_wD`K-rUcp2Laj2b zBEs2_(ZpWlc$IgpM%g5~&?6tDjGdw;;&Dfa>_pGc%5BYlR&YzOU`*NrGm!JPws~vR zGl4xjenxO7ZA(>)v*Js_tg5t^&B)-Y98FGYhivb=V>4|Ae? zdsgi$>o*I!#f@L_Z^K28WAjbcahq#j(RQac2%qcrSC~a~S!DBydNhv7Y)uu1W;26* zG+panya;=T8+_2{}~62Ac;kcSuFmU;}bg+BcT zc3`{(yFx!ArWf8C|K2jG<`ZXiDPj(chGn!BBhy_sW?|N&*aBz5=89Xa;E2lJNzKZK zI%&cpP#jBEQq(Onwe!1b!F6JAhu+D1lB+km8ckU zryr{QP}S}|d(#k|*-a`q1OG_*8DO{UYw^Jj}jt&@x9 zJpnjWpA|`DIP~|Xm6cf;^%`m}8&vW>$|YraU!4U@xivXkA>7yAMKAB}h6Ar~ebPJl z=DkAO_;Rkyqbu$L>4h^1S>`> z9NT+)A5~h$1rS52AJW9PkEwlc@o7bFCB3nseH?G{pV{(i`mW}SV#=(Tn3&Q^KV1HH z;d{RexomLgc(?87>nn=5xIv<5Zz?>z)Vy+)dQ+C`^Iiou>Qr>Uv5LaxJEgO|ZO0_} z91;C;9~Lh!udzuQ5W$nyIgLl5onNgk3VV)CwzRZtA8(Fijc?E#$CIy{%pP5+4drZ> zIv^M;<>EKZ5$?lu$sbZ?j|WFyn9pS9X%s3JS*n&kh<&9`5bD=AsN>-w02wTNzNm3K zOwVqfCMF}mbX3`yD#Hd&5fxG?&_zYPY|gW>Zke6c_NG$ikydsU{YvdA>wO#7QJ10) zHeO2e-NVu@g=eSd3=}i2P)YNIdeLmX9qTq%ZfHN8mj+<2z*GLS2bJ;n(2@mqo0pd3 z;lAC^G7fLa1E*GVWHDG*2h()2FgHhT&`N`KsYs}Gpo4=klmW`GBj=72*8QtP3pcQz z6w21O)Ww=q8~{SB4D8NsqipXeVbyAU6QB$WIX#zj$;`<@X+4^+H6fRd=)18{la~4v zC^Hb7!Ja6nLfCXEFbIcr6TBENJs2BPX*kbX#Ua}RvNJON$~iNiiE&&xU~uyWQ~k5Bs8I8 z%!Xp_4LMS>LmQII~N~`__R^cgXNL{dlVAHtW5?&>mWhWKoInY zI~T}Or>b8ye9l{xZvzCv_g}xllD$1zdVAj|spX6=Z|M7$y34QVm#-VZPi^Ar4MYG2 z9Qj_D^Hw}}~7U8Sm^1)s{m+QwT9>VC@R9`laOgc>YdEADy zhd>HxX%#nZ63%{G!20px$iz$Nnzl4=)cbatPw05AyvAdf%yz!+>!kuWQR2VgoE$nR z_3jU^{l);L&}0wSFZ;D^)yjTAYJFT9LYb>~1z~pjfyVlzhQ7Z3rjvk5fhsEK*SXc6 zjx!m==gC2GgMQN0JxUiD74@ZzxTj@s5cl@>Ho;|Dwa{DA>{5?@OUVvn?4%%?9?9j?q}dvu8-ZRXDg%LiK2ux#ow>R?xR`82ADn4`))7 zdd){eBst4z)-OIUjTkO-e?)Q43$JOd9W_&|d1E+cp@ECu;ipw;Y4Mo{+=I1Y3cC_M z*@Cg(9Pv};TY>Y}N2C*27x(Yq*Fp>*A@+9b4-n_9iaCbDT-GBGx^O9_cKaIPtzREm z#iW#^lnB^}!_wzVcK~IL3^$y~CM3X&L$7sHEGKe!REGpAcopaIf=wAK<@#FR@A4%ciRlq?`& z8TSws9rYM3D!B0@x*~YI>87V8a%XuR8+VS7nOX)jLI*81ZO=CNJoJkoBexCpnM>S!gxzXx3VHK4Mt`*m@K8D5_Ks6n1P&# zqzdvm4iGD=uqhqXF3OQs|l1ddisvwX&+{&7@{ zymkv;N=i!Bomd@`f9A-qpGUE}YWzO1bJ`wKWcD#&L#B>;$6EwwXdI|=?jMGU`bdm! zB;$t$2ho%NB4|hV$A7X_+dTOSe>kI$0VI|rYh&S0i@{g|5Mr}{C9yC8S*SokH5i^>Ri-jPj^NiH8nMDThXM;C>G1>KZ^J^rc-x0$||~g7Vm4& z8zA@Q{d@mma}`$J2Ja1={PFy6V0C0>Wu?h}ee65~n$w;nusV|HgonT8$}j)AH}O}T zyM|8v-s-CVqFKLWJSIDcwBce6Ecd0Z5wZGd-W%WIglrfY)$9c@nh_Tmw#)pk%2l@vb?406jlV?t6JTZ?isXR-RNb>Z;w zy5^06u4}YocJoaGr=6K6EMHPYN*f}}FD@#rCh-(IFGX@CB_lrTP!^*4O>vsBx!&qH zSuf&0d-jaa@g>Q4z8WfoG=R;0=fv3LV=@`&;lHiUUX8hzeG}OI(oJX&@&O?4to`)3 z`09>XH^jweCf5eEhZrE42E4(#r!*c>YnJ9T)e96{c!0wR3Jbz30RPvtou{41*^EqA zQ1tB$4GNm00BJ|#{vruN@Dcuho^JeKC`4v;v1`N^yD}<5I)mHAN8bVS##3IP8M@J) zZtZ?qYu1r21l9vl=&#OUPhTD%iWw(!I+6{m!76j~4s6lQ5%{>s=9RQ)>3I`aq=sB% zD3CMxMAzTpjP{p2UjYZxU6uu7kDUF-7?k59hz-!-=jLYW>l-h2Fq~1Z)X}x8Z1EFk zq72!Bq^4miveXyFps z#7EQG)DhRREx{RvZ;(@z6>c>VD)pKto0F5Qd~zUW=QjMRcJXSiWI?yjGbVV;7`3W0s?$IYZI~EaCS5J_^L7fg4_$b{>kxIC{MO^?)QRe0Ev9$LxNLLN) z1`1RP~*S$pxVouFQr=o1@^^)=^rL@Qp z5YRrl)yYK?LPfJp_JIUcrum!-b{E&-O{iQYfmjrl2woex$)fkJ2G;)KlJXKmfN^&#=gZZ>VTF-$?!t8SBH|@Z{SlP>B>x4BqZ46r4?5 zCsk^XO=gMHMo+NJAi0yBh078GMMn7k&UBM{(&=fX;D0!R)fKtQg`>l+J5#G$`PP2P zf@Z;uYEkZz>cYirk?QNaK9lv0s`co#W9`_x(FUF~`(^!5Zktg;PKqXExF}B{kk#}G zkSYx`SI&sa3ws2hj-1xl3@=2UyhTUS6?9e;$|6rhMz)2O2uGsXLQTw*Z4a+sY#*1V z_!Lj57Jrc28aYI(e05Q!hm1_Y$8q(=5-n?l&OUzg%szL&UdKU%Xlt4`1_V*gRCYz) z1VU(UCg?Ii7#Y}h52SIFQ>ra)gwzVPvhu3UItQEc2L&tk{hZ0Iadn|TEfN?gkU$a+ z09Xli0SNNk!BA4BZ>w|)5Y*|-PW5PgKpp=1^XH}g{gl;4w&MkxHgxRqvPnH}Iq!w7 zudg0o9KJy~hi`L_ZJ0`h5P>{mM<}U!3I;m*JqSrX`bfB?!5>-PoOF*4Ro}t4;h*eq zKBOcj344J40Et+d>zamop%YfIhBvVqd!gDNCw#Jcs3t za(IeTiZEgLW#@CVC2Jr z?0xy9!g>@FV%x2^Q)DcRV&hia`{yM$aMFt_N-M%6e@u_313?BVL||d3JM`z9k2Xlg0Rn zxweZ<{<`(9+Bd$g`wJbVMqTaeII2aO*dSAq>RiubKAG33;jNz|pCm5%<>tb3cZM6; z$`yoNfv<)L1ParNB zKiiqTbJnSIdTV{p*ypEP_SUG{P0+V*(z3E)Q**`5>$hLqGoSwwaUp=Kmvn#&I$oX; zQ|fkFdM%9n#NLMO7Yk3-Itxw|YlKs=n(Ru(HQNB>1^HE1S8K^ck-mDk!f7^0^Nd~0 zTiE5APp(mLzR6p=Jn+ITvg?yIl`}PmIopg&pTHz95G;Tw*)8q8I`rDl7m6v-Nt-Cq zh(^pQeY%%zhZz__q1Nkjc|nJ`_-FTWWga&muLLEvH&nCj;h7`Ca)QbSAUbI2Lak^S zzKRN+8%@Yo-cI;df81XXMpS0Od5f*qRS#jB5>)BHq-L6B7L<5{(vZ@^kJgDt&PjH66F-p}&b zbR6%_=G%BS&%H0QS}Ya@;5=_@^(P1dvR(gyAZl!@M~yj9-2)fW^<~AC@!5<P_3#k)r~vb z&^MpXj=tnwcyh^OJ6Dr7(R^#E5B=F*V;V0jBZeIu{#6*8l;qFi+;;p;qTIx3H9#R7 zFM?KIwTD;m7mY|tOfo)K2$vFH)5G9%&FN(?Y?yXyG3ULd9%s;ef%4=4{S$)Ed4zPK zs*<&*f9~7EcPHD^Wk$*_JGe^B?)Wj3vlTi9SZ2A`{&@kP_5c&Beb`^7oiSa=-QYhN z;I$wA&XST*-v2jcUH=Qt`Y#ZQ{r4UJYXo=yJ&yl9j{gsIo&UYe{(G7I|6!TQn!Vv+ zggpa-=!jRs?EXjwA`(P2$^ZGXw?~PTQOOEv$ox+obQuLkX>2T=*G{KFWOgx_kaw?I|9 zPylE!74y$igM$}s4=K{0rpt(R^hAGXf}ur~XrNr3?h+PIj@&PeC_yX~44X@alCZG3 z9~oC#5B%acpQ&Kr;NTeJDblX)RM+=5VK<3cy4M85#~+q3+OEiBBP$&>JGe7v3H_4oY(WKJXH)#+6ly`2~%~ zQsY81b(QsWI)k9kN!)rREfvr$TR0zmIktED?C?f03{*^fypT|I@b`z zm8)7nVmY3l6%(%?LBUS|{r0)>DBzKFHxa4&{vGT2ODp)u$jHaDJ;3a~3%Rk=0*oAv zKB`|}Ai0a=W?H%9hCH)&lMeI5l&`^^_v~v*T9=P(Hrr!)ut>|@nM%kHC>R0wk|$g; z1L!_I?p4y+;o&E}l+S=US>BuX{Et=@1p?6TAyngafk{9}XumaLqEqWY41GM^;U6W( zUmLzfy*k|c?TP|rNXNOn>;HVuAA+d8uS;h-@qxOKVvZDs*dBj?g(c~ajy+aZWi#6f zQcC1J)(}*vQ%eAfC31D^t2&}22O<;DGc)6p3p~4ngWtS;+p-!#Dpm@ULV-F$h*1G{ zZ(oJ{e!O^}`X-X*!9#{%f)^pEP)}?Gdn3LgRpam-HuMKq^fm~b0UHa7JUBWMzc^Yu z+~1pr{D86$WKPB7MiRh6Z%iNEnsX@LZ>&FU7AKfqS?Wy~HQqBOT+^uDV_jKl@sH!M z;7H)M%8tp&$;o(Eng5yxcP9Qch_Wy^Bt2EP-X%`ZwOFglV)UiZ*_`9{!#?n9E;CWZ4!a01{>5Bt73rEzTz?~BM-+MQNoUq za__`@N#oGB{Ubdp$|>gtq6g2|ye<6vIKH{Fa55*fgTED=&_k6dh6Qa|pwHDO{#ZR` zR#ui9#m84XHOHCYU!h*YwzHc(V^$-2%FjTIE>X1*5){O2EC^WizuY@Ga>&xO|4{1x zJJlE##f8VGr(b;is;j>K1d6IJo_U}sOsu8p;NatKiHvC`dE_tatI4;_wcC3Apv_pB zSqpbBFZJ}2A3Si{ExYHJ+0OMC>#UhPB_)N|%gaXp-aZ%R_wV1g4|qxX@7?oWT3egB z3A?U(#Uu>^*J-%IM-+VoX{m090UHg&;cW^_63zq6Q^yP3j_e%rRE4Iy{=PYc<|JJX zt?<0ltRZ*Me5nERix&b-yk84^SlX#%co`j>Qn1xO5ItQ^zPYXO)O-?-NkHlKXTGs; z?<|ycZ%@HTJC<;7x>+-}UcB>1#$ZfD1l{$uZnK18x1#Sof3Kyjtr_f^7ss7*sF0U; zN>^&i7Zr90@VR*9A|ht-kgW0r%qR8M+ZaGy8M(ZGV1mfP3WW_ z@9I{~ss3ul?%v6{2C`A~p(f$j;u_9vl-t?~yAmhKW9aLb^gTU2CV=a%Un0oOr+ZF} zGCqBp;A|h*=-rAb(Fl$ynn^b)sN(y$lsb=Fm4O@2>AW>V$)a5;l~_gjsqar^hu-V@ z)-;L0@)*_c5gORg!AXVi;;;UO!oHhQQhFDXj8WZ27wp06t<)wQtcqmO(+LJM_;7i| z_;o2U{T^l`x79?Rcdhr;H;p1p%qq&Efr&gv-u{NtYMq@T<$(&LF8NB<43QhGzkT}f ztTk~^1L0AuU%ne$FgPD)l*vryv} zH`zU#;gwF!Q=Z6`8(a~B&`dV6aJSR=obfd@!QPJ9uG7xm>61&Mlie%ym{*#)G43;u zBdV$o9jfAeuS1A?@5FjZ2Gh(U_WY8ts~W@W%jM$uo**R-TKny$d@UZU7u&Q^s{amwpPDE#6JZf}?TGjAq$esQrp$j{jU!&avr zV&n8pjhtqEqr(RhIOo=V^vqff_Y2gD#56SGrrLKsn&vPJ!tAGSuw*vGUJz$%&ZS9QMu0_43Olrl_K%fW-`p(LgV*n{`Til>X*B>#7 zAzH__)be3!S9+zI2QIq{s1TUdr$DI6%444hgp-oelDQ>Ujkk5R?2d-s6WfgOQpaQDr4JDTGs!ylwwW%-DemDTI+M!{{j@)lO9P0Xl)=gX=ShAT?; zsT#dG{4Ai61+;3dm&B^mD3QzdIXD3awsr$IX#Xk#@^d^1Bd%dFI5{_`Auc^ff)F%X&sD;d%I3@XGP#5}SzS z^2?>xFW!%izLI5Ej=M9?L`-Tb-YlnGlaswRX3&clbhNa>l)$a1^tRvDI4(@B6y91- z)jSmTI6;AQ>fF={tF}N_4o*)Mn?q*n;%KUG?9sJ1wCW2)ySqIyGc$n(plhs5#wCJJ zv^0BeVlYGvK%NClr(fJfApjnV^OXldodP(C>VmTQNh^xA0i9(%5>1|rKQmmxGVy`57B@5BAq5X z{jSFIjA|e$R0ck=+p#V`S?BCYA?%{VEDerrZf|^U(5IMPqdP)lbB|v>=fYGi81L*) ztZp~81(~m5aPrQ4Jv9J!YFE#DBWb&az%QUof%3P8X;(xFUSi!?9D9nO4xNCr&#+-5 zQ-$q36@W8Dp`ZHdKxt2KhwUi10E_(elg5tA;@!c|^>Wp6HR0!U@D9^g(LmoaQ8c>> z1ne~)2r`3rSdfy{1uyv15ajAeWidx29dupGYVv7WsKU1L-!3;=BPGDsAx zJePM}T6!jQreh@+pH9#B@!)%ZbF=luyTrBPp==wv27Uv!hQ`LjcPV=2<7ND|3k_fM z$1ROkrTO(ca4CeoypLr~Gol;qzUA0Lcu?@Ufl{CBdWZPfc)k4v+|gM(+|Ez_fkS5q z-VR1kE|gUNaW&gh;iuro1H8QjIXq+!D=MxQ`TJCHz|A<#R@-6KjO5Bsj5@t=fMwA0 z$Rkg7uVX0IYYgBpVS*KrvyK5n3tEYHx+@rzP`Qm%!8CdzB*Ff}p%e%k`aSZdUr3a1 zc5h*riC>Z9xe~(@f;?ods%NrLGiPG0eO}O`pH`5D#;EXCKJXiBuJ7IXAz?z@k7toR zzxW-wO{$*1$X?GEHJz>6{qQb8l2PBATd~lgr=i=zmqGRiZ4lR1)Rq+ZH5J2Jv?G?o$p65vr-!9e?I5};w?$}ixsZ@V|S_T|fcgdLTj z%bcn18}q2_YafRS881ZsR>3e`3RYlF&S@ROEX7;vcqUq{m@R2BAu`gLseQiwu7j!M zBp@OJSF3_cHwc30ExsDbQhjp7|Wu z>l}thn3&@AE;gz3A(ut0f(}IOk4RskLnr%_>V@|p*|>u&jei8}>?SDC9kXVB3_x4B zfw&Tjlb270h2czdy^VTk(D`}IEjn{Z`qP)$%zz;_M*RJ|GrH)@Nk4X9@ zaRFYtGZp;&`Y;tE;_=GA8ZEfGD)6>~1|B35qy;4|~#+nkR=~UA_m!5xi5TspY zO<1tgqlia6I9Feh*N$V*O6cI;jxF+6>}XEJx8nx|w4QvGn6uO&?h5Olr{KO`x7lMNCe(Cg#% zex%2YNFyzGTxgDs-AYdfiVt9c*64#mAJ9Du-J7drBB_-PB^k^c)c3uSbMv&ayW;ie z+t@zVTj_oeKHlD-O2 zC0qHJSFnYcP*2eEDE#oO^lvc*+TrnF;($tx+g6zd8ua+A)-&KGw3I{LjK;CQmKgOb z3;{1|iXmdrA}TlSSF~eSPyceYhw=OM$Pnt>rRx3K! z?xmZN1Qf<~ft|n40zy^E{!_uCV|n_kxt#|3ldoz8LE+?PcOvBcm@5g~1*lL0PyY-# zckkc7e{OFu+F`Mrfxap#nOaq_S_@{+^Mi=$2k-?&L1_F1wX=>gH+F$xK z4~u>;mn_u3&fivIx**B?JTp_nMEx76<&h4*e%#&NO|PHE_)4E=_lezf88$G7ip4r0 zYn637Kw$9bg8?g zZaS;bpF(BHK6MOGD&m;(x5X&Q_0_%}fEHMf4K9~{2~dWr6(xj@+Zu^%a#>G(%*@H5 zWoLLOm%!CKQDQE-BcIHsi-D)cs3mNHEIQg8DrMraTlfru%sOv#8hZK%X@*&)uKOa; zYn?fM$>>)Y;LQ`qxNseZ=UrlR)%#43IgIi4=HI{Gr6Z>So@QQeC-|it*=qTqba21! zc8V_vc-4bfMv6w(?Y8t)AMNU%!`6x>*x3NxiHhePaL_AP5v&j1kpl?V(b{a|8|_XM z{zUj5&|-CdLd6)q$j`0NYE@9`$VX}>plPs_n)cvfxcCL;_;27Uxoj?pZs!|Sf3>eolxPPdgKV4n0ptm7 z(h9WP+}MOKy@Ipj&z=kv3(cc*0_Eb{x82)(vtTV9_7s$uU8%W$Tq(Nz)iPb((g1h@ zOri(UAJ!kM%LgB$yYDFIt)1QeTjPm)mZk`JfcCtffgSnQgjYXf-3h6Esg{?sJ;&E$ zIIn)H4>Vz~M>DD86A=Xggj33>edIvi2LN+>RKaJK#K}B~^jKDX>E%|brH$Bn{mSk` zs?w~~)Ko8LtJdpm<8Fdl976}{W0bPy+iQu!A1_OuUH@iMOm{1mm?C}`!yFIClh*T( z+Y~e7B2z5(QiWavVxrxWrW#1eXqmw57-prTKwaPVNDG4JI`hPIGNe`eoK`ysCEY<{ z_$9L*7j^8bWN%|18~>vL;K(@5Znwt_HFMAp2^EAsWy?9ZRD6FEqhx3ZSepP1*?-?b zAzA{DJLacP1NAn3%KlSN!ldDZne$RYA@6WWj6}5kI3`WBeYMwj6s=DJ%idta{6FSD zhMvDzKM3fNH-@*n$1|}`n_1On=EU#)dg<>rLks@dQ`e~|((*Mvg8Wp-IlC!;{3ujc(d7I)krnd2#_;!9S}6j>5yLYLX0^J86a26$HZ-YY z)1jMZ(&TMYX}ONliNge?Cjnv6;CojL&)$v&fi=rKh9~i2zY+|q9gA1!m)Z%3=btSn z@7_KR51IeqL@ZTGU9+`?UhUh@Nk*JVZO!+E)c`UER;S36m>dW$CG@M2rv` zv(=@|{}E|QDSl5#Fsv&Z(AnJGeRv1$?mkbFQzWYA6el9ud4!9bq_Ly2wI#jzbD#Pp zh-&YnZQOp@-Ff%6`?c2gO>>%?yZh6pLkQk_g?F;O6Fpn-4K)45Io3asu~XFMu>@U_;=O^M!ph?Q00{{6aB%h4UZ#s`p( zkKTd(A#vD+g{~S=SFCmD=g&7w%XNGIYDA~kPM)3~9)3w_wo=!5e_CwB>*)Mfqi#{$ zK?eDOF*nXs^mhW6N6P`xsU4LvLHV!z_FuL0w8008h0!+M*z3fs&C$s9_WB!sgwf`5 znxoZ&RS_n$k0@tF^nV*n7lwP528c>B4mK zDDGoBa_X0!kNPPa8jG%0EzGi9xV2|#v`zL_)@+2Sjctg&yHD~(7VN*?3@Q>9j6d$` zov35B$hcthG~dW=EUFd!S1rtFby47(oP2a?1lRuAms(o6FteFH`|r;AV%eZ^3{Xx* z|MT@93|$~Soio6i?jFih;|>=sO$c%b61(<$tDqqB#+>Lspl*#s^zNETyzQOQ#(*xL z!$11d-FZ45_e=`Dk9feA!R(vt&kyiH$nh4w+86Jbd9%9%Y-X#rT_Y_?J*9t~gYmyy zcF6BN>EH^02yT~KFJXi|G9e`1;>_t@L1MD}JWKtz+m5WP?m241H^fY8vh(Ijw;fNj zDF8Gh3Js#iJ(9v3Oss~CI>Xws`?Y~}M>=U-(d)31rsN<{br~{lTkSAz8Ad5cB@;nK zSU}|t7~r_uUEK5Kt`tMAndY1T!6X4^vei!SPaxb0Qk8V!M`VlgH&QjZAM@}zoaAbR z8SdkBe1GQO4hw82&%Td#wSI1VQpO$)bnDMaR(0k;8Nb<`Wx*KW(y}f0_o7GLkLO)Q zSISFQxlMqWWn)!=worvj+E?ISNz;tBvRwq9os)p>xBWK5eZTj%O-CU&hqwn-?%e6L z#7yIVk_273Ot`I7WB@4BsM$=RK)l~kkdGNhIOCkeRxiDFm`Qk{ksh}J%{i8$|NZElIokYWG$hkX0-#589Y3Z(BXtZ2RG z02nO^B_#sW+rxsH6v|m%6e#^&ENNo>7=T3w(^H2JFfm)f`S!p?>oj~s=eAOlag)?6 zt<^5nt-l9CKL~0V$%$RBtXC~oB6QuG6H5_cE$Fp8D=wOZ{wY1w2b^Q}>( zXd-VB8pLINQZaQBIhlLNSpzC?cnbBSGe9u>_R)%eAPy}X8(v!=u5vH()k24@PoUTS z0dg!_^$UP#LxJQHMY3X|8Hod`1Dn3G8%b+bI5lp}I^BnU3E4krYRVQ?2k-m<^i2uy61ms*8#wQSaBnQC_QyrQoUTA(t44(>!U5n@4xj5u$PXZD#lp`K z5fK&Td@g%z-kxPAeVo}z!JKAgqOwP9o<(-PJJaQ)z5^GO;{~e31=JQJfO<|lp3t`Y z|62RXs3^O)-y4x`NhJnBQo0dgM5Id)2`L>3L6Ghk1eBq{0Ho_7q(O2>>29P`y1U`s zJpcEs_k23@QfB??reY$XzVsXDU+mwMJ>DcUH;Ew*IXPdvf|?pPym4NK z64rRG9?zK1m-MR0D8BqTLX`t^8}O|#ME3yR;`cwn=0#4O*cUak1)g^EZr?e-?}Aoi zxR!#~h!8YKjWzzai?Wr!v1{Ba0`eK@bs^2M1uJ0@YA>+Ch6u>14z-wXd^mA7G)+CNn#zxNc6U0=)e^;SLs>7%BXtkkzECxRP!wW9 zY-X?|^rf#lWa(yOgO|?>jOdH9_2b37NulSUwDbS`T@E}gWOwd;0?1XW()SK_t*i*K zz)sIcYvdF>7c?0v31I*(`WBk)5B~hJ8m1ETzErfjY8(4yN0ge%RAk;O<^MfM4r~QR zYyGq^Pd>u$oZ6&uFQgW>x5J$`$7ko8l`9-U*LJA@24zEZ&*yMm=YF*oN4yk0!IOp= zf~%$rHwV7gPmtC9bp>L9%BKMEz1am0zfS`%l9&q*gN6oh{Co0)n}$oorLr;LXg&az zkpjGdz~2s(dU|vc?ofBEq#p+6S(@c=$NYm2{NUq;a`j}moY9~ho}2$97z4KnuU-`NK3pPB*{RJzh>hdC*S7mkjql_sY;+ z)W!rhrIPNy@fL3t*I0Ub9vE51#3{!oG~bODllUrTWA6}HA{cnt-p$ejVE3I8J2OSy z>~}PwEp+q;l;_M2dJR~Yk#2z{C7{$lE&O+djbSgpnUW$+ry?4l{sRcm+9!%{{{Y$! zLAJ>e4hY6TR)N(b78xRgM*{i~LUlx@ond`eD#aOIX zbp5zQ>n3p1#oBghBkld9H*OIkS^>Jlib_!22=6leXqd*ru!W4Bdiqf#~S_Nd=uG1ew@HxrZzq z{Hk0XF0c>!Fh20U2iz1A2kj%r1W}c9N@~Sh>Xt!HKhUG&9}7#p(ZStLV{$OlFQqB= zOG!?aq->K8J+6vsW3TiWEj}r#6(xB1)>O~&wKmUte6o~ z9V?^(6{y(1N%qX--XYTn`(L<2kzQu!X1vaxsJQ)72SHWmzh>T*KY3pxw;sX|+2Ds* zB#KCT!BBMIz6yDh=(eP;M4Pvf+-)q>KO>V)bpsm)M>I4mnCiTLdd+1uik*mR(Mzgw zRT%AK74yA@m;G!r*LTbS^6Be4uf+6~l&}Z(cB=@f4Z4c#n-LG#*aDkD%I0ax z%k?mXU05X-s=%NYm7kFKDIk-L>aygnwZ15jW8jEbOR$PK;bRwh&3AM%j@&u_`qi|V z(V5q7y1rd{GRsK3h+SVhZ^{pFy8vJY`r_T?p5)fxyg4ArCDIRrAmFd`8|hxJ;tB!U zkidt$e!Bk_&Xj(mHBD}qY}mVlp*aAUB?64BUx574Oo>K~eb%LkmrBe9yoht6`1()r z>QH;y$}Zyl$;rvj`-BjH1%G#xdb|ddM}@arx6r9H0I9@0E54@Ht!DKM$CkhI16$*v zMx8V{IyxHN;e+8ve|24&WaZ<$`6#%V$MmXiBzr<3LG-31db7Ynwm3F+3j=VjQW$$7EXhU#-0ABln( zB0h_?5V}u=V|j6+&8c+lr^b%6vkf(_r7mnIr{`~{Sl1=}fvi8*sE#Bk^)H&Q*7G!| zF+gH-v=$E_L(&OV8M{s;*OxZfJjS)Y+qH2&Ia~tz3fbwz?J3B}{^7H4l4m!3gulDH zOm>e7%a67o@_IhF=tkLM)_bL#`_%Ko&7js3YoRrqEXSauwG{_+dBEs?2b5uxbqP3>n*4oboFW@8(ZM=nIk8 z(i>AHz>Psop0jD+($@sA@&1DACta8CS?>vDg#&umU;dlyY8JcIbhWnCR>X-DPo@lc zqy|4Q2DYxgkOxAnf+)5J4^j zSAI*o`fK)%iJO}!QX`{CyR+_a23f9AsiX?k18k6th9+y|lfPU8kggYH(!=_wmxrF6zSDe&@~WPaZ+ z&4J=~&)&s;-gD3cIeMkwK*@kmgd!G5oj?Ej<@n3`yqeV?gHcQj7v$gK)_5EbeM7%0 zr>?4h_pA1BwLh)3?}jKI*qoy zkRpL$;-=EqVmBt{t+T>^dN+(=3`7g>seJwhvPN(x`;Xf)MkFgnXSdg1;A#q64D=}|k^8b#H1*Kl+(kr?7AeH)xC85j;~L^poCF`gB}h1f&$~=f7^+{gZcXlNrrEm`+oUJL z#$@%BeC0LzHNsZMTF`Vr40xKpfn6T%Y4YJOJB_^Z;IoVrhV3KM2`tT1@NGk0yHOeB z7v8xlV@?V?d$xZDN`KeQVX0UF7e!@{dK=U^?)eqlp!7_0a4yMJY^y)U>(wB7J{kcq zZ>HyU&mwWa*9FM7s!c`2=eCyR(atWiY$yIQ>rQ-6q)WGh;@rFvR890+vViJ=`>P2s zuS)>yVJdgs6n?Ry7Ar(FQD%(;h1@$V>g$jMgcLKC#mV{m))9_t(EV_NB-h0cvIbdVkWt{F`x8xh5cc(qJ8JU<2a-Gr4@?rC%MGH4n z807PnjrcxDgDW_uWfXA=)-e+HI;5@{t)c$S+!56L0Z0#Sz$TwRXSH|p)PI$+B8T+Kd38aS)AXFLg`I=#}Jko{YtGj8-{GAP^l)Te+*b z67ziGd@A=YM@yp*;+ww2f@%Gz%zIj-!NMTM#oEX%nmWHCnYldP zPC7s^kgZ|)z?Zlm$OU&!7Q*#6xlN)+lj4o~=ByCNz2aPu+!hILv$x@kSA^8&M{EW5 z4$=V+L3gHBk=&^Hq2Rr4nI#)OMcbu-i#uuOZ^klp1GoKqO>Qhl%Wv=z=56YiZbN{J zTe>==9Vl@Nx8UWqaoo7jOjO@CAw@%eAdC-Ah{(GbN|NVCnY!*=V=|@U(EU$xGKn=Q zEs;1Jt649kQtYz1W>4puBCYyr^p%!e;3dC;fsJ*0cecSd2NGFQkMR@UFJDVsh6X7I z26Jt`@d#Qy6M*ZNJ>_AM_26quu;PB`Rb1^M4-_jwvTbbBll^;*I#Vc}u+G4II^==`)#aB|ve+c_c#- zG4Iex`ROh@+|ART4lEwDSdc=+@|9C-|JhnrK|aFfN1JXmW%Ctwd*_Rf<(Zp@kL&gi z_!bLp#HMGkbkh}EUcH{ma`DC0$Vp26(G8#ah zsD-|7)&A!XL9KUw&0su2Df*Q)8*}43QIls|VsI&N zL7<3Kb@|xP`*$=xO9x0O=5GcIQsO?JT`)Zhu>?*j)MRgIoI4X!74Lsn(EqO#Y`uJ* z6(CpS7bmi#{?HH+np0k!^CW^-={x)1gNHc-15Op0E}N91pKejQn(hm9)-xKrx>x1H zgFwzpA+j=;B_V*gp<&NE&u=d&z3G?LjLm}D7aV~tWWRnQ1+mEQF=}$w4A)tOYEezW z_~RBM27JyaCHV%3+1|bAO_=YA5rVTPzK(?ot@1r)ey3|em2dJ=kaJ#LL~rk4=ssVY zS4yV3nv8qZ<<)KKoz7i+nQ&tHuv~qSNbPS!S<+3 za}0mJDP1c*%*7ZA{u#xK5pM9HCGR##oJ)y43oi-QCts^;jk|S+rrV8wx3`IGV9Vb7 z$pOI)ub+KMkjSg_z`=oTd4}M&HOsS0$^>k(O_gIl_<1jKX=ll#O^tLL?ySf4CDk?s z@{jHs>wVd&tM}TxV05^V?1(*RQzEc^l)cZdb>#DfS}O5fx#NP)!u>IOlfnLrl0^8+ zes`nTF;!04b~q@=ucs7yG>~^*Y+SwPF@Ha)D2Iz#D1PudC!~!^zxBPzCtJ0}Oj0>B zCf(ZV}kNUw?~Q zO*f;I>qU_6w*nKI2b6Tf9Y=R?gE~8i8;Lj82*gHpTschgKAWH?OHzp`uwl3JTnK?Mfl&^o}aOhXt5}(x! z;9;IS`Dutns%cOVuKXdoG+OmHRbIAOD`rNEvbS%uswaN-IwzjpET8!eYFu1m{DGnK z^Ya_xq$}}|_C^X7MsM6VL@pUb+=AY|BFncu3o2i|vm75^TxQk&xa;f^M|Dhx94W2v zP7Ioz;7EGA9_6&Nd)OTEqZ5J(YA31Oy#zcxFC(HXtGc$s;W`b#nGF(}S1vUlLQewk zys5BX1foR0o&6A5Dr7^EZ-X}q|6wi%I$`C$wesEB9L9PbbWUP|a*)h_aMG?MQTg0r z0jITcn(O92Hy29RRJK~>W#-`h3ZLrt+p7(cU%q_&rL{S%QT%}(l86=y&h!;;Wb=zf zbPW+9iaP(ghV_6^3)u`~lq}~pZ@9e&nc}S8*bo@fd#kBp;^v@$tj$nt%!4zNi?deE zu9!-#grz*uDop6?=mQQ6X55unPBo))N;&9#Lf)*H@UGK}5FLT_4@C&{FF9fMp!Up`cV9d}Wvx5jhu+ zxgt(HKej)Ts*{8fTkKQ+1k{D$Bxb$(1U5Fo`wNdH`QLBdJ2|r`e}$d4`e=5>te`$b zFGJECinV~TI4pHF10FxWcB{XHM{bLoKT@Kvi?~Qn4&S~X5#c*%# z9BCQ&z>p*-aA4#~!LAzkxMB+EQ+3OovCa-XRJ|lOrcz?vnL28uf84(q4o7Pw_mLw? zl@}kOU&rbH=XXtda_G-FHSOw985 zL_>M{@-K|@4G85t_fpOt2_H5{PJCjA-#yTDOV5mxQg1Xu-nm4}iF;P>D>?0Q?>%V6 zS?{WHaii)t?Ra}ok&U37_Ba;?!6>qly5`OYZQdc5jx;UayWBvrXt~z)<;$JE@^TBp zM{GZJ*t6X(lj(B_@Irl)l3+be44BZy43d;Zi9&vNzIjOG?%lg5M`+lt_R@(hD5LB^ zRejD-xX|#ZBTs(u_0({uIiID1AXM)|;!T#b`BUqXW5v-e30CPH0H$)B@Que(&ne|w zIQ{38?XUs=oqvLt`8~`=uz;+h0ZQJYhjUINx9QWA5DRkY6%)S5P^sTC)W?9VCw{an>*T$%+~s-pO`qjy zDnH`4(#luzc&P(hI0HmFo3t-T+0&ZT{QI<|2@#iXP>BoCj26&>Y0>tA>I(!_r4c;m zo?RYUFDEGE#way^`RE=zi4{B-HK=i?v>uOrS_X)Y*oW(noP_9S0ZEN}v^5oeJl*-o z&v!-R<*(#@@4yt3cX}ZwW>{bDY%>WrONvSp9ErxZpuQfiirsaQ$#r38X2t{}A%q<` z2FUrY%ZKZL0n?6#K|%BFhhZcO7<9}c=QG!4vtP;5QU+J~OgnBnZuF_;P2A96fF_Yk zBja`448bF>9a4Eu(u(3JXYl7or1c+lkL>?`C-l3qQS#b6H0xI`jHJ681AS3H(TVxJ zgNiyBHVWclfa^ZZJ+ul@WH~kdon5Ers6kDirs-ta>_>DKrlHuwzQ`=t zttf*7*-36;`W2eC;(3aE2-01oC{0a(?c{4^fP}MZRuFS|xUmbiL;mHUneWkEbL2Pz-eHFS};So2?BRs*oany5`H124lXr zyo$Y|{0qXX3)qcLua-;xcGJ2S(wHV-#>$@xha~-sxuw5MJxYiuS)){9>VqRM2o<$- z-+aUCtuo%eysbcpfbp)^B}DR=e-eRZk3`AS9Lj##^O8$)oJ_fU%y|XqwPO0IN_+oO_~C=S+zHz~T`uylac%QGx}{ zgHd=~LOVv9MgW1RW*5s?92%Dn3JGp(qnALaZdKlqfJ_ngPAGqN%{b)CvM-#Erw!j&F85E>r0Fz0 zHAg$Gv$i1lv5mdN$9`S}^THdWja3G|0oSC`WU;(KdfURg$%^bMCk&rBQPsJNu^3)q z>p;|`X;T|XL{!vg>xuH$;N?&;IM`xiyhi4QGw)m?U+I1Y3koB-dw;VZ6b{wLSEQ5G zZkWcN7Wi*qFjx@>S)~3@mIf_A4B3rx#Vm)i@}k__+)`G^Wra8!ZZo3WCzzjdVzt(nyJfbhDA}E|q4}-AE`%!=_VU(jO}`i=1;@NYB+Ic;Yor01Q8Pvjo^LNg?! zBSCqo*XkYyyP57Dcs-Xr;@-Ev=;;DUBu-2edx$vq9|xe<;!f3{@57_~l~?MM;f@Dv z`}9%PbCK;t72D(}5AciVel@xH`ulG|T6EN71b93@DH zlB2^3%b(>W=KuGFb*uzytQ_5Zgi~P?!<&IOmw(dBnO?kryt+bCPIneE9_BRV3zHff z(604)u{d&_mAgWN^o`8*<>vjJ583k&F6-jv%i(lAzrOYEA(E+i7d9jg@%wPc_aT<5 zp>+^jWBA|Lnax*JKRTqvjq9dU#r9GdJRdc=9hf+8K)RzzRo=DH*mf4d)>De|;FFvGA)$d^mQp%DF+b1wAS}i8h;usy@>C9 zRIq)}&Q!hK-~NjZ|Q7#QP{d?bJDuMRV%m? z0juAO(*0guZ2cbBw7uhU?s&?Zh}#2|i>vatt=q~fu7K^C<<07{|Ir+Dgai|8cuRz? zee*>9cWpAaC*iq7{MOC4`?IWum4o#S1HV;5(@i@r&@!A>UVvvZ+q8MIwB3_ET3f1L z7d*|giR94kN%&#b&~K04uJw*!&so>Zc3|Zyy?nK`>A<4nB23SHyvC!&z_j-E@AWOb zyL)lK0%m&PWdAt?;DZ(>z~wq$F}^3E3h`#qa5^8 zq*urS4(>lB&qd*z_tz0MJ5xvJ*Z0F=J(<0Qv3U{GY34WeXw9d?y6`S|>@SWNTV-u@*ApKORsM|^TL z--v7lo`Jm|_hOWOaB*#Tu-uqlwtktMwYo8Dw{qw&GMc|z>v3@>dvP%yEqHi=E9ll; z**(wZG?X}1;eB9d;I&5|t`P3%J-0ho6E8l0Da*~xoxLhR(JDI1IQZ%tHJnus3K~+uvpT+e5 z>6fN<%7ps+w|kPgAE9**fg8Z#zPsHZ&Bq)zI!&AC)-TOPAyJ>GuN1uV=-Kl*>$2z` ziXat^;t-qm_f|3OKlu*A% zD68}mvb-|DVH>xZucl&Ib)SCF1|I4$sQs`cSx$%FMz*uDt37;zWwbZ-My+T58%cu< zQ;A{%0WFu8N=F5l!&F$PNEM=t=_l>PHjAw-eO#M{F0bQF>2Ug%`(C3TPL{|(9e01r zR32a7Mvw@nIS&h^>kA5lyLPXLL znx565D&;HG-x%ynt?j}aH#fe{D59KoY@geqDOUX(^x^>foKKyPSI@8ehWa7kw*q zn#h$7LisBOiC7?bk_Z8(1jqNq)w-ej?1b#eP*C~|yw=SjnQqLtIM>G9yacXi4Q&sX z`us(6$m1LQ)NrS|x{?h$Dsm)=g&`P75LoKa4&RDfQ;i5{nH{?Ke(?!wGSJy&hYC?1 z^yGn>Y*Iw9y^B+m3ytnsJzN6!KhrF|VDd8makwvI!|6A?Yal zTx@NoxP0`;=X`=6snGVsd&72M)JHDa(2E%9!2jSS>LrKq+=<>mhgqQeSW8P45M z>n*`K0;NpJDG>cgt4xK|lKVNkd{$x}hnYP=v^ zEz`8D!-8(qV-0b%UG=8~b@&G9xz6({;k+_lw%`BMistJo`?72Gkcgkxc(zu?UC!BN zrn#^FyZ%;Nwwz?hbK5wJ--XzU8QfuwS6T~HO_ybmXZY`X>L36Uzo1NX=Q5|ARYxCVrp;VFm-Png>bDrDk=yeX zrzS)ufrcE)!rr9k%mZp!XF38+f$%W1orTOzFh8M(J1g6sWGjn!Rn^+=6I;Y(#+MFE z^o~FYcrSfMzxsbTYN#%WI5GMaFa&wH6mDH+6K65;M`lzU;x#~SntZctf^@cVU|V%- zB)o$%3p>BJBjvN>w2K1|K+Qkrgp0(pSv^7}!bJV}VzD4w?cF;Gb8~v65s}N6NW_v) zDt)?~&Is0=!G)H_So~om{N;;M8XEY7`d(a@k1j#omsJ$7qUoXFksLVQmd&nMD#*SV z&$hQP92GP0+{5>CzdH~-j^IfPaIY^wCO3TWUy4UoBJpauVX>1+;jpD2AELb+&DDh9n z?2R8SdA_M>tA4*sK&GLk`Q2l>bo!^e);EE4IUptwfM!G`!@X^Hq$*j zdpSL6@a9YhE&2$T0H1R|PEI2Duuj-ZMwCGJ+T3{l#-Te?-C~Ya5Gh}pOagpe@HGJ6 z_+yJUUy;JsMCxrH_(82oc(M|-Gopz;GXif#na(~SU`U|@T!Ty{0L{H6%=NglX3g;h zRyAF1xs%oG06LqE{szhy&XNAsOg_mz9QjQn*gXWzd;U%QqP66Zy;IJjfj(ri_Mtky z?is9#zLYjdAkan!?;HK6sZ!4Ud?A}*B;6z-Vv&We`uIOY0+Z4k9Bu2+&{H1pv#Vz( zaoM(}@X=>Tbk9!4?0>ZDPT|N~qpGqE!nn@hGUpPm-&0?klKPj2J#4noo%lcoZieog z{px}1+ONk>Q-ak_daevdd^5z(J}tFMV|?#IC3{2jNUP~WBaZp|XvJiENNdk6Z){-2 zC~07|gvgiE!-R+4q+C2D8T3at+8ChGs-xP{!x_mC!C|%H5E5q zt;@`=E&9?y=BXoUP)vQantr?Vo$rCLgk3 z&ULf(SmfDLeCaCtJW)C7eF+mBADauoj3ONLbb=7v`8ro#zSNwO9}-HQYLppLI96`< zmHaww=pB_>q@|D2^}l-5CHB+s1bMcds$ozZm>lqtCUy~U`@2@LjF;^>2R|X=EzQbI z_nT#~Bt5o-skDvMtB(1xYNAHlkw73-g@MwK9Rm69Don30(W0NfRkfiuuL$vbNK%Rk z#iud3NntbM{zNPCN=yAC9NA#*8N;qI@~&~I)-+DvYop4~6J;jOg>;x_G2GRoS4vw4 z(i-in+*}S3r0J6MB0?YMzvE1e$V%rViuH+&1@mtZy8f`S#XAhv!8MNMJ~?_7g{!I{d{+cez~g#cO<6n$v2T-c-Jf=43Xmn}NlRAy$hU{<^ z5}->rcsu?k*DAesU$TtF?|z6NGmPVKl7%cFZ{)r85%Y0%y|`(;)x-5d(4jbkkiVF+ zO4&AZ6RV*l)DN$cO*WG^x9_xYCKp7hNz89mAa_uDy$KH)sXxnzH$$4R4F|>?q=Cx0}vT4&Yt)=MO-)llc z$LxgE7+1c;eLts4eYZ8FaU){irQfE}>$|WK2s{*9N=nM8ZWaw49bDdsFa7Y+r?4oz%jC5x9@zTR)6<0HWPp-7 zzA2?&{O!c-8y;rh;);!>l{rclzV8pL#N|xQwhdq?>@$r&o zW^_{qu59o1-FTOmmuC*+vXm^)51nwPWd$JW@4g$8eeGr?|27+RaaiZyL!RuH>uV<; zdVhIg+I(@OfK_593_C`Wqs(XrKsIfY*`FI@gTw&%2=mo{PL4!1KGoJGs{P zN6aTZzthCXS$AGLN*-e}it;BP(bO0!MVl%m4`cmBIwnhQWtTxN2V;_U4{)>&UQ_xR z&9R|TKe~QefBwlk<$P5HGMLgHuOilmt0L0=jDPOO$@aLsoZJt)I_p;5kj@|es_CU?;pVAG0HQYd+{(HmLb`^$6ABkRZazQewl^9p{(elX42wV&(O zk7HC&Bn#J`PjV%_TQDawkmxdVC89fHjw50A3}RQD&n>q)UvC;lp!G@x%fMOUO7V|>~3XcIECi`kC-O92CudVvCISy}HHWLe;#N{1VPIb91!;(t%BvK4La}q@5v{n^!yK zo8c^FOPkW-&Ib?AV=|L%MHHP--^mgA;dQH;%msz#dP0>7F}{U!lX*NhVAoyyqEJ?R z>d-@|aZA2eks%uuS?RmoGGA_hD3@YiI0 z!)jc2Z>a43jcAiIrd}YjOf<#N;z3J@s5hxMCl1Z-ad7sZoyMKz{raDsV)fLM- zwRhFN1(`x2^WJA)n4Vf>xCzBaiG{PUw@J9W&?2}nB7P~F50KePwVNhWl$@|i7VD!B zOdf>TQGxhv7`0?DsM$5jbxEu%Z)pMzGSn`pt1!~md&)om%2)DX+fB37!13<*$lq@3dpjq^6z6+Vzqp2f_? zi>xv>X(g0Cgu);@S#?#0+XRkE;l0Zh{G5EIWQnh?l;y7nNvXkYVe|Q-e|EZEV;B(e zLN>GgK85~8T{VuglW3L;%Dy*R4b6sN&$KK&S?74_go0%tLH7(2lc znfyR}t6E?seq)#N(@%m*-?Iakc(O)TEdfdm4PrqjI!jB-FU5+Y$jb$qpC7(bWWcq^ zbR~d6hD;W2JX!Uce|m(jVXZu^%|$T{tHTX=l-O38)&_g}=pq%bm6n`QY?!{s!$WSn zLYg(Ux=WBSV`#?J+Vju%0)f5i@iXZC9=n1Tl>w?>8zr~}krA%%Mat_7F6^)ntvQspOxZJwL1}GixZTQkb-;baWO*t56zV(LFM zHsO!mrGG$*{7tpjP|NuzjSm$-_JL#?8kazY?Hw7}48&EY;^WhVs&j7aD64C99h_TF zdQ#ON1x(vO_U9TfC`3{UvOUwniylUYB%g?tpw!3g%?(*m7(K$Q`rK9#JiW_3C^qW3 zYbZX$GTGnv|0h zx2I>ruU~xPQU+tbH+)zPo8yy-Z@@Za0HGBOpg=#H^ywVZhKu6Y%|_-jfjMF*NYV<| zSpj7t`?ac|i zlfT|(D`i!=KdE&=yyj$Wa}$@6GI|JNjYBf2TQR$bMdsx{=hy>E*EGyMnkzk@6g#sh z3s;42|BoY{_+QkGC7MTUr%=RBWek?4(lIcsxCp5RpnLyeygS(5Vx)PatlSNO#WwK5 z-fN$R2uXxmFL?CS7xyfu`nbfmD?Yfjcma=#fmxk0)6mj_@ukkoV#-x+hFlc+wR zK?y@}A~@WAZ7s8mvKDI8OZo17Trd)ZEb~fDvIP$vr1qw3Az*1$;3(jrSx=2{wZa+cGDgS>e9{$$^IFJIEqusmc;z zZoBlCwS~8aM=Dt1){9CRk&{DMJttIWJ$+65&jab6)v&Szxz9VAH?r z9ckT~G6OFz7<%3`V&-X-pyW9P5(#H0Gq>G`eQx$SE74M+;>MXU;R5T!^t5Oq*n5l9 zY0{qF-kQSIzY(`!Jgjq+se=Ia2ztqXUjep+&`gl4nQje(k|&});K?zVgT!QIm0gB< zlSl+g2VqH+)UAww3dPOC<9SeePVBx`&(NdLNO*hv6y<>ug2Yq)T|K@eVZ1rNKKDMP zc-g)fTHz**gN-wDe}%U63`&dYWv~}>;`KNm^T)cAr8Cg3dlnz1e0GEbs)S%A)d?@- zzFOzX(y%JDpr#FNbW2;YY3}j~D~I5Qz_-{KdH_uT}ESBbhe>4{Vmn&J%%E0cq&z4k>_BQaX+7Sq1@*xtZ* z6+fx$0$)Sp#ful<`Z%a46)3WNr)J0mV83c@XM;PJm%5S-)^?poR+jz6;8FU*Uisy^ zW7lAf(a^llc9)~wZ(^TNddB#-UD_k@*)K%&tWI+z)fYe=jg6`C@$nT?I6pZL3x*(~ zc!sq6@cerJTW(PYkl+PBfCYa}BCSd!3?cjU>SJ~F%VDu=o3XJmtu{Z=iHQlOMl3$* zshm-@o30fSI2mrSW+@OxoM$Wx9M9+7od?+Ju!xD}+gl$HtFUh4A#%L~s0v0`)!R1H zRY5Fe^`8+8wy22t==hlT)42QZ(RSs?x4CW4KTD<~YnB@*0YVR^Q-MK2syaGvq@^FJ z6)4h+umU28BhLinGBh;hkobxUP9Q^#j*gz}%_d)6c{w>b0oE(pal}i5qNRwF_n0wy zy4n)g_v(b2o&9;;Z0R%CEZ}${eog(KTau7Ae*``dZR+n|hu~+VGA=GJ5qsL&N>M)5 zWH{pF-o$Y7P+3Z(uxFK;kue1PmWiop<+KgBAYs9{ysvLdC2ANQ9U{I0kHVe8!=YP? zZQ^|CkvWnfID~|p$q*&c7lX0Q>Q{K6Gtg5C4W?i(btQd8(L%Q}YU558p@9&Q9`~|k_=dR;)e)=?u_Yz*qE3fK=PhwcGCRcK1c!5Rg+geCNz8@1#^ibEYZ%Z@7frc8w2iSP3OWI~2nLYN%JiFny-R5$=@oxWZZS3xY>8AE4e(YP0VGD0sl%17{QP`} z{e$67pus}p!88V3u@~$eKqesi_}&^Cs!(D5*g2K>xq>&)4=RjZO;Q&L1VDrGDd_Z^ zfY0=v8_es}3b71B{Bw%g^pXh=KzUF;R@z$Dwq7H8r(|uSYwLoZVCD_f%hNv-dfuls@Sd)nH(*lo1Ob$Au_@ZW z^Qe5Ss){Sf_Di#GyG?T4nLNBbUxc|IEU;r6(hg;+p*^?cOCL(3$M`#@zyV~69>w(0 zuLMnNf2E&0Cb>MVajls<|JmYmG|ea_Eo}@`Lrly~0Qk)&OSID-&EQKgN@>|YgDww& zJ8^0#EH0+y<4e*g)^wcI24ZCg-Q8_J>50;oHIotznrNmWI$a1o_A)lYHs-lJO-Rh; zgVN--M+0)X#rxdN^GPPEJg%5gEC8=S@nhAh_z1{vKy$MQkYxmmii-tZC%?nbW9`u7 zr>NLW}XZJ{89SC?_*3;w+k?gqvx99Owx*gEM_d=S1p#cm)Nv3?U`u z2(~QQYcLQNzq_DC8WB4!!84Xm23tHvFC{Cp>LT=lg=L)Kp#-7Wqy{Q~5RRVY$g%@K zAj*o07|~)EOvi1yKStvVNHF8&gz&+(uu}^Ok$eQf{Id&-pKx||8kPF&`WAS^`uqD) zQ63;_=V+dcyZn<}sa)B+6*~RTo%>X+Dk7jtfoxnpzs?D&s4DA#z*Iqa0+R=*w-~*> zoDkp{LizXh+%$2cvJu}(N+L3WxT1>D-A;am#~fk4J;0x;IAaw5JLNaSC0$&Z#M8?B z0U{9(PS6E`99eoz*`VBwO{`pxNPP^9!IE5vAM!i~8{9iM2nSS3 z)6qSrh*`5ZF)$DX6fh=ccJBXmebZN7k4IHU5!!X#?6XEyJDEDE_h{9ioQa81)Xge6 z%2ztpNsZC}dsjy;M_}7~r>gqe+}u3gxLcp?2Z}y*?)ck4m^|J5Cyiruz~A!UTi1jo0w(xpXXkri;qMXipZKB9f9^Ln zH&UeaIq_3~&8;9-uGAXT|H=J)IG&J^fcKMpPz_saJ zY}sPSCQ&{Y3#KbFlxP;$mclIAS(Ten1|d9v&I5!PUt?<>FM=cgo*D$6Iq*C(v#=lo z&IR;wh7$?PU3F`AR}|Hm@)6~GvC%SZHa0igWm4}jz}U2OG*cXh>P zWi6POg>6U?eaXrB1lo3#$dMc3m(6cZPL~YVCo9cd zTwH@`ywG`XH#JRF$RIW8}7Q~^gC z5M1UgNhBZ)GNV8k6sT#abr6p>HZN55!@wW@-#fToRTBEw29ZQuo?^JsXP) zVynHp^}9OR?tD>@@fnom4e^D*fjw?WvYgN}#Jj9#VlHfax5zSCfrrhxPU%OG3ln^% z`2eH}E!J+yMxfUecA8WI|53x=4s^l&`qhiY*v^O zH*Ged9O9cmzc-(&cbxM+XaR4gi7N`5jv$Gk-49KirO?4qzjbp|VtHS-2G|UI+vVu! zxSZ3rzgoFXEDX`&%r1Pys*bBXZzHF)DxDt9!s>VcQ!i`SAOY(4r}6E;r9taYuf8al zgj!05p30-{_fYx|F5aE-0}iuv=r7j(d(`wRk;1=v6jQZtfxLe-hO-HMxNb0~yZf19Ku36B8P2Y-}yo$YMuS$MNfcAOW|a z!WugGN+W7`#RB))rB51>|K)me{jR zBQe>qFGIV4%jdTPkl`vngspu9$lMY;dr@Wbtn_BJQdYYLf)BuOUbI*m0>Jv+c!0s< zTRii&w=b8id7qXaI=>%H!`dmA$KXUmc>oyvo_E-)23X^w@Z4M)%~G8%LPMYSKNH1h z&cTlDmxKs=Hn-VQjNNtCf8ZJn1i0A6*2DdV`va!%juLHH{ZT&)v8dNewji+|H zAh6eO^WouyCK?coq5FND!lc089->}Qt$)MEj|A5x{-a2E1O!Kyo7uu0leoBac29osG@e7w(dlH_I(?F$WXp^RoS1Fuu*h5Nt0W8>qOos@S!z9t)lk8l5C zaFJ!K0<-txiK4Is$DoY`8u){@#YLM47?uS+(Ib-@9q^Q978b_dEXJTR^ z0L)y1mx1x}^2+q4uO5T)HI@vP5lq{kCC_$+Q2PEr=V<$}aMOaQYQ<%Z;fJd|s}2G> zcv_zpL`P?_7r%bJ?{X*9giY<3kAG9T0q~n2FZmjM1uAlN7 zt{yT{GE!52LR3Kz^Ufe|bD5s$rm5tK@{Sj%Y}U@&nciF+28M)KOZs&ET-%_bIw7-@nA7vAR*g7K zsw5)HZ7VQ&mxDmkU{H7nMCy3Zc^;mN`~Y^I9;@v+v=};3+!yc=G+;9TXI4n(obN?3 zNcke1M?{myRm3xY{Za>d84%EU1!&W-7B>PnUwx4OqMQ5mNSC>wIVeNC>3pmAg?a@1lNZ~voIxG#G1gSEL? zyuYR7fecb{bK?MLG__+((;)*b7mT%xJbS9GuwJLG?0sA(RoHKd?nuG=;RUqbI(Z-n z>@p&dz87TCu&_XRfI$%WHWPrlWy%#NNd%sV37PkmzCQV*phq{&9@O_fH`#QIjLtpe z?hZ$NjJOmOQL}rKk4>0{24jNpR$`3sOpK`ko&f+6+#Rp=u?)mG05&WH z1*{(k`kTkRsYUM$M^9Hq4Uj*S$JD6%DXdrX`zr(%Wz=#$C61f6LDgEzyFA`>?%uX=SX?|{%<~Vf^ys7hh_@mc2+l2m z7TLA9e@SZE9kC47$sE`;5GW1+Y*qqvz&L?i5~Q93^Ema7tftdq8`UE&9esBRuD@`@ zhF#<|)4>Gq;IQXTJ%g5DUC!C@gE|jF)balI9A?t>w5;)ldH?FzFf=0cWyb5V*;ol5 zR4i1Klr{%3Fxvw|0gPp^MrOOeE5Z4g(iNyr?h15I;^S$Kl?=6&e1%SjhmUUc|GvUM z(JK#O4ysJ;VSy*hpG`jh%ZIgil`6A7oU-PdH+F5O&uKbnT`Xcw+}1AoB|nzV);WQx zESN3U%{f8&!EZRrNc!#yq;34}mJ{YIo%7M!G$~I$R?6E5|+;iYUp$!VGkDoB-GT`SZu)c#r>U`32T%@OHG4%zH4Ib#{#jJO7`S+zpVW$`iSVUtQM;eeQdub zac)?%_-NMb^ca1B(Y8JEuoY zi?>mQg-oUdebm7o?KpV8A)W2jmg53{3iDFhjKp^GHRg5@D-KG+Dd`jpl>TpusU6@q zs;T?qBnge#SlR{tzM^{7=68E>d*DCP>U({0HCt|8Z^D7t+}zr-B(MSLpu;E&@4Z}E zUBxVvXAyjfl}D+>fD5bx89qmSirHeBBX{S-i5iLByKx4Acq<0*tQK!@!l*ogm?v01 zo&g9MHJ4~~A?#K^H|L^S^M=a05UKXQr9vm_U;ccI=0d;tzNt(50D8bq}_1q8?T|jXh1OyJ6kBPvX*}m%F7<-+g1Glt{0idiD52pN3vc!UV{#!CR~1#%nvbJ>GFo*N#^XoZD!hx;c7VkG7|!ErEzwgte%HL4>J^ z2@&u>0eOVH$qjKEoK*zp4%~HSRhGvL3`%M6pE;6T=|eLK$>F)Zf{&k@2D-9+>#5da z#UK~L1M2|JRhkU4Z?}Ug(GCdnWSMR!7|*2&Ix~F#{vDJJVB}+f$90n4<{yUVa(bP7 z00$Knl32H6nq&~7%YOSW{$IzdD&lcqj}l&}g@%Uy)WacwKGM(t1M==px)AIRLbh-H zWMD7A&a11dzg5#U1sBXgyfz^*vC?bE3M7|=j7%_OS*|Wn>We-8qX)>jxw%AQJ_75B z>)tkJ60%(vn45A87SZquV#`sanZ&C-U8<+7e+Ro5`LzoQU5s!FB;zpz>%T%pDK^5x4Vx2DJ@`Zx%&kPFl8 z^*K1@p#j!_)Lp@g3Pb=W=xL#$s6hGnURK7ppCp$C0+Q2dO%9yM1PV=iz3$jU#G|O< zJxZToV2RJyFD!cF<0E2F{=SjH3k~rOz@rQPJs&5Uw`tgewL!76AJ4orC^C3HYHgGqO1pFcL++wWtFB$Rs1{up{jpQWUL+Dj_|(+BK2;Rj z@ae{z(r1Qv!)T)ymQHJ6+GAb6V>0p2S?IhNqGbwV##AlKXt^kxTsjhpybOy zI7Y!R;-zIUPDuqDHCzYv2viZz>%F>$!){XGKOODIN=nVQ#`5z7+Fyent4?)jBq=`* zE^Yweac10>`?-@smOlpb>@NLQL$geGXqWC=w0CwQe`wOHJEd{Q9A@~RRw#AVsa$&?I9{@30Hn!3}uRu_i zLh{y;iA@?lx-@i3nZE zdP*d~xj}9F(%PDJbmT<#To(8BlMR*bSb8x_V$wFdw*j;blZhe?J>T^SxD;>M7R@#}2)IXP7(~4# zsW7cdlSjuJLjhlY=#)-srh^|df?<%cu`wMT-3M}^Cp08r;5R1?;5P8<7Zpi?b6Kz& zd8+!{x}H_z=_>Q)ixnst*B{jV%bk}0)%PY$)>qIufSV-l5jsIkdOEbrWE5V{n_zU% zT#?b)Nt$fP%*HlRt1u-s1tf>`W)w{Lk?r$kSvwFDneGcy)dw(jAbt-e|HkR?rDo*>PE`qs2jGrDeSckH=}qMak>A4Fr=f zx&r|Zv=HOJU)mKjx$$QV6Tn$v-iqX<3Sois3}@geSb=i1QgLtqZF~%p@x8F5<0>*T zl3qk4!}t2kGSj1jIo{Ui|@^xZbLGzR%7UHTDe2`6Hp6w!dA>F*63@qrl%SiJ$loh-6{f8h2uU=&+b zRTbP3uvh){YEkk@kcg0u*Z%U7=RiU>aMr^|R?V9W!5t6SrV%p#+qqW}H-I*FF7<;oOB?X*CezxLH4F$#^R@R8d zMj@r%*;%?IG7$#-`Y*s~;EJNJ!1TJ!AIziyUCMDVr1n1B=YqtaJU}2|VD|tE__el{ zz=fQT&A2*6S`FwBplqPnMhwRXQgFq{phcAwgK7@`tAzQH*IK_oGXv;V8tFqWUibCTb}rd|29q=yTfXkxxsM6jAL91NxE zX&c2O7pE~9nvN%|`XE9)^w^Up znYVjCKL5PVw*b5*8H}X9nt#eO3=C=Z&=I1Qst$5t9vHu>`>hybjuO#*0` zKQ&%r>=KpI9;^+3Ex_zvAW2Ypcgc51KA`RIMb0*5A|IU(6c3Pxpd~m8Ws+Nk&+NGY z>j;1rW>aPQD4(IqZyFzi@dHqAd`>`~kynL|qE!&&5~0dL>k*7G87LXx5D>@N!}wn_c7(P%FI8?Lch-Ypiqf#`!z_$u*udH8XQ~S{li(R|7qAUJPIrv5ShTjK?2? zp9l%*=!TThM@Z1b&D#|iw)uhcD;4es24ME4%O;DX13EU4{dQ;TFoDwBh2)NMn2TRr zo{*H>Z!wJy0O3GkSy?w|gs{RINFT`~EjkU2u+UJWA0LtN@bKR1Ftgad2NsIzNjV!E zRv@00>a?=u{K?f%So#uGHO75|e97ufir7{LXH#6wgSZbI4Dn&$fcIle3PnrHZR8Pa zRu+^*inOc9UyJwyd_GIc7%-z-0gioH0G(hNv>2*V|N7{+k7C;${rJf z(wtuWg*PHoj0Qk?a7sgPC6pGFMDQd;n29blE5sfm6rgN?G$nUZ0@rL~Zf~dlC%P`= zB*XH(!FoX722>VUIV_-ZWtu1u`F7G^W8}P1RHOq)TZc-F2f53hVGR0kJuwhs(1jBgM(p5 z+Gi4oHlP?D_FYzq9z=@srZSK}BD9~QQo})&0@^7kg^o@0z|5u$JSS?py3mnL>#AI5 zZ)~2ju<5C%=;-pmMQUOv7$-BvV|hQG?7{*J2cQ(iWM?lLQxhod0RjN*buZZ2C%^ql za1jF(A8Z96BtO5r?w)@VF<~YB>?(cUj-Qv87x+VrYJ1T#yb$}34IYcWjlF&K5D|QO z?C(S7a3w;oPqrn2rVp%uY1vw1mjKz?w*L>JzB{hR_I=;hpuLa=8fZuwNKqpah6U0?7k#8{O4 zd5kW+diCmQWF*a@!~gZ@#rAee`d?qUdgygpYsx}Kg zp}r>gwobIGe^FFa?CfN-;vYHN+1Z(QciseR{=lQewqI$Z9g z;TuFXh1!!Lm7D*LjSDkDW{mnfTfLsqc88g8)`ZJtN0|@t@8HvxeQVj z*1bg(T6IPjy_2~io}#6vmo_os92*-;OYeEP^UcvQ`GajrMf{r@YR?ckgFiW_Qn6>= z)Gli=t7>X~NLR~XI_Jur5-$2RTHz}>M)6>rM?eA|VrQWzt6u*r?|&laV0_9ui^7OU zk1isC!=^ay?agAzFGo6W=0=326bF4XkUu6O5(RGRx~eL6uDQ|i;=SlRq@;EdVhy~& zj?S*@8iTnMI&#Yd@}+X~rabI90w4BNs8jYatuw`Q{N0gU`U3Ngo*8%GFp2Th4IE&5jIt?vCJl^)ho8hE%LL^xn0Q9|1r!E)u4u|28^@ zgcYXqE<8A$@Xb_obwg>ujV0W_a_-^4K}bvh5af8Qxr~gAeE9G|lzUkTPXg*XE(wVw z0$P9ilx~TBx^}|WgM#LN^&h>OvWi|G3hTP@!Xp?LJ`6ZP4El zJ~7Dlz}W#8EBq$$MJSt+VR%OL%gf?V=W8WJ5|v*5ha{3RhSMx;2O)qR49OD4+C)g& z-=<_0&KJS!L3q*3+h5x+b(`XJIoM?Gr9#Bs0K0m=2TP-)Gj0kXn`x4V@Dna2VH0aw zRl5i#b{e$8fPo)i4dBPd{gC3i7!d|(6y}wl3oRc$u<`LJ#ucO<h? zUw?sE8qh}pQ$=186d%#e;}pTUcC0x5!A9d0e$u43cpaxEO&^O0-h)D<9-~o@o^Qsb z5*AcO42YnSldw{s6N(+RLklnNC^-Fa_dhvO71&9fL0Vc`Ao?F|-?@i*p^~okI92?D z?EVISR;$v8ECO<^K_9EGCxa0lQlqpQYP-X^nrOaBe4(HjwmW71^%!&}nft511sA>? z<*wm=`sveEm+2m93yTx@<+1gBZEie?N&n$*@rtIS*X6{`sh5S%Es;NRI{U5g8=edn zQQ`RS8g(N>m6Jg}?UO%#ri3?)&iw(#5A-26z~1rj)%PQUoRwdu(C0_?s-rel75y#t zom(qdth~`5{26D&f70F~yu6_$C89TUFH2hzeFdb2JNHt&Oitbr)kq-r!%mr)MC0)Z z(O2M2EV60XGcbjNE87QIuRGS>)2C+|c&7Z%%lG)Z%1GKdIymHLzrA(q){xV=!Vk~F z25u&`rY=%r6ln-K@SxwubTw$HF%oietRvqGZZ4yX_i$wTJQun}_ciPYPdQ-=f#d-@ zz9H{+6S3309}!Dk z?4MS5PjG+*bt5MyCxNsITlXB3`hM>KirV)5S$iV+ZeB$P3S_jM=X=vxX%8LB*k47}nwyfAp6*<S->&)pJ!HtOn3Lnp}}Bhzm)$_iv8g|c4az0NODixk6cD+(5$?-cxg?5 z(zLE}@m?hedEoHRojVL&W1L^MtC5syGQTs*eH0rT)NRG-DE}HX#@=?KC2}aTZbhr_ zGhFMB20iYELE!@xvIeo__`CDthQe{E@FuH&$IzD==W0rhv|EvmIv>hz4gfs73aH)v z=2!q@gaGM6V@3^yTAN`pPEvHTlarGQVYJIPSZj=~@xIt2#k9CZiEa&~W7XQ`O=A~1 zN}NfQvTAC=Ha!7g_yLh)G0-IlWimE~B{M!Do)wR$kGun?iRPSqcbs0 zW695--$$F<%*9MbSIcu37z&)$n;i1ZYn_ivYZ?#4l5iF>Rqp=NJjj)^&-I^ z5JEvUU5@j=?@=Glu8-g|L~ISQ8nG}ia(p`x|A+R@4XVZD^i)hY(kg_y1-+yD%CJBB z7K^od`@Vm$?U7DIl$lc7ZM2~0FQaW_VU+N0;Qy*WB4<=&UzNql_-2$ahj^h4u#_Y{X9bD zeo*hYsip?xcQ?vyNwg?D6k)Z)fODxp)Rsz_jaGohtlm5qTT2W=|DV$2g@E(T+qWDN z68dqhmsurv5)CbHfBCc+@V73Xikc28p+1KuUc&uGI0e)!HRJ?lh6}2N<;r%csoh-+ z)qrA(kOpc0Hcz9XSJhPA26q@r?`h0oz#w++xrJRXbLo<|@PzO4qmu3=*a&Yh=m9H> zwUqTOuzxhe;l#^iyo0D)QTm=|Q9t{ZhbnKVX&j)8T41|n{p-b3ji>Wt8v4)%y{`+T z4K0`Q(c4BRO~7rCH95{nGorr!OzKPm7LRlORVnA?fuc-Nxlxbwv@`CF^q;HD zdwr-npDSUCAJ=vNE$~`zG5~=dScur0n(W?A9m<4;SAIKxqh**mMOM_o2R3Gm+-^Z)iOs zPbR+)jV;GnKkUq);NU{zkjAUA*y8Ys;a%N+?@M}FMg}PF6>ICaz*^5N{OE%^rLc2XZeh&BUp$nfbc3W6U$EZma`MgMA`1PVz;eI&i}Bh!4Zfy zF^HGy0KqfgYz`x99Ddj}^$H~_skIT$8wcgfva;B`ygW|v(J&)AgU1WvX6O(=KFdOU z(d(EODt+Z13C?aN7)_^Zj`Kr*sesY-D*4Q|lt)E-IYhbZm>yW1{(M}(aDCTrmvROL z_P>GE&94T+O0pX|Xhz(o=8p&YG@I1UF5^uiC+*1b`qGhG&B~!EHn%6(Ldo-NJcBQ%ju+;@4=K;Tqm*yj_~zq1i+@oOzI!>t(P9n z1BPTg-VkQtAXUZqk4XAkg`@~2rO;&entRnFvRv1PBlQO%<0cyNM2 zEV;bE!EShSNw`9fA1x)Pm>4sMsKh01|AvFox+HlypLJ#i8Ip9$ZFqx{zoaU$@@CVG z?8Gxu#lA-~ghgF33<0)|{WYyib5(B(f% zZnmm=S~g<;MLNzHA{a9cirUj=U)ZdDqFdf^H|#neg~QdzhWW*AWlXg+I%8T&j*arM z$#)h>PC9+2HZEDAWXyM8b%2o#bOK7ES;~l{w;k)`-eIC35E$U^-&UP(^-m`0QxaPX z6631%U-DRgkdSq(yC+OO`KAHQ;8n=$(X#dk``2zSqhRA;8s|Le(2I46;qua*qy!2s z(?m~BB66drkQ|W-rM{AZIR(;n3c$s<5}ar_^8=GSH;=z$DETo&@NM7otO)>ykgH&b zSoie8`1GgspsFktHPx=TFXBnz!1W27J?s>362{t=qq}P9lKte}PBg6bc6u;mZ9Dp2 zmYJ3|#rgh;AW5eiXW(Ix3r;Qk+Y4y+yOr>CKD4GL`S$NgxlW;QFl^;Te|6|K?|Oo* z{b1$yyb@Xx2!tv=-r`H}&dIAk>-*ssR-nD=b?vV|2SWnemJZCz#Wot{!q5?(p03b$ zfg+U_Llh>))QXO};F@U22#8Z2ZW4p$vTvYP`>#xVbCN4Z!Xy#Yg1(m^8m2_2_O;QD zky0!BblSi$hvK7M)pxiQ$8Q9JKb$-L{%KR(#%jV3M%OXAR8lyNqf0bF5fdX0nuK5X zz9I>bP&eZzx=YNuxo>`{=aZ+P04eDEK3Nj6$i%!2sS)?XKto9_l|=>f;d?Lz{1_X9 z4fEyL%~FTmKtP%8>xc{&v&MiHHn}MXE&mLIX1IFdcxTZ~z}~fwqz77%uYytXBhnHy z|FrLLndveAd}NXnV**uYrmmE|y?|<}A_o9HTG>i|ksE23B=~DSnV*gURK|&ELsjwI zZjSHl#dn)baPkwfpoA9AtO#ZO_7?$YdjAa7AYta;{;AkL!T;v%2c3UO$AT3qNvkdoxK9RXh4@kq^eBi(V?Z)eDO!aLsn^RJ|s|S_t-8%=+kRa?`D?%TW0oXzB zg%dkYY(m)(CncCnOxbNIvS>}4M)Vn)UOl}>k|(^l4JXjEXY|`3E6@r)PM>kEfa9KI zTJMuOvkSvqn~;BQ4+yo6zwf!6*l+c{#G4Sv!m!ObaXRLj_LDLZ;|i`Lg^cV@GC;0y z9ueko4*5uBYWD`Cr$#WHEnT;4J}sm-Sfi7go=(hC_M;8C=Ixv=(~*LCi@UV5ha>oi z^{8|G8vf9-TAL>8E0mx)0bz8?>4P!^!8-^+DJp`%-M_cc)5eyZ{^=`yic%We2H*JQ zt5;~^q%Rq6-!*Fpeja;M`((<=nbd>7R}`*YyY=;@+|$Ts5rr2rq>}kac~Kj-0sP49 z%?S$$2{GZ#P(I3YRA5R29U_c@Mj(gwU9pXS=dL;~L*%@ib4nY}XK+&E-+FNou{s1@ zVo{i9H0I#$$*NfXM2?nI1x&4pNf+^(OH0mJ1QH`3q<|9#dJyU#p|Fgmzx<0}p( z)EU-21;YJQFW9J65M>B54{CV!1h`xa99|PbuLK*uL0_0ErdPm>~ zfXi<;_XvUM!WWhe5%a-+n1ej@BBQfs5W}O7x01cKHi-j<{-in(6arK=I#=B(-vfd= z2woaAlOOoZlY>5)6>87jtK_*^v=63EocP<*GShDXWg~Py#4BaUq4~Y=xBxl=CIq3N z*|%!$N%zYQJ?p>&0$Hof={PVfT^FVLfGXf|#OOvwM$Y}c>*wjmPOR4h$`R>&oaaOx z<`H-(I3lSpJ;qE2$Q6e&u=UU9#%^pISZggOTn*@N5nMiglTL-f>GAHaUh230pb`XO zjKDtcPORL2zo6sH={>gyjI%Raf6&5IH;sya2wgs^%Td`dD2MV~KOQkwmt#EYR}u#= z>KzGJe?W_GQxwmzheGVK+VjbltbsEl{VEt&^rASzzh3{kZDpc*^G)+M)BNr;cLL># zUDH;2bu9QBM$c<2$}=_5e{`+xDYJ!sLCMOo^q@yJNE?_x_o%6L=h*Muh9GuCUnzmi zfhVtx^SZ^1+oA02l&<4cjg(l~Ky36jmNVea<-;5#g7mXnCMFS)kq>K!MbpS!p8wS7 z{hoK59I$7+M`!mopdiY6dWul)g0eV!?0rWW`P|5LI=?rnsYH8Owtwo+zY1WcEo=R& zc=>pWZ?ZOd6N}FZP|*L&OTk8{FyrX=ci+(;(lv1#kyym;0tC%RZNy>Le6KQeA}b?f zv@_0T=TLQ$JA|&ce|5Y8*z1HgKv|k37dlHJp=TI15yvUx^1EmI#iWu3rcu;MGBVHk zc9(J6i?#}l4Gjn)c$1yo$oh!CZw9cc2oi<^L3p4q`t#?HV&TJGk^%BpuYRxcI1dHM zu++np^b>J{BCw5%Zmx_%jic~d^=Sd60GlkSOe!IS29Ot-t-0q?RK2yxU<24DlonC5 zs9JBf#LDz^FjxpG#tYq}@jxKsCBacN^XQkx15g7p4NHlxiFYi#^kIweq=81au&@LI zb_{9*NV|-L)Bzs?|V{39Hl=cLZB z-R9Awz>tE4gYkB3%whHAe_xSCc_*Rb1q}&Mowx4|#zc4*YN59y%HX)1AbW}O&#Gh( z>>QckNRlxcasQ+5ckD*Gvgyz}Zyw#Er?EW;w|#B@3J%OjaY(v!V@yucpKipa zZem$QOG^$!HQFK9%7I7Pb-bkEXvWjh0^ng3_!rRDlQWKY3G^1_k`PmfE6O#J{ABo3 z&y%WlJYrUpJYrlnRm@W;(*Lxnu&7AxEU7AB}rA`P9w*6wbw(l5Q+= zYb3gFqY4fQF_jvSg*lKHhL>=#gJuL^lVj6=4z)nCy3P}6#dH8Q&?_W!zJF1XSi67j z^ikK=`hX(5M?9s1vn({UYhXMHvu#ka*^>tHwte&sdDm)c4qN1m9i0T7e&^^_yOJEZ zf@4EoFo>s+;GBTS-LfkSLN5WszFo{q4bNi9gUJH_qrCU2+NC!sYyb2=Wbwt1>dSuW zSr~d?KKtEWE<4{u!6F*{R?~aiu=UYfW8MB*@guGsz;k_LO5<=Ec1F$UEiN zRGVW>QTaf%`AS!4_E0kKyY!ffng%du{)nW<1^@G;q@;xAaU{YBUhr*p=i+so>%XC4 z@@Mt@fZvEx!Cj^`E9rf(prxL?(@Gd7@Bo|{Cr=Wx6+eIgGIY|H#)@BCLQ$Aj6UJn3 z1xXQB2Z1o|dT+G~||$*Zunt0XVGYVt&#rj9?=ozX?-g>${ZbMCx}cUBz& z!X8o|EwJoNRW_`k@SsWNnu!9sbN1{3NNHv+gk~7yBR!QR8*dGD?Is#DJ9gaz9=R9;V+91pCkohVmX6fP0l@jY#_X~bhqcsXpEE$nkuY- zA3w&;e9TVAlq}mWKaPxT=(Vj@fV&j-8Oar$5F3h&Z&x8a!D$owtD(e1Zkf$*g-S-# z@V`P0WfLKhz56$l^De3S4ddM+o-+>PExY|kMZDMNWYf%L&fK8KM%-c{Y2fs-wr;nU zkJ@x;(f4ed5HrJx2e&iZd9L!0O8`=`O4iAQt-im569GyHiq#E`{q}XpS<&{-eYy5X z(w&KIJp`mUlzqvA4v^DGXrSsI3xCh&j_a#D3 z%#QnXoF3a-`pZH436e9@TC3+%iw`bXs1F!E>I#Joj>=zWy!Y+efl6-uC7`yO>Fm)- z7I|rB!joFHv|o|k+EKPQoZbQQZ@Bp zu@eb&7jQyil#YvQzXgz8$L*Ul2J?9sO>$ijrs&ul-4mQnu1mgaM@hd8*ijW957LMk zseuif%Qt{v!0gzaoqX8p@7f0Rv52(6S3SnhAAT~sB*<5sv_an6z)?-2*mtE*FQkk8 zdUk3-N69O-y5-J0S%GWt%Bs-$MSP{HRiPT>N{mYMih+&$Z!M(+Cau9AF+qmy4IK<4 z+I3r~nkb|)DoZ7#X)nm1Jt?3(Ue_N`bv@whZi<(Z2dL@$qwA_L0Wk3Ce5fO(jk){v znsrich-cu&hmRi(;i7^B+K_DVN_BJGAzjMKXTM)3SRTfC3}{*rGTI`s$j7Qm;?DwU zIsd}#lV{R=Pyt~yg2?RYHvP^pQp|Dgwzcpf2)Li4e-Cv$!npJ(ve6JoqD|fCq8a@s zD`C`fNel0w=r+Qq0pqkogSjaUExoarj`0GuEDeebeDkOc-$vr38h+Z$u>EESFXaFE z^EC{QF{fOT?TZ_xi~BDD5wxwC+d~k$iPFy>v>X5GryS{q0mSaB9M|KxsHUK2O>sY> zoDQRzd<ujG7LF3HhhEb^ZVZ%fAd-FmHohQB$JQ>os|E++aDu1 zP%6_t8c>m*G7ZD}`d;RI5{%Ea^Y;!a`nQ+d9Q~ORW`ax)!Z?rUmr(@gM>)&teGjrZ z6~=~?0cdmEAaU=^eA{!MMXn2sXdH%1qLc#^fS}n)Iau_dF3piQfb&Fi`O^!Ob=KN9)^zDlExSa6nZ2&9{i#G?RNJF%F>tC@ z%QRjZ?w3K&HC}Xs7~|hcyf_*#dRhN|vxzZK^AIKhpI1#$*VS}y0~FcqlsS%slkhGn zmll`gl$5jcp9NKXred8hhe)e_i^i7G$}!lER&_ARF-y2fTi&X>%rCx=8Io!AsfG~s z9nP!Jewk*TrcV1>$#$Q4JBJX}cZmy2O#2RXmR60^Dwb3&2SZIYvnu0iLAyiq}*zEx|(=PRl@_gY?U=EnoT;EeiuCGEz2u1*O05EeGnY~#{9gzihfQX8+=EX~wwsR%A9(g@P z7aeQhyv_K2)!^&|lKN{9BQw=pOikVS?}H%96|OgWhZwz*;fIF^$8Y(a+1CXL>^CbT zl9LB7ucju2xJk7P)jWt1yNh(PyO}zb?@QbyWcD4d`KF<#fG#k}W9b0YLfkdo?K{fU zF4pCYEuo_&W5HCuUw3J+t=<$Mz~VT2{WS zy>UbR4>$r0a5)+Nva+jpqQBKTDl zEBP#@1kk&JCeN6ULFx|*4o-yc7`MJTTW3FyN3;xml&+kdJt@S#$FZY(LhijkIAg}T z^CEnpv|NhB%{>$P?k!Nbe{}l&MvfvV)4E1)-hPx2;qYkr)av&JSDii)^j~BzzS98- z8!=fWb2rVb*4fd@_(hAo@C^eD-oGyZ4!DBf39F9xEezXpEL?yQH;w<>P=F!m$B7WAn? z?5`eVkyd(@LY3Akz7_(_$9SSZ)c2p7#!DOAye9!~OU7|^y}Vgdnj&r~*Mzc)As47C z5mO;#sc|U(jC_e;{N5RlM}+MIUjeSQAkHjgJ)No<)CI$Y{`)r43o^yuSw{FiTXig*-J zEExX&z2rkm))p8>3R@Vc?{&mpEbvWJ2Go$Lnd<}5)t~qI{8Wd#|Js>cVxuyECuSQQ zqt`44PFyO!>`1TeV29!iWCZOjK;!G!u6LzN1#ae}ZG4j&{|U{s~jGnOb>2 zE=ro@kO^h3f0O#T;g-eCjthE}Nb`Y}Gy+EF2U&r=k1YY9xYmI4BhV^hWXm@V7q}T* z*HA|&nZahRzzK*W{($BtMlzq1o5~FL^e!$o`=6_d0xg`4ww9azquO(r+>^|Ea z`lRw&^mEc2xnd^;S@m1MUGde378J#hu)4a$^+&(e`gHQsoAj(?gaqwlI<;+|Lf=k% zYq06b+{8O}{&jSnPmoH2S~VtMvua!ykp z1Gml}@dTYOGU)yUIM-`Mb2kUp3*dRt5ZV8mOclv}{n9PjQRRVD&*;bq=(F1}&8B%T z^;^b$YZ!~t+5QfK7w^`IsYiAPlbiwIqn9#nisYrEqyI2?kr5J8a;;)dFdPK3{`R9h`P$6S8w{eWXZsbo^U#p z_w(pgL<7k|j<(OvgDuEjcm|Oxgk5r1%sf|Lc4oMuV>H%E1d zw&{54XQG`~lGwO0m8trGnlAa-x7a306*_A_rnw3(r9{G|ukST4#CK=Z&O&aY?Qi>I z->2~v4T*Drk|Ls`zrRpCYnThAamNskB?wqTI086eF5G|9Tb}Zk zmL5>26SFJcI>dr^F3uZXIR~Fz)vgn4&<{?&3TNJuD*`z&Nbc( z?|}K~y?#`~ojgWP8?=%+weR0Yqm&298GegZb1-aEe7%@@l$5mUe$ulH_2=9{!T~97 zgW8zif1=*38W}O#gx{V(hCi#C9LO&Qg!Tf`;|^q$dIUs#Vb{B7^aEy(BhVPH&rWR- zzdI<|?%Qn*2sBpK=UWL{i&YrGF*u;f`U9nHA!>+k2-zF#EQVeG2s#-fI`^?3?|Tov{#JXeT{ z{jM+J7=5C64o(~qyBWXgi7dCxa9hunhY96(u0tF(&>~iqu*`c%*!JD%g^;KYvh6r% z?|;p^j?vRg!`DDA+%d5NRT?ss5Eh574%W28_aZHFq;fI55%%ut&Bg5h;`RL) z^@b3kFaizeaMIQ~7xAqoO_Kl>@lAX*O){8|Y|x~y&m;@#V0O1#tSYp6B&_UH4sA3Fzq6>mun{`eQnbuQDMk0 zapVdbH|#?^xB~3f(L$CCMCM48-o4{Qbj89ic^!xP`aT4!+?u$pdQ+o!#*x(qHTxEX zhDdEAsQFkgP13MQTYk*<&};k;9X#vU8twM($=Vrz7z%c*)(;LS8!mLE6$gbH^{G-P z6pr-Zz=u==C!&pBmVjG%07>}JlEgp@Y;9U4cI;Q})P>m7rZ254BK!i@K+BKE(b_GU zAZ!U5;yB^Z>Wyhz_r-4-eJ;J$zJC65Ur+K2*nHJgOmw8lu9_n&J@0s)PQptRwT%`S zJKzaOwLZXH|MA0zFDG75RV@w8uWDAgpB?mAJ}ej(Q-d2VLbWKEFnVKnr|_4ugi=FT z+HWe5#PWIo5g1Wa)EWJ@F?spLzX!D2I1pPrzxv_)74|(PD?aj2%^7d5uYw{?sclt( zE=M>{!O0DK{UMQ@jB~`YK(I2YWIu$siRf0Bl0q8b~7Sqj<~WQ#{Rv4*h=_b zZk`iQJ#WE2dOi?o5Hsuj>#O{C9sw^PZpP@!PU;MP%SdZX!;rA)g%66sn!u#cJa-G4 z(hhPB*mds2Wi+bl>M~flK-y#3zED)>%$1#wg@;Dzn4vV8{B)PT*BGeHWC*?XJ>e>J zNh&`{I(36oTpwb>@bJc4ryoZ}nU;`GH`?Sojyj7(V4s6;JF|RQmb&X|&e*M7&DeFl zYc*$8Nho#!_W?*xe3w7i76|#t{sXnRAhMVAyhfd~O2!?;w|+TVOx=Eb9~!N7bZq+$pMI((s5Gt2 zm5>Mw9$XqH;KRx}N2N=bcK}aFhr1N9J*87w<$%(@tpBXs%^}(<1)(^Q3SddbkreiQ z0*z3peI$ZYz>fu27k5%g_V#VP9_s5Jc{S11?2Rr4rxSOOB*0A!T0e-3F~Y_FaT6gk z)qESz5fXeuBwsp%%cQujHBkT?!Fsy$<20UCGPS)KU>|rJ1Vgi+dQn_ zkO+_XK}00NP@wG}7(JQJ(P0o?MrFm$r|+>y-`(AfVcV+*i3IRmBa&cAr?9jdIZsSS#At5Z7;<}N(zNizkG(Mc zq(IRG2_%8Eryc59$f{x?Y5N|&Kf+YC*jmShkoqN99f-M=< zbE-7-zpXxWJ95uE?>`qigx1uC)V!O*Jr6!wy|*cbCKxAIPbJyzk$(&79uRTCRf%@` zKed8t`7*X^kF8!nQTrqjz@l?+@>K;=7G?cVrcoD;4*Nm>% zY9DR9@Er;wRJdZkWfU$_L(~gG5(+!A12SJ6*XJ4${`yvE+3zAA+S?;5K2LHBd}$U+ z14)9xq5t`&p)YXCn2qbOSDt{IKP1jXsfSDlA)8Vb0?xvlL%)rZwfK3iZUifm*mGw# zDIe8yA329Gu;WswT=}$4D43!grk??iWnG)fMRoDjAG9vB z1O2yNrmR%reyZkEDn8Uq*qD$z6M-LCmxa$PDMYl@cLp|ePTwpYTZ+5;gEjmSQg{0A z3^q$_&QTH($C#QGAq9ah5;>6;5@(zwG=PT8m|PQa<{)OeJQR6UahUCS zlLlvPzm{h1^7xFPGq5%5tMgb=j^&*<#h#M%XD?8_LT<@kmZ~JQ+>YPWH0C}Fw%Tp3 zPFT(hMn90Ul=fq6HdeL!{g8sgU@I>nmLjh;AH(Sf7@Wv3Sr!*fT28rzCZx7!jA?Sb?Fzn_%>L zfSrymQ~eMcmwZ9(Juo`QH9v%`8bmjqc=)z;oD-wods&8vYcC4B^o)@!3)uv*6Ib6$ zJCy3UBTiauu8tOMhoE<9@v|9$7KC1-mMm(OQ;bIXvIXRrq`dD@R z&eCz$*l|`5W(#!_S;7!VT{+(Y85+dQp#7)+g}$dhL4Km+XSTc!QYYr9AL@p#yxrxa zas~ovkF|qbO$W~8Y_!J+`{Rl=6LTk#XHikCPCU6RbLXjfX*qt*CtyaoGjNv+IT-K( zhQqf$-|Dsb1YYN8A~FiVH{mOB?9#n6*Ll-+u1%J84i#n|0bVM|M;BBQuSL|kkyyW> zH{A#WvV`3Kw5<`*LWI;-$G)B(m>{c@xQNr}oZoF`GT%be(=min8WrPZNlEnIpe6oS z?KB*(IAG(q^vPs2N?}{R?8|X{MlDUxSJ#`0-#+QtP{C^?d3ErAjIONZzVu?>E0Pq; zjW-WV#Q{l8B)aht=qp+`ScL4>tcxA%Z)?~s#h40OeK-Y$;|d@~*FQCTOP2@Sp!JjG z=HdCle`nKgzU3@y{&ApZ$kli#Egih!+T`fAp;ZtihA zlKr8}GORWXWOW{tKgXM>yg+a?A!qL@8cs4Y4SoClcQ)s?2=Z_aS(Sh4xwb~IbD?4o}7WcrXg68BxBbYkHR9a*- zNPJh-0h<7~PXqXvuSVDGWT_=_jzTs|z_Uoj>U?`MW6_s&pG|liWbjZq}((TmVy>~XJ4McFk*VbQ0L zBr{VAGM~zBuAVC1oK#0`E5Qvn(YSC)F*RTA)pmlNA@0s15O3^2h4tHepPbTkcPUSR z)rN|NMbYz;=atwPxZ0qU$3S0#aDkXJ=GU+2p4?$PW~=zUe%XqzEhI_1x*q}FF6D4N z!rp6IZM=XOs%G7!&AYxwcKhVNAca#2>2P8g_HYd`bKY4d-})1Mip~9752OqB_*s6K zS|qeK$oIOY>v4F{eM=$R;gB;-@DG6ECf=Ko6JKfFOI$F573g!wro=lsnrXczTF-|* zAD%)yT*4&xzl;Wwz^41p14!hh+!P|F?tR0Pxvat%T-XFAIQ;oohs zmr?;7(NIiE4Op}f(#};&l#C}Na}zTb^f7qt@(<+sUUV?v^RrvvRkF5jkEQGm}(Wz zj?v+E^T!EKtVNTJksnF}BLr}bD|$mRb-{JfH`K;H91Xt(vEzE)0^?s7mh}(^|8xG8 zRBJmuiCMei-@goEmO*D41)-VHWPtL61a3@eCX-)ZS@o4Xh7s}ftq)Yta0Vg};A@AN zCUQ*Tdrk6%Hd}24^PTC`)IPQjqMy4B%A==rp=RlYWI*OhZ#)wV$-Oq3t+)p%6uf2h zO1^){E`4FO6dMTeOxo<;>(o5ca&ha(LGUd$#fPF!o}t}>lGG@FQ@G2?lx?Q)xTx#p zKFlnQ7-6qM?k;@c&CA=8sVx76mHqwf*a{?3@khONi$i^4UG>-l$(YDhT8zBse^kyU;tC4W=e z!E)JCjZy3QF0LzNySRF~Zq^-{4F48&yYDrl?VQ&1u_;Y2rCm56u{x*yXvpYxr(33% zTRGnz%}+oKG5#XqzmTSV%$<_I=UiQv{7kv~G(He^Kjd>2d?3Npg!uoaDEq6V{3IjVeKyOUDGTR(dPh0oFNHz{MJrp&<3&M0{bEL$ zXuI;t^ZGgAxcy#sMr%MIQOFRhL+~cZdWDEu=%j)duZ-^syyg|rb-RRKP;Aktr?{Gv z7&5e~?|+zZm`7?4B?r5>H$o9%8@K4|Hw^K~kagz=GKcX6NjZe-n8lX6_AkW+iY)bI zBM6Y-Um#(1U)j#6W4C=G-Z4yF0H-D(Rxv=T@whgk&wakxs<$X~DyuY1)imKMMnrT? z3gb*RGqT+(m$f8!!Onp56P4RAmnGgH@>x`_=jc7)10>|+?L|}dmy~3yqC{m@Iz(&- zKI29J0_(^of6{)_vtdj6fQ6vrF`&M4$VvT!;QhZSNN_}asJJ^{f`Op)S9(Ut)1IRau6 z71_hmcsa`@?diHzt zRh0e_Am~JaM_1`yW6lMy2~tRm!1}}sPn?P5)BcoK-*k7SN*0%fSz^W|=+}h>r)y=3 z$;vPGq&CxasUmtDPYU@*2Kg*~yJi4 z9cTLc_pj@0<#Nf!QZI2gA5r-U8xApZDqUEl#yb5<2es>Bw8t`|7 zOBdn!FZ@{uXKwY@B1=OEi@f&LgV6sj6gZ)zT!Cx{K*)g$6&@Je80pE5Q42@PYi1x5`Eb`Ca`?yrHPwZ zTUtyY^ZYSBo(EM|XO?agcydB5Q-UWYipCQal7@I#&z?O)%-U1T=|KRj0$;v77ItAt zbKu?-FMi4@B;7<3H%!ZvH;ZjMF)TpO{ zgMk@pf|N-S+E?iFfk!|@DJ4FVQMzXJpH0TXox=OeMx@EL^N}?V_T)pXM;KoNvjKBy z^E6CR|MctPe&1m1dn))e79tU%<25!uHghNBhse{5wZm?AET$}0YsVOKjmF3TXA*(% z*uU^p!P)f5|@oRXr@_Z2s z1yD!M#YOmkij3*q1S8C#uB)qX`}Qk!8T4{+>=N>J@Sdk{f1*QakpgQmKha9$;*Jut zX4TqEdsa0X10XC|B2dtQLne#ycoc_Ly3 z9S0G*3%%WnI@^6DI+R^p0y)d5RuG2yw2{Rv#5Bn> zOrF1@pgzcv?Z@vA!?`tLu5mt5AFkfoblY4=l_2=Ld02SOCq#DZ z%1F}fxK#Zrn&0>NSk_OOvcUP9KK7&ILuXzaZPg4gdY5qF0%|ieHZWxqNuG(8*=2mU zCT`|??l(-(&j$LG3D%&Fq&oN%+qdKQ8gKxAmpZOnSnBQU*LcW^t-> zzUAhu!za>I=8oBA<*^*b5n!>-)yX9yCBnzYhsZRS;*W!8*+_Ct{lE1ov zK1#>@^ME0E;?mKq-qpKvt$o-n>oa$%+ucj{{*9ns*57hFwaKsN-to*hief;T?_mCO!@3z zq#h^#)IQ#)vqR5c(M|#g)@A)jmO=b*P>y{3O-ZRPkgJZ5LY+`9iB&K%S>p8uhZ2 z?{~iwVZ@V;cK-CH@9tUxj{d)x>{ZO=it*lDgH!0JjsDf%jS_bOW|g&@(_{3nbQw z_kJDM^V)E>jyuRqe~^~87UBxzx!>@$Q=FC}1?=}6)Fa4Km@Nxm=U#!DR^}Scbm+4D zFik{zTG4uoGWi;iQq!p`a#PdaBpLMP+z>#bWn}K>@h`#3@)OoJH*Jr8KG0C8q1#x` zsQZ~%^SG}EW(!Z+s9-83dx>igcT*CdVWw<~&vSK*ak|)ytVkIx6)qkkF4lsqZklPB zJ#+fWx{R5{lA)xWxd6^!_SvSRPrj{D zZjWUu@=HI&W^nB=qM9vl7ZzoUJn7?)vCOUtyO@)b|NOZ@HG{WYmpSisAeZpb0<_Kd z+_>j5)Az=Dd2ItL-VPR7WneI%u3v^G@7tv-1Ca~dW{NjI6ciuzTiJ$pO1R+>aSVnm zU)#^X7m?<5;A2-2Wk*OOWtCzM<~atuPSea*T-hcSsPd=hL6tf4)!6dHos}&+KepdI z6?5$xv&3UsCDF%__2=T0+R$s*Gzby8bW$^59%u=nn}93`4~!W%Wg<3leQUb^PCWA+ z4~fmLr_+l|OaBrSQ&o$P_2ya0JJjqsFZ^1>n9b$BJ~yf8N{xu`F)D3I0pCZvNTN-y zy%TO=vikkqV07U2GgaHvsg0uL{^QjWHWH)VZ3EMZ1?6`p+$31T?_TLi=uS94UA2@y zyGnQIK7MK3;JS%bPXQ^V_zD{W7WZ5#PAwt6Q9b-mLk=MHFk`srnkTdNH~ zU04h)-|qSRSFMYQJ9F%vP5V~DbnAz_khPg|N+~I+@1AomXGDZ8mlJqFAiQqi^p#}4 zQg)XiU4={7sP%SV%R}*Fq2WzM*DsyB$=2%P#*veB)63Izt(-fmcIMrn=WpA`%_egg zV%b>28P}^29bq^0ZaaR++omL*CgiISKA$6x2@ANN!6_2OuKhWMh4ic&KV=0@ow|>k zJNA71kufh1Pg2@y*8z<;0)5%+bal6bE+6?hJ1gtvb{5COFs7#Li%+@0EP-sibCz4FIj zA_Q26q}#LuGcJP*3+5{$!7xX(-iok!+HEp75^2SkO-;F2JQh?gr>I<9{%3NV%%QAj zqm|$OXv$II8{D}g0;{J(Df2NoFe+66`s*W%5JFKt&!~}P{P2(bqJ!sE`G?JSLe|N( zsCE(QWEU=6AYMwQez{(6F^y>0gRW6TO&(99{3TBpEc8yV>HF5sMtdQ1fu6T6I%|ww zN9f3g!P)Fgntg3r+*>m*M!_N$fWdVQzrM?&(ueJNMh1C*f4`{bx@e-;=G{6Y0g}}= zf96J9qHTzw+;!}kMu^gzO2!Y9KZ~zF)Zz1I)W5eqf`{M=%xr9sZ7O}{;D54auZ=FR zdR+EEq9$@#y?I&Yi$Bkydrjl*YV*ePTK(!OPh((DaeI8_*qA^a zAX|^=U~CMVp3pvDwr{DFdOsxI`9FM!AR>c8b(f2cR_abpfXi7L!&$rZf@7}j(a^ig z0g*Xzo!9zGqlC;cnl{OT($WKH`K5&8>Y-W>{rFL%JjH&ss{ioe!zBK-Jv0heH{YLf z3w_eALKVeM6Fh`#EQsaPBC+L8; zLW8wkWNnF|Bufw-jD-!r(VPH7?*}x7$(JJ03uYU7}^pJ=RROYqlF~9Wo zlAo1`Kd=oyK|M={bek*2n#WCJ1zA=g1dtFIA-1KGmhFrUz{JG-E_bvs$GDL~2Rv|3 z0Pd-C8HRKLucQIT+KZp(>R8V?k>JX|E+W4FC{3W*B}?JfO!gw%L2;s&k>aL1!Sw2w z9F0#6KC!8qb}C-^n2S{8?S1e2kkvl5FPs#iFl zXy%*j2Y1_f9sdG^RSl)*pPj^56VN!?V=Ncp3k-b-n0!5grOcV}z2DrpN-hyLN=4z{ z20rPOoB~JgaCduq`_O!)#CQLi>$NSc@;`U_Zb;-ybXz0XuELNn)FMwivt*`6gq>Px z=+NNG9xzY)Rp{W*Avl)WNhiq`emNm=aSCy-w*;f{9k)<^ojgNOhu0JpEkdcnM!)p; zhek#+V4EtD+ZA4&+NxAnriwDOZPhy?Bs7fqbZ^vbmgB-t6|s$lcBC*7P%qnrESvqR zco{GxDb6P~fJ~5%{(O9@QLObS(>^1JjfO-ikgnRJA;Kr|Z0P%UrlQ1Z`W^ZSc2?#V z4{^wXSusDF@%*I9PYLEA>))QE!iPrZtl~oLtBuz3vp@d}yc^=x5;Zq*wmqrIRjgOD z@`hJMguZtj7H8|kN!N9Y;kzuh72}~R?EhZZpS6<5U>!JahP{8p+PMxD??yiz%|YXkR;+2BJvaez-T(QFsJu~ zpy*_wuTRM?xyUbW>5O>e$SB;_I)CLD4Y9%nL`6vwC+v}+!ceh2H8ph(4@ydfPRFTD z8cD?33Zik%MrLLtT#E7Bq7VI6{`@(G1J*mZNcYAclefq8buR$AHp-3eWIS^xGDC|0 zsjFDnD-_dtKAg!OChMOZHy9@U9ZeZ_$@&#s3Y54||AIP*RHh*+#rU z#L6yCby;SVpfus5r>%bVV(X?*L}WjEG>qN3#deA+yoQJfdwtGy()nW;wUIW`MnMT*)DZ9_RmoaoNP ziMBSC1oAKPhj-hPe!N8kf8g5(IR5diNAM4aL>1!#L;dbUmV&wG<}n&l{9Fsi>mOE! z>s~06K+?ab(H=rOu)^A2qc=|Y0i7`q#Pe4{k?v@{Qc)ajV`$tsgK3d=$lo`?#@v8_F<8#_dhj&PMJ ziLV|DW4Vy-VTYz1zu%`--xA-bx^r#sHYA4c@UQj8mk0?DH#RWXhU#2Z7Q=G>B^AC< z?&W>mR=C+kV~SVc!iD{32PMAS6iarVePQn(jfq4FKHZ)^wq_A z-V;35OQSXKb1U5 z<;J_?S0%0k77fjuIr3OhL`qz4IP z^5Sog7?$Z+XBQO}eW6WW;{mv+UaFcMg+Kq);Ly-qx!0=9@a>rd`yTcjMK3S8og7kt z47+v)6x&#$5&0YR4ilA>Of`5koM%LVAI|YwT3GHqUhOwj?ZjTa-nJ<}8F+F03M0+f zNAg-OUKQ{9QL-4@M*bDeXqP8vm6UuICDa%wIi&35PnP88??UBiCVjGu%kJjTwhJ$B z6_ZBiSBh+)laP(tv0`R<(!L&#d zvzWc-GK2k0Pv6+m(s0<&#-!w@rG$~u(QW%{C2Y&K@^$(;Rj(&~aoJB;4(BlMj9~;b z^5%e8ucIfV^Q_xQ&^g|eZ0)oOVOjG+UHBuIXFb>4>=xKJ$P*;3G6t?ce(CRB=DS!T z32>fWSQS|#(m*n@S}ptR6R{h-bS&ZfR$yPAhQN?@0%J-StyDb!Ng^m!817PPMj! zj_$gH!|sQt$#H7{+kD(F5OGdElGpmZXK{I=5DFOwG-j*Lv@n|E(WQuJzh%_8Mp3T-@P4sW(zvGqP%JRdaJ&d_w%3Q}QxXDq>yO z=5pBbpO~89A3tunuU<)RDw!_@M7@utZSp?@Gc9ud>&C{4mW?1U_*Yi8=*Sla2~W?` zWtway-(o7Z*Ay>DzkK)1%#8eo_ZR33_fGTN|E2kP(7wmCbO<{KS{p-HbH}SQmHl}m z<#Qd47Z@nBwJ_xA!0|mXzJtB3) zUe)(3uv+xLade;ZZT(FLQnMojk|h&7^fS!w8~s3(2b~+@!e76f^xwJnClMAvsU+>dmCh z+8DVdGkuqpDFIo(Da*Z7_IrnyhL@g~r|#=qWj3WWAYk@>|%b{sDR-L4I0_ZJr>>&5E}4&I69Dtsie;k zJfotb2A_rw)X!cH=C7i^QrCf zza^}!y7GyI4NoVT_4(fB^3v>=iA$e?ORK(FFMl!gV9+bEx<6p$KQbG@ANcm01D=km zmG2ZluJc6P4Li6_M&U$mLIu{`{Ur}FFZb`42;&)nmc}u%wCws6mGi$#m%dOOcYm|o zt$E-#IVzx^KIV&NlaNajPv$&VKV=?nBH^M{XlSJ)%qAq)OiepxnOojlCZNj)PJoM= zyds<;%Rg?`LEn_8q<%^5^vrQ5N>a(Pv-Rb_LWM@kXiWyN@*oGL)v!)(b6#$oz^pm0^_t5q^j?96pY0F*`qyZ%JV);t zZ0k9buso8yzT0s1Q%vXJM;fx5wzrxqMmB7YNnEw%pV!CjUo%XP4Di^oqOU@|_8b8K zkS#4LUmZ?ZZ|wBAWh`3a|BTjnamh|980f9oGV^#RqwXjE2Oal#Rbrn!IfL|9*mI8d zlj~IW@<4~@R*dzYb)T2Zw`r5UU3BM5hCpuJHrsy;vMa}rn+)|@2MJAo5;_jd3cDq< z_02u?ljyJkN7xt5uENNuipr4%3y+hlGY)PH5%m zJY>uAy(Ws71Ei$q@r;$3b$-D7dG2U*;oiNrm(seBTYvepFb3xchoYzC$;Ac3Bon`g zfsz%m{f5)_e@mx?`4Bx$KktlNQMGUmxhE*Z)X*BMa%{AYRtOzdd>1u64`1hQnwQZ? zenFHJB7XIm)q+Jg#&`SA2y^2=tT^sa9wM1esWgNk{#D(#QCF1k6{V$ z;}3jrnupjCXU}ef1?u7x85p0Rs=X*;RbpMSq|3UKc>X28FV@hq^NDb}EX|l%@VHdB z%T)NqG`w)rO1H~b=EdD#cHIJcBxZi#(Ko@Fcr=@HjIWDdGxy1 z_#ecah#5j!n2$7i+#rZKGoM`k$YXEJt_K^wE3DamtYJGB=iSwHX2xDNEzLcEXZbpG zY9VStfAm$X)ft2xF9tB8TkqLW4$&@5!oRHCJxxDbg*oyCPaf}cF%G@PGtC-0UgTQxSyJ3qLiY*2NqNp=gPWGt z_2>t~rJ|w0S}4cDuBjQ(V#*NI_~zT8$x=Y~5BWk?LB)rtr_R1_cM=UF=Pgzs9>Qhn z%iVI?UaoqceG#cKZRW(+M&ePN**oU#C`{QgKWLmAB;jlHojwUKU}wPSf@?@cgqg3m zbDVg>dl1_|9#vIURE7yG0-@vKZRVmfG8k{|19G9;r4mRP5g_hD>eHPS{ol7G;V1$T zm+AjfUO#!Lrx+K(3v;BWKY#Uvo9!iNp}HWyI%7Iv$J z0Ov{Z^9M`U--GuWeUlj1)*W7}1it-qTH!+8t#LktU9`lKZ@)web+^>vG!^W(*kiXk z*(sNs!jFg&o0#Z3G~?eqzD4TIHwW&di^zv(MEg6`t@QY(l@z1Rtm~3rzCOJ>osPzs z9FK|_hn5j=!OQqCCiZ%nEz!P_&Zg#2OxP*+1jh%fL-PYn!w9wD0;}7&kE`@ab zK?-${*~AU5)~+#+myz-LL(_!S0%#UW&eOG3{b};Z>Ly*arb(ksq=(O+KUZgZc|FvB zvE;7xi+KLPJ+s>kZlzzPNxPVYfx3P}-z10CqIcnWLdWd}UdC{e?6S_bc7{`ei&|0P zcuAx0x(rgF@$qrH69#D0()9VQSi$dEu>$^MtL&GxwF90!+5e*JR(9$A>YzQebsFDj z?$+2R2#?QAiy}4RXY%f`@axk{n;H3H`=&?RAOzPjpjXP%OGTb~H)RM;0_5mv9%6J! zf0pF9jp^QJTzvAfSvk(1_YCqR2BsuR+Wt~B+LA&4^&BrbW??k>YfsJ<>sssd^n?K4 z5qS^-yRsY^vvl~tgV%F&xb*1^lWZ@$&vVfRY%FaLr%w|QuFw3+nXwPK+eukTJrjSRCEfZQHo1$<=5s@jqzEL~|4z-Va?}K30;n zUniAy&NW3+lVPV`zkQo2J3ITg3$3t&f$I;mn>H3rsE`JMLqqx)q#~K1Y-q@d2?=>N zGp^&GP2=#j;=%P3?FZr9_~^P%uq5|AT*PRF2KKZ0;7OqqGd^{b3r5P#G&q=l|NiBQ zX}z`nkVUn|SfWO(8B;1@;JDY8Aj$5;-THpaH70_pr>Dp7agqQ5R}lJzoo}V++{7pk zOhr9FaIQ%)Yy@Gj+<#WqAJhsux80gI&ucdJ5?<^t=4ll}k^u1l9YJumM^J8R&i~+H zDgfTTnSG?7D{`|9?yPQynJW6Vex>pU_U;H-I7aMI%&_Rqxn}8ZL5A6w`a3b67UT;T zD;=|b?8$_n+f9xpLsr3ZHJ&G3{_x^A^ycc(UuFmih%__bm=*gIZ?;gb}3W&sypU6SG zUQDC?m5@oLCjdF!&W-_LV@Rm%gY$7+fBpw5_gjUlIFPa$o12lstUqYzpWuGenWA?N9?X!^+Oy#YaZs&+>gk zY7`7M)7{$9R;4K3%+mh2c2Q!ZoBZ{qEE!Wn!-GkeW0I0Q5$C{RdDX`J zHp?o(k&5{k2S`MkD&C4ID_poZpC9H<2WH5`#Dt1v zDtPq9zYIf*1mU}M2?_U${T<6W)Ol2A?ykM}R9;mqY?gRpm~LHtRcXXb>*rn$j?+MV zz4O94zv-z8q|_Ory7Zl9Fq)0Gh^sfiui8x4x@l5Fa}QPnYlO@}!R_`VC9e&OYR!(< zBbcIAR9ehV&)v#IC3-?l`vwc8!W;0Y;0*6p$X>PB<=vzOyB6{i*z{xL<3ExrgC1v0 z&DDBF0|x$GT&$a#Yad(>6_jIY_++9`vz@ely=stTm+-nD+LgT-^Iz=7TnkIm zFn16;mFQuM_16n!(;r)Z!=Pb;xj#tblmUPE14-1{39@f=z7JSQqA2Bs_zx=11#Oy> zULIU&8i#>yQKd>PLnRugpl~6uK-YS?b!mk9GLxu;1eI>|rG%kpSA%|A?WHi()Px#? zn^T?N_o}pJ-lp+O+lWbr69^D!N#3=3JnCD}we6-_dL2W7HDy1A$;jaJhEe+Io#v|o z!3zoOJmPu#O^)P(?%czU{wo9qPtviM)AR>stm)ljoSX(HLtmUuNPCG*;m1VD=Z}4;gaLAMY2j zl&Eoal;SvZ#iT2dard3vpJ$*iX}vHHt95lvRH0_`dZNKjSCfY5uFg+MX4k*(#_gS7 ziywN&K6-S%O`pjmYWB^CQ&}V(fmo_nk;&grJwA`FDjfqy3=3U%)QyVZPq+KwdsM&m zIe8v8Jn=c@Bow10vwz#Roy=2XIkr&%(0m7V1(|`R@CWGOKiCygp_!Orxno|2{xTDk zCazX7riH(&nZtt;Q(P*$Q&UrENZo=DEEPsN;&=F>mEM<&$-6=YZU0(u9V{*?!mZEE zvD30XAzR{R=MRb~KN6s-%>ICyVY$f{Kd+UtWMmk-yK{g%{_yyaMJL-CS$CtGdke2I zGBunIySC%Si>+Q1xF7N8lnSwXuj!j)9fLdw^r=3Z8Nk&p%Z1+X_1_$fz}`PRo$?gz zN~e8%Pvu4?r#;s?>QHbS8$43$PPQUe)yu0!%Qjm%_PfuO&7NUXv9?Ei6K~OoBDC1D zmxqCxE2^bi#`hVq9}BrsnMFIFYf~ISwzW5}zMhCy z8X=G7RY?%`VK86R7UOoQmga=0;$8c6v4_N2*ONj|k{Iz(Y;j7y@~FI`BknZgzl9x0 zRiGS@R2utTbNLqCj9H{s+&k!%FHcOno{i?jE{trm@M*KCN17!mpTex88tLZ&oQ7l@ zW&jhV@kCB?Lh`$<$fQiSV+UZWkKR2YtG8Yc>^PuT2IvTGeKN_iF0=PV38Ib4&HxIu zXGW(dq7#MP!_yJ;H}gN7 z$J*-*pz9?Q+R9GqHW42OGzsfCU?u*D=w~TCCU0l`EBHaGy0ZF>rxyjR%GedWDo3an z975&vvWos#oKRK}it&M!q0v}$S}j_f_<~)dr!7?lz}^(m8k(cZKj94L(y$pvsE*s^nxFZ{;i9`O~?dy5HQEFfd1RAArT-fomLvQ5{M zcr-*2d{Y3Ovm&g5)NhUTUVf+0XQ0H70{-b76&E-WGiE3C<+c=Z7BB)=9y=xmZ7em+ z%M=U?iV?x@SjYr66j=M684*q=}_L|A<@^m23hwT=RGV>J-#5pbF+E{)%oLRki_ z|A}!rz4{y8R3d9`z+<3wO-v3LWF4Tw6Y0h$=z*O9{sEC^DZLi&sqQP-is+petJc4Aac?j8(V*KR4u&C#O3!+1IMvrvK|pl zBmHXa`MpiqBwiIoyp1=sW_>ysC5Nfb0D-qo9m-IX>taiY6o+Kj)ud+T5gz`{2RGQu z+L3!m?da&}xOP8eaxa!Fd2nOM+~iZ3wP63i?+G12|A!B^W0(o5Wyb57?#w9

9p& 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 literal 0 HcmV?d00001 diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122359.png b/Documentation/Screenshots/Screenshot 2024-12-25 122359.png new file mode 100644 index 0000000000000000000000000000000000000000..ac648d4e34d5c5fdac9a7ab68a324d048a0405bb GIT binary patch literal 38002 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 D$AEe` literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 8bca815..3eee89c 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,48 @@ ![Build Status](https://github.com/devoctomy/PainTracker/actions/workflows/android.yml/badge.svg) -My attempt at a simple pain tracking app for physiotherapy. +Simple pain tracking app for Android written in Kotlin. + +I created this app to help track pain symptoms whilst receiving physiotherapy over an extended period of time. Usually when asked where I have felt discomfort over the previous week my answer would be quite vague, using an app like this I wanted to just dump out a PDF report for the previous week containing all the necessary information. + +## Requirements + +* Android Studio (Created using 2024.2.1 Patch 3) +* OpenJDK + +I am using the following, + +openjdk 21.0.4 2024-07-16 +OpenJDK Runtime Environment OpenLogic-OpenJDK (build 21.0.4+7-adhoc.Administrator.jdk21u) +OpenJDK 64-Bit Server VM OpenLogic-OpenJDK (build 21.0.4+7-adhoc.Administrator.jdk21u, mixed mode, sharing) + +* Android SDK 14 (API Level 34) +* Android SDK Build-Tools 36-rc3 +* Android SDK Platform-Tools 35.0.2 + +### Output from Android Studio + +Android Studio Ladybug | 2024.2.1 Patch 3 +Build #AI-242.23339.11.2421.12700392, built on November 22, 2024 +Runtime version: 21.0.3+-12282718-b509.11 amd64 +VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. +Toolkit: sun.awt.windows.WToolkit +Windows 11.0 +GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation +Memory: 4096M +Cores: 32 +Registry: + ide.experimental.ui=true + i18n.locale= + +## Progress + +- [x] Date Selection, default to today +- [x] Pain input via a number of preset categories +- [x] Notes input +- [x] Ability to edit previously entered data +- [ ] Simple export to PDF functionality +- [ ] Ability to add custom pain categories +- [ ] Ability to see overview / listing of all data +- [ ] Google Drive backup / storage support + From 62baf4530ea02ba8069bc20fd0ce9202b2fc4506 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 12:28:41 +0000 Subject: [PATCH 10/11] chore: renamed screenshots --- ... 122152.png => Screenshot-2024-12-25-122152.png} | Bin ... 122254.png => Screenshot-2024-12-25-122254.png} | Bin ... 122336.png => Screenshot-2024-12-25-122336.png} | Bin ... 122359.png => Screenshot-2024-12-25-122359.png} | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename Documentation/Screenshots/{Screenshot 2024-12-25 122152.png => Screenshot-2024-12-25-122152.png} (100%) rename Documentation/Screenshots/{Screenshot 2024-12-25 122254.png => Screenshot-2024-12-25-122254.png} (100%) rename Documentation/Screenshots/{Screenshot 2024-12-25 122336.png => Screenshot-2024-12-25-122336.png} (100%) rename Documentation/Screenshots/{Screenshot 2024-12-25 122359.png => Screenshot-2024-12-25-122359.png} (100%) diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122152.png b/Documentation/Screenshots/Screenshot-2024-12-25-122152.png similarity index 100% rename from Documentation/Screenshots/Screenshot 2024-12-25 122152.png rename to Documentation/Screenshots/Screenshot-2024-12-25-122152.png diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122254.png b/Documentation/Screenshots/Screenshot-2024-12-25-122254.png similarity index 100% rename from Documentation/Screenshots/Screenshot 2024-12-25 122254.png rename to Documentation/Screenshots/Screenshot-2024-12-25-122254.png diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122336.png b/Documentation/Screenshots/Screenshot-2024-12-25-122336.png similarity index 100% rename from Documentation/Screenshots/Screenshot 2024-12-25 122336.png rename to Documentation/Screenshots/Screenshot-2024-12-25-122336.png diff --git a/Documentation/Screenshots/Screenshot 2024-12-25 122359.png b/Documentation/Screenshots/Screenshot-2024-12-25-122359.png similarity index 100% rename from Documentation/Screenshots/Screenshot 2024-12-25 122359.png rename to Documentation/Screenshots/Screenshot-2024-12-25-122359.png From 431b9538a1232a34245b00a66fdeb10b457e5659 Mon Sep 17 00:00:00 2001 From: Nick Pateman Date: Wed, 25 Dec 2024 12:31:03 +0000 Subject: [PATCH 11/11] chore: screenshots --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 3eee89c..bc65c98 100644 --- a/README.md +++ b/README.md @@ -47,3 +47,13 @@ Registry: - [ ] Ability to see overview / listing of all data - [ ] Google Drive backup / storage support +## Screenshots + +![Front of body pain](https://github.com/devoctomy/PainTracker/raw/main/Documentation/Screenshots/Screenshot-2024-12-25-122152.png) + +![Pain notes](https://github.com/devoctomy/PainTracker/raw/main/Documentation/Screenshots/Screenshot-2024-12-25-122254.png) + +![Back of body pain](https://github.com/devoctomy/PainTracker/raw/main/Documentation/Screenshots/Screenshot-2024-12-25-122336.png) + +![Date Picker](https://github.com/devoctomy/PainTracker/raw/main/Documentation/Screenshots/Screenshot-2024-12-25-122359.png) +