From 2fb9f2aa8a8cacc1a004e49f4f65323de0724a02 Mon Sep 17 00:00:00 2001 From: TTolsun <112919054+TTolsun@users.noreply.github.com> Date: Tue, 20 Oct 2026 02:18:48 +0900 Subject: [PATCH 1/2] Add manufacturer Bokeh capture through Depth menu --- .omm/data-flow/description.md | 2 + .../camera-engines/description.md | 2 +- .../camera-engines/meta.yaml | 1 + .../portrait-engine/description.md | 5 + .../camera-engines/portrait-engine/meta.yaml | 5 + .../camera-picker/description.md | 1 + .../expert-screen/camera-picker/meta.yaml | 6 + .../screens/expert-screen/meta.yaml | 3 +- .../engine-lifecycle/meta.yaml | 1 + .../portrait-lifecycle/description.md | 1 + .../portrait-lifecycle/meta.yaml | 5 + .omm/ui-tool-handoff/description.md | 2 + .omm/ui-zoom/description.md | 2 +- .../halcamera/cli/CliStoreInstrumentation.kt | 19 ++ .../java/dev/halcamera/ui/PinchZoomChecks.kt | 1 + .../java/dev/halcamera/ui/PortraitChecks.kt | 190 +++++++++++++ .../main/java/dev/halcamera/MainActivity.kt | 89 ++---- .../java/dev/halcamera/MainCameraPicker.kt | 53 ++++ .../main/java/dev/halcamera/MainCliBridge.kt | 3 +- .../java/dev/halcamera/MainDepthBridge.kt | 57 ++-- .../java/dev/halcamera/MainPortraitBridge.kt | 51 ++++ .../dev/halcamera/camera/CameraProbeReader.kt | 1 + .../halcamera/camera/PortraitCameraEngine.kt | 267 ++++++++++++++++++ .../halcamera/camera/PortraitCapabilities.kt | 26 ++ .../dev/halcamera/camera/PortraitSupport.kt | 40 +++ .../java/dev/halcamera/ui/LiveIndicator.kt | 3 +- .../dev/halcamera/ui/LiveStreamReadout.kt | 4 +- .../halcamera/camera/PortraitSupportTest.kt | 42 +++ .../dev/halcamera/ui/LiveStreamReadoutTest.kt | 5 + docs/design/APP-UI.md | 8 +- docs/validation/portrait-20261020/README.md | 44 +++ .../portrait-20261020/depth-portrait-menu.png | Bin 0 -> 118236 bytes .../portrait-20261020/live-portrait.png | Bin 0 -> 83564 bytes .../portrait-20261020/portrait-checks.json | 139 +++++++++ .../portrait-depth-metadata.json | 26 ++ .../portrait-resolutions.png | Bin 0 -> 256573 bytes .../portrait-20261020/probe-summary.json | 134 +++++++++ guide/_bindings.yaml | 21 ++ guide/_content/_reference/engine/camera2.md | 3 + .../_content/_reference/engine/comparison.md | 2 + guide/_content/_reference/engine/contract.md | 3 + guide/_content/architecture/constraints.md | 3 + guide/_content/architecture/module-roles.md | 2 + guide/_content/architecture/overview.md | 2 +- guide/_content/architecture/runtime-flow.md | 3 + guide/live.md | 19 +- guide/probe.md | 3 +- tools/docgen/regression.test.mjs | 2 +- tools/docgen/state/evidence.json | 30 +- 49 files changed, 1222 insertions(+), 109 deletions(-) create mode 100644 .omm/overall-architecture/camera-engines/portrait-engine/description.md create mode 100644 .omm/overall-architecture/camera-engines/portrait-engine/meta.yaml create mode 100644 .omm/overall-architecture/screens/expert-screen/camera-picker/description.md create mode 100644 .omm/overall-architecture/screens/expert-screen/camera-picker/meta.yaml create mode 100644 .omm/state-transitions/engine-lifecycle/portrait-lifecycle/description.md create mode 100644 .omm/state-transitions/engine-lifecycle/portrait-lifecycle/meta.yaml create mode 100644 app/src/androidTest/java/dev/halcamera/ui/PortraitChecks.kt create mode 100644 app/src/main/java/dev/halcamera/MainCameraPicker.kt create mode 100644 app/src/main/java/dev/halcamera/MainPortraitBridge.kt create mode 100644 app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt create mode 100644 app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt create mode 100644 app/src/main/java/dev/halcamera/camera/PortraitSupport.kt create mode 100644 app/src/test/java/dev/halcamera/camera/PortraitSupportTest.kt create mode 100644 docs/validation/portrait-20261020/README.md create mode 100644 docs/validation/portrait-20261020/depth-portrait-menu.png create mode 100644 docs/validation/portrait-20261020/live-portrait.png create mode 100644 docs/validation/portrait-20261020/portrait-checks.json create mode 100644 docs/validation/portrait-20261020/portrait-depth-metadata.json create mode 100644 docs/validation/portrait-20261020/portrait-resolutions.png create mode 100644 docs/validation/portrait-20261020/probe-summary.json diff --git a/.omm/data-flow/description.md b/.omm/data-flow/description.md index e7a517fe..6dd75040 100644 --- a/.omm/data-flow/description.md +++ b/.omm/data-flow/description.md @@ -13,3 +13,5 @@ CLI는 직접 인자 또는 base64url JSON을 받고 shell UID·허용 설정· 벤치마크 JSON은 기기 안에서만 생성하며, files/benchmarks와 baseline 목록으로 비교합니다. 외부 JSON 가져오기는 0.13.0에서 제거했습니다. Multi 모드의 ConcurrentSession은 독립 장치마다 출력과 저장을 관리합니다. 사진은 이미지·CaptureResult 센서 시각을 연결한 장치별 JPEG이며 다른 장치 영상을 합성하지 않습니다. ConcurrentPhotoStore는 JPEG를 DCIM/HALCamera에, 공통 촬영 ID·장치 ID·성공 또는 실패를 Download/HALCamera의 JSON에 기록합니다. 두 엔진은 MultiRecording을 공유하며, 하나의 마이크 AAC를 장치별 MP4에 결합한 뒤 공개합니다. 녹음이나 파일 하나라도 실패하면 해당 녹화 묶음의 공개 파일을 회수합니다. Split 배치는 프리뷰만 바꾸며 인코더 크기는 장치 스트림과 회전에서 정합니다. 이 경로는 Benchmark 계산과 분리됩니다. + +Portrait는 Depth 메뉴에서 선택하지만 별도 확장 세션의 컬러 미리보기와 OEM JPEG를 받습니다. PortraitCameraEngine은 JPEG를 MediaLibrary로 저장하고 효과·해상도·시각만 촬영 JSON에 남깁니다. 확장 콜백은 벤치마크나 일반 CaptureResult 지표에 섞지 않습니다. diff --git a/.omm/overall-architecture/camera-engines/description.md b/.omm/overall-architecture/camera-engines/description.md index fdd8a30e..d3fab77b 100644 --- a/.omm/overall-architecture/camera-engines/description.md +++ b/.omm/overall-architecture/camera-engines/description.md @@ -1,2 +1,2 @@ -camera/는 CameraEngine 인터페이스와 Camera2Engine·CameraXEngine·DepthCameraEngine을 제공합니다. Camera2Engine은 기본 크기 선택 경로와 벤치마크용 명시적 StreamSpec 경로를 구분합니다. 세션별 콜백과 close(done) 완료 통지가 러너에 연결됩니다. +camera/는 CameraEngine 인터페이스와 Camera2Engine·CameraXEngine·DepthCameraEngine·PortraitCameraEngine을 제공합니다. Camera2Engine은 기본 크기 선택 경로와 벤치마크용 명시적 StreamSpec 경로를 구분합니다. Depth는 맵 보기, Portrait는 제조사 Bokeh JPEG 촬영이며 벤치마크 엔진과 구분합니다. 세션별 콜백과 close(done) 완료 통지가 러너에 연결됩니다. StreamConfiguration은 실제 카메라 출력으로 Callback 목록을 만듭니다. 앱의 YUV JPEG 변환·PIP 합성·GPU 인코더 출력은 Callback에 추가하지 않습니다. diff --git a/.omm/overall-architecture/camera-engines/meta.yaml b/.omm/overall-architecture/camera-engines/meta.yaml index f6744b90..2777768f 100644 --- a/.omm/overall-architecture/camera-engines/meta.yaml +++ b/.omm/overall-architecture/camera-engines/meta.yaml @@ -7,6 +7,7 @@ title: camera-engines children: - camera2-engine - depth-engine + - portrait-engine - camerax-engine - endpoint-model - endpoint-resolver diff --git a/.omm/overall-architecture/camera-engines/portrait-engine/description.md b/.omm/overall-architecture/camera-engines/portrait-engine/description.md new file mode 100644 index 00000000..9f27bc79 --- /dev/null +++ b/.omm/overall-architecture/camera-engines/portrait-engine/description.md @@ -0,0 +1,5 @@ +PortraitCameraEngine은 API 31 이상에서 제조사 BOKEH의 CameraExtensionSession을 소유합니다. 공개 카메라의 확장 지원·SurfaceTexture 미리보기 크기·JPEG 크기를 각각 조회하고, 선택한 PortraitConfig의 두 크기로 세션을 구성합니다. 일반 StreamConfigurationMap 크기를 대용으로 쓰거나 실패 때 다른 크기로 재시도하지 않습니다. + +Live의 Depth 메뉴는 Off·Portrait (Bokeh)·Depth Map을 구분합니다. Portrait는 컬러 미리보기와 JPEG 촬영이며 센서 Depth 맵을 반환하지 않습니다. 선택하면 Camera2로 전환하고 기존 close(done) 뒤 확장 세션을 엽니다. TextureView의 첫 표시 프레임 뒤 촬영을 허용합니다. 미리보기 15초·JPEG 60초 시간 제한, 실패 후 해제, 늦은 JPEG 차단과 단일 촬영의 한 번뿐인 완료 전달을 둡니다. close(done)는 열기 중인 장치도 닫고 CameraDevice.onClosed 뒤 자원을 회수합니다. 이미 받은 JPEG의 저장 작업은 완료할 수 있습니다. + +사진은 OEM JPEG를 그대로 MediaLibrary로 저장하고 JPEG 크기·미리보기 크기·manufacturer_bokeh 효과·시각을 촬영 JSON에 기록합니다. 수동 제어·줌·터치 측광·연사·AEB·RAW·PIP·동영상은 제공하지 않습니다. 일반 Camera2 콜백 지표로 확장 처리를 측정하지 않으며 Benchmark와 별도 경로입니다. Photo·Video·카메라·엔진 전환과 새 CLI 촬영 준비는 Portrait를 종료합니다. diff --git a/.omm/overall-architecture/camera-engines/portrait-engine/meta.yaml b/.omm/overall-architecture/camera-engines/portrait-engine/meta.yaml new file mode 100644 index 00000000..e5e6ed05 --- /dev/null +++ b/.omm/overall-architecture/camera-engines/portrait-engine/meta.yaml @@ -0,0 +1,5 @@ +kind: nested-class +title: portrait-engine +children: [] +parentPath: + - camera-engines diff --git a/.omm/overall-architecture/screens/expert-screen/camera-picker/description.md b/.omm/overall-architecture/screens/expert-screen/camera-picker/description.md new file mode 100644 index 00000000..ad678523 --- /dev/null +++ b/.omm/overall-architecture/screens/expert-screen/camera-picker/description.md @@ -0,0 +1 @@ +MainCameraPicker는 Live의 공개 카메라 선택과 공통 CameraLabel·배율 표시를 담당합니다. 녹화·저장·CLI·종료 처리 중 선택을 막고, 카메라가 바뀌면 Depth·Portrait를 종료하며 줌과 렌즈별 제어를 초기화합니다. restartCamera는 기존 엔진의 close(done) 뒤 선택한 카메라를 엽니다. 버튼과 핀치는 applyZoom을 공유하며 Depth·Portrait에서는 배율 변경을 거절합니다. diff --git a/.omm/overall-architecture/screens/expert-screen/camera-picker/meta.yaml b/.omm/overall-architecture/screens/expert-screen/camera-picker/meta.yaml new file mode 100644 index 00000000..deea4a7c --- /dev/null +++ b/.omm/overall-architecture/screens/expert-screen/camera-picker/meta.yaml @@ -0,0 +1,6 @@ +kind: nested-class +title: camera-picker +children: [] +parentPath: + - screens + - expert-screen diff --git a/.omm/overall-architecture/screens/expert-screen/meta.yaml b/.omm/overall-architecture/screens/expert-screen/meta.yaml index 678dba1e..ea2f869c 100644 --- a/.omm/overall-architecture/screens/expert-screen/meta.yaml +++ b/.omm/overall-architecture/screens/expert-screen/meta.yaml @@ -4,6 +4,7 @@ update_count: 2 last_field: concern kind: nested-class title: expert-screen -children: [] +children: + - camera-picker parentPath: - screens diff --git a/.omm/state-transitions/engine-lifecycle/meta.yaml b/.omm/state-transitions/engine-lifecycle/meta.yaml index f7a72291..7adbcf22 100644 --- a/.omm/state-transitions/engine-lifecycle/meta.yaml +++ b/.omm/state-transitions/engine-lifecycle/meta.yaml @@ -6,4 +6,5 @@ kind: nested-class title: engine-lifecycle children: - camerax-lifecycle + - portrait-lifecycle parentPath: [] diff --git a/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/description.md b/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/description.md new file mode 100644 index 00000000..cb948315 --- /dev/null +++ b/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/description.md @@ -0,0 +1 @@ +Depth 메뉴의 Off·Portrait (Bokeh)·Depth Map을 구분합니다. Portrait 선택은 기존 close(done) 뒤 CameraExtensionSession을 열며, 첫 표시 프레임 이후 셔터를 허용합니다. JPEG를 받기 전 종료되면 촬영을 실패로 한 번 완료하고, 이미 받은 JPEG의 저장은 마칠 수 있습니다. Photo·Video·카메라·엔진 전환과 새 CLI 촬영은 Portrait를 종료합니다. 실패 뒤에도 Photo 복귀와 다른 해상도 선택을 허용합니다. diff --git a/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/meta.yaml b/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/meta.yaml new file mode 100644 index 00000000..52f9c592 --- /dev/null +++ b/.omm/state-transitions/engine-lifecycle/portrait-lifecycle/meta.yaml @@ -0,0 +1,5 @@ +kind: nested-class +title: portrait-lifecycle +children: [] +parentPath: + - engine-lifecycle diff --git a/.omm/ui-tool-handoff/description.md b/.omm/ui-tool-handoff/description.md index f3d1ff3a..faefc451 100644 --- a/.omm/ui-tool-handoff/description.md +++ b/.omm/ui-tool-handoff/description.md @@ -9,3 +9,5 @@ Live Streams는 Lab 또는 Live의 크기 표시에서 열 수 있으며 카메 Multi도 Live의 close(done) 뒤 ConcurrentCameraActivity를 엽니다. Live에서 선택한 엔진을 전달하며 Multi 화면에서도 Camera2와 CameraX를 바꿀 수 있습니다. 이 화면은 모든 카메라의 onClosed를 기다린 뒤 Live로 돌아가며, Live는 기존 엔진 선택으로 프리뷰를 다시 엽니다. Depth 보기에서도 Lab 진입 전에 close(done)를 기다립니다. 촬영 모드를 바꾸지 않고 Lab에서 돌아오면 선택한 Depth 해상도를 다시 엽니다. Depth 보기 중에는 크기 표시로 Live Streams를 여는 동작을 비활성화합니다. + +Portrait에서도 Lab 진입 전에 close(done)를 기다리고 복귀 때 선택 해상도를 다시 엽니다. Portrait의 크기 표시를 누르면 일반 Live Streams 대신 Depth 메뉴를 엽니다. Lab에서 일반 Live Streams 설정을 적용하면 Portrait를 종료하고 해당 설정을 사용합니다. diff --git a/.omm/ui-zoom/description.md b/.omm/ui-zoom/description.md index b936e19a..5a8276af 100644 --- a/.omm/ui-zoom/description.md +++ b/.omm/ui-zoom/description.md @@ -2,7 +2,7 @@ Live 프리뷰에서 두 손가락을 벌리거나 모으면 지원 범위 안에서 연속으로 줌을 바꿉니다. 가장 가까운 프리셋의 원에 현재 배율을 소수 첫째 자리까지 표시하며, 펼친 상태에서 그 원을 누르면 해당 프리셋 배율로 돌아갑니다. 화면의 카메라 선택 정보를 갱신해도 중간 배율은 유지합니다. -핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. +핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기·제조사 Portrait, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. | 조건 | 동작 | | --- | --- | diff --git a/app/src/androidTest/java/dev/halcamera/cli/CliStoreInstrumentation.kt b/app/src/androidTest/java/dev/halcamera/cli/CliStoreInstrumentation.kt index 1330e9d5..a4a992fe 100644 --- a/app/src/androidTest/java/dev/halcamera/cli/CliStoreInstrumentation.kt +++ b/app/src/androidTest/java/dev/halcamera/cli/CliStoreInstrumentation.kt @@ -19,6 +19,9 @@ class CliStoreInstrumentation : Instrumentation() { private var lintChecks = false private var splitDrag = false private var depthChecks = false + private var portraitChecks = false + private var portraitMetadata = false + private var portraitUi = false override fun onCreate(arguments: Bundle?) { super.onCreate(arguments) exportReports = arguments?.getString("export_reports") == "true" @@ -31,10 +34,26 @@ class CliStoreInstrumentation : Instrumentation() { lintChecks = arguments?.getString("lint_checks") == "true" splitDrag = arguments?.getString("split_drag") == "true" depthChecks = arguments?.getString("depth_checks") == "true" + portraitChecks = arguments?.getString("portrait_checks") == "true" + portraitMetadata = arguments?.getString("portrait_metadata") == "true" + portraitUi = arguments?.getString("portrait_ui") == "true" start() } override fun onStart() { + if (portraitChecks || portraitMetadata || portraitUi) { + try { + val result = when { + portraitMetadata -> dev.halcamera.ui.PortraitChecks.metadata(this) + portraitUi -> dev.halcamera.ui.PortraitChecks.uiChecks(this) + else -> dev.halcamera.ui.PortraitChecks.run(this) + } + finish(Activity.RESULT_OK, Bundle().apply { putString("stream", "$result\n") }) + } catch (error: Throwable) { + finish(Activity.RESULT_CANCELED, Bundle().apply { putString("stream", "PORTRAIT_CHECKS_FAILED: ${error.stackTraceToString()}\n") }) + } + return + } if (depthChecks) { try { val result = dev.halcamera.ui.DepthMapChecks.run(this) diff --git a/app/src/androidTest/java/dev/halcamera/ui/PinchZoomChecks.kt b/app/src/androidTest/java/dev/halcamera/ui/PinchZoomChecks.kt index 1359e475..89156e5b 100644 --- a/app/src/androidTest/java/dev/halcamera/ui/PinchZoomChecks.kt +++ b/app/src/androidTest/java/dev/halcamera/ui/PinchZoomChecks.kt @@ -9,6 +9,7 @@ import android.view.MotionEvent import android.view.View import android.widget.Button import dev.halcamera.MainActivity +import dev.halcamera.updateCameraChoices import dev.halcamera.camera.zoomRange import dev.halcamera.telemetry.FlightRecorder import java.io.File diff --git a/app/src/androidTest/java/dev/halcamera/ui/PortraitChecks.kt b/app/src/androidTest/java/dev/halcamera/ui/PortraitChecks.kt new file mode 100644 index 00000000..68597533 --- /dev/null +++ b/app/src/androidTest/java/dev/halcamera/ui/PortraitChecks.kt @@ -0,0 +1,190 @@ +package dev.halcamera.ui + +import android.app.Instrumentation +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Build +import android.os.SystemClock +import dev.halcamera.MainActivity +import dev.halcamera.chooseDepth +import dev.halcamera.selectMode +import dev.halcamera.camera.* +import org.json.JSONObject +import java.io.File +import java.security.MessageDigest +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicReference + +/** Opt-in hardware checks. Saves ordinary OEM JPEGs to MediaLibrary, never pixels to the report. */ +object PortraitChecks { + fun uiChecks(test: Instrumentation): String { + fun ui(block: () -> T): T { + val result = AtomicReference>() + test.runOnMainSync { result.set(runCatching(block)) } + return result.get().getOrThrow() + } + fun nodes(root: android.view.View): Sequence = sequence { + yield(root) + if (root is android.view.ViewGroup) for (index in 0 until root.childCount) yieldAll(nodes(root.getChildAt(index))) + } + fun roots() = android.view.inspector.WindowInspector.getGlobalWindowViews().filter { it.isShown } + fun text(value: String) = roots().asReversed().asSequence().flatMap(::nodes) + .filterIsInstance().firstOrNull { it.text.toString() == value } + fun click(value: String) { + var target: android.view.View = requireNotNull(text(value)) + while (!target.isClickable) target = target.parent as android.view.View + check(target.isEnabled); check(target.performClick()) + } + fun waitFor(label: String, condition: () -> Boolean) { + val end = SystemClock.uptimeMillis() + 25_000 + while (!ui(condition)) { + check(SystemClock.uptimeMillis() < end) { "Timed out: $label" }; SystemClock.sleep(100) + } + } + val activity = test.startActivitySync(Intent(test.targetContext, MainActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) as MainActivity + val directory = File(test.targetContext.getExternalFilesDir(null), "portrait-ui").apply { mkdirs() } + fun screenshot(name: String) = ui { + // App-owned windows only; camera pixels and SystemUI notifications are excluded. + val alpha = activity.previewHost.alpha + val thumbnails = nodes(activity.window.decorView).filterIsInstance().map { it to it.alpha }.toList() + activity.previewHost.alpha = 0f + thumbnails.forEach { it.first.alpha = 0f } + val bitmap = android.graphics.Bitmap.createBitmap(activity.window.decorView.width, activity.window.decorView.height, + android.graphics.Bitmap.Config.ARGB_8888) + try { + val canvas = android.graphics.Canvas(bitmap); canvas.drawColor(android.graphics.Color.BLACK) + roots().forEach { root -> + val xy = IntArray(2); root.getLocationOnScreen(xy) + canvas.save(); canvas.translate(xy[0].toFloat(), xy[1].toFloat()); root.draw(canvas); canvas.restore() + } + File(directory, name).outputStream().use { check(bitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, it)) } + } finally { activity.previewHost.alpha = alpha; thumbnails.forEach { it.first.alpha = it.second }; bitmap.recycle() } + } + fun enterPortrait() { + ui { activity.chooseDepth() } + waitFor("Depth menu") { text("Portrait (Bokeh)") != null } + screenshot("depth-portrait-menu.png") + ui { click("Portrait (Bokeh)") } + waitFor("Portrait resolution picker") { text("JPEG 640x480") != null } + screenshot("portrait-resolutions.png") + ui { click("JPEG 640x480") } + waitFor("Portrait preview") { activity.portraitConfig != null && activity.ready && !activity.closing } + ui { check(activity.depthModeButton.isSelected); check(activity.mediaButton.isEnabled); check(!activity.zoomControl.isEnabled) } + } + try { + waitFor("initial Photo") { activity.ready && !activity.closing } + enterPortrait() + screenshot("live-portrait.png") + ui { activity.selectMode(true) } + waitFor("Video recovery") { activity.ready && activity.videoMode && activity.portraitConfig == null } + ui { activity.selectMode(false) } + waitFor("Photo recovery") { activity.ready && !activity.videoMode && activity.portraitConfig == null } + enterPortrait() + ui { activity.chooseDepth() } + waitFor("Depth menu Off") { text("Off") != null } + ui { click("Off") } + waitFor("Off recovery") { activity.ready && activity.portraitConfig == null && activity.depthSize == null } + } finally { ui { activity.finish() } } + return "PORTRAIT_UI_CHECKS_OK · Depth entry, resolution picker, selected controls, Photo/Video/Off recovery · $directory" + } + + fun metadata(test: Instrumentation): String { + check(Build.VERSION.SDK_INT >= 31) + val manager = test.targetContext.getSystemService(android.hardware.camera2.CameraManager::class.java) + val values = manager.cameraIdList.map { id -> + val extension = manager.getCameraExtensionCharacteristics(id) + val result = runCatching { extension.getExtensionSupportedSizes( + android.hardware.camera2.CameraExtensionCharacteristics.EXTENSION_BOKEH, android.graphics.ImageFormat.DEPTH_JPEG) + .map { it.toString() } } + mapOf("camera" to id, "bokehDepthJpegSizes" to result.getOrNull(), "readError" to result.exceptionOrNull()?.toString()) + } + val output = File(test.targetContext.getExternalFilesDir(null), "portrait-depth-metadata.json") + output.writeText(JSONObject(mapOf("model" to Build.MODEL, "api" to Build.VERSION.SDK_INT, "cameras" to values)).toString(2)) + return "PORTRAIT_METADATA_OK · ${output.absolutePath}" + } + + fun run(test: Instrumentation): String { + check(Build.VERSION.SDK_INT >= 31) + fun ui(block: () -> T): T { + val result = AtomicReference>() + test.runOnMainSync { result.set(runCatching(block)) } + return result.get().getOrThrow() + } + val activity = test.startActivitySync(Intent(test.targetContext, MainActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) as MainActivity + val report = File(test.targetContext.getExternalFilesDir(null), "portrait-checks.json") + val checks = mutableListOf>() + fun persist() = report.writeText(JSONObject(mapOf("model" to Build.MODEL, "android" to Build.VERSION.RELEASE, + "api" to Build.VERSION.SDK_INT, "checks" to checks)).toString(2)) + fun waitReady(label: String) { + val end = SystemClock.uptimeMillis() + 25_000 + while (!ui { activity.ready && !activity.closing }) { + check(SystemClock.uptimeMillis() < end) { "Timed out: $label" } + SystemClock.sleep(100) + } + } + fun configure(id: String, config: PortraitConfig?) { + ui { + activity.cameraId = id; activity.engineName = "Camera2"; activity.videoMode = false + activity.resetModeSettings(); activity.portraitConfig = config; activity.paused = false + activity.restartCamera() + } + waitReady("camera $id / $config") + } + try { + waitReady("initial Photo") + val manager = activity.manager + val ids = manager.cameraIdList.filter { portraitSupport(manager, it).available } + check(ids.isNotEmpty()) { "No OEM Bokeh cameras connected" } + for (id in ids) { + val support = portraitSupport(manager, id) + val largest = support.jpegs.filter { it.width.toLong() * it.height <= 16_000_000 }.lastOrNull() ?: support.jpegs.first() + val sizes = listOf(support.jpegs.first(), largest).distinct() + for (size in sizes) { + val config = requireNotNull(support.config(size)) + configure(id, config) + check(ui { activity.engine is PortraitCameraEngine }) + checks += mapOf("scenario" to "preview", "camera" to id, "preview" to config.preview.toString(), + "jpeg" to size.toString(), "result" to "PASS") + persist() + } + val latch = CountDownLatch(1) + val captured = AtomicReference>() + ui { (activity.engine as MediaCapture).capturePhoto("portrait-device-$id") { captured.set(it); latch.countDown() } } + check(latch.await(65, TimeUnit.SECONDS)) { "JPEG wait timed out for $id" } + val photo = captured.get().getOrThrow() + val file = photo.artifacts.single { it.mime == "image/jpeg" } + val bytes = test.targetContext.contentResolver.openInputStream(file.uri)!!.use { it.readBytes() } + val bounds = BitmapFactory.Options().apply { inJustDecodeBounds = true } + BitmapFactory.decodeByteArray(bytes, 0, bytes.size, bounds) + check(setOf(bounds.outWidth, bounds.outHeight) == setOf(largest.width, largest.height)) { "JPEG resolution mismatch" } + val metadata = photo.artifacts.single { it.mime == "application/json" } + val text = test.targetContext.contentResolver.openInputStream(metadata.uri)!!.bufferedReader().use { it.readText() } + check(JSONObject(text).getJSONObject("capture").getString("effect") == "manufacturer_bokeh") + checks += mapOf("scenario" to "capture", "camera" to id, "jpeg" to largest.toString(), "name" to file.name, + "bytes" to bytes.size, "sha256" to MessageDigest.getInstance("SHA-256").digest(bytes).joinToString("") { "%02x".format(it) }, + "encodedWidth" to bounds.outWidth, "encodedHeight" to bounds.outHeight, + "exifOrientation" to JpegOrientation.read(bytes), "effect" to "manufacturer_bokeh", "result" to "PASS") + configure(id, null) + checks += mapOf("scenario" to "return_to_photo", "camera" to id, "result" to "PASS") + persist() + } + // Repeated OEM/ordinary ownership transfer, plus a close immediately after open was requested. + val config = requireNotNull(portraitSupport(manager, ids.first()).config(portraitSupport(manager, ids.first()).jpegs.first())) + repeat(3) { configure(ids.first(), config); configure(ids.first(), null) } + ui { + activity.portraitConfig = config; activity.restartCamera() + activity.portraitConfig = null; activity.restartCamera() + } + waitReady("cancelled Portrait opening") + checks += mapOf("scenario" to "three_reopens_and_cancel_open", "result" to "PASS") + persist() + } catch (error: Throwable) { + checks += mapOf("scenario" to "failure", "error" to error.stackTraceToString(), "result" to "FAIL") + persist(); throw error + } finally { ui { activity.finish() } } + return "PORTRAIT_CHECKS_OK · ${checks.size} checks · ${report.absolutePath}" + } +} diff --git a/app/src/main/java/dev/halcamera/MainActivity.kt b/app/src/main/java/dev/halcamera/MainActivity.kt index 0fa42b67..4e4d7b9b 100644 --- a/app/src/main/java/dev/halcamera/MainActivity.kt +++ b/app/src/main/java/dev/halcamera/MainActivity.kt @@ -122,15 +122,16 @@ class MainActivity : ComponentActivity() { private lateinit var modeControls: LinearLayout private lateinit var recordingTime: TextView private lateinit var galleryButton: RecentMediaButton - private lateinit var cameraShortcut: IconButton + internal lateinit var cameraShortcut: IconButton /** Takes a photo from the running recording (#175); it sits where the camera picker is while recording. */ private lateinit var snapshotButton: IconButton - private var cameraIds = emptyList() + internal var cameraIds = emptyList() /** Logical id to endpoint, so [cameraLabel] can name the lens without re-reading CameraCharacteristics. */ - private var cameraEndpoints = emptyMap() + internal var cameraEndpoints = emptyMap() private lateinit var labButton: Button internal var videoMode = false internal var depthSize: LiveSize? = null + internal var portraitConfig: PortraitConfig? = null internal lateinit var depthModeButton: Button internal var recordingVideo = false internal var stoppingRecording = false @@ -139,14 +140,14 @@ class MainActivity : ComponentActivity() { internal val captureFeedback by lazy { CaptureFeedback(this) } internal val bursts by lazy { LiveBurst(SystemClock::elapsedRealtime, { d, b -> main.postDelayed(b, d) }, - { engine as? MediaCapture }, { ready && cli.active == null && !videoMode }, telemetry::event, ::updateMediaControls, + { engine as? MediaCapture }, { ready && cli.active == null && !videoMode && portraitConfig == null }, telemetry::event, ::updateMediaControls, { if (resumed) captureFeedback.showResult(it) }, BracketFusion(this)) } private val mediaPermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grants -> val action = pendingPermissionAction.also { pendingPermissionAction = null } if (grants.values.all { it }) action?.invoke() else toast("Allow the requested permissions to save media.") } - private lateinit var engineButton: Button + internal lateinit var engineButton: Button internal lateinit var physicalPipButton: Button internal var pendingPip: PipSource? = null internal val pipUi by lazy { LivePipController(this,{ previewHost },{ engine as? PipCamera },::updateMediaControls,{ lastPreviewFrameNs = nowNs() },::showNotice,{ cameraId }) } @@ -176,6 +177,7 @@ class MainActivity : ComponentActivity() { data.getStringExtra(WorkbenchActivity.EXTRA_CAMERA_ID) == cameraId) { @Suppress("DEPRECATION") val settings = data.getSerializableExtra(LiveStreamsActivity.EXTRA_SETTINGS) as? LiveStreamSettings + portraitConfig = null if (settings == null) streamSettings.remove(streamKey()) else streamSettings[streamKey()] = settings telemetry.event(sessionId, "live_streams_changed", settings?.metadata() ?: mapOf("mode" to "default")) paused = false @@ -226,7 +228,7 @@ class MainActivity : ComponentActivity() { liveIndicator.bindSizes(telemetry.sessions[sessionId]?.get("negotiatedStreams") as? Map<*, *>) } readings.update(events, frames, time, sessionId, controlBar.controls) - manualPanel.bind(controlBar.controls.manual, depthSize == null && (ready || recordingVideo) && !stoppingRecording && cli.active == null && !bursts.controlsLocked, + manualPanel.bind(controlBar.controls.manual, depthSize == null && portraitConfig == null && (ready || recordingVideo) && !stoppingRecording && cli.active == null && !bursts.controlsLocked, manualCapabilities, frames.lastOrNull(), time) manualBack.isEnabled = manualPanel.isExpanded if (callbackGraph.isVisible) callbackGraph.updateLive(events,sessionId,time,telemetry.sessions,(engine as? PipCamera)?.pipCallbackSession) @@ -251,6 +253,8 @@ class MainActivity : ComponentActivity() { videoMode = savedInstanceState?.getBoolean("videoMode") ?: false @Suppress("DEPRECATION") depthSize = savedInstanceState?.getSerializable("depthSize") as? LiveSize + @Suppress("DEPRECATION") + portraitConfig = savedInstanceState?.getSerializable("portraitConfig") as? PortraitConfig @Suppress("DEPRECATION", "UNCHECKED_CAST") (savedInstanceState?.getSerializable("liveStreams") as? HashMap)?.let(streamSettings::putAll) @Suppress("DEPRECATION", "UNCHECKED_CAST") @@ -266,6 +270,7 @@ class MainActivity : ComponentActivity() { outState.putString("engine", engineName); outState.putString("camera", cameraId); outState.putBoolean("paused", paused); outState.putFloat("zoom", zoomRatio) outState.putBoolean("videoMode", videoMode) outState.putSerializable("depthSize", depthSize) + outState.putSerializable("portraitConfig", portraitConfig) outState.putSerializable("liveStreams", HashMap(streamSettings)) outState.putSerializable("goodStreams", HashMap(goodStreams)) outState.putBoolean("returningFromLab", returningFromLab) @@ -365,7 +370,7 @@ class MainActivity : ComponentActivity() { } if (cameraId.isEmpty()) { setStatus("No cameras available.", false); return } sessionId = UUID.randomUUID().toString() - if (depthSize == null && pendingPip == null && engineCameraId == cameraId) pendingPip = pipUi.selected + if (depthSize == null && portraitConfig == null && pendingPip == null && engineCameraId == cameraId) pendingPip = pipUi.selected previewStartup.reset() engineCameraId = cameraId val thisSession = sessionId @@ -399,6 +404,8 @@ class MainActivity : ComponentActivity() { val status = { text: String, ok: Boolean -> if (thisSession == sessionId && resumed && !closing) setStatus(text,ok) } engine = if (depthSize != null) { createDepthEngine(released, status) + } else if (portraitConfig != null) { + createPortraitEngine(released, status) } else if (engineName == "CameraX") { val view = PreviewView(this).apply { implementationMode = PreviewView.ImplementationMode.COMPATIBLE; scaleType = PreviewView.ScaleType.FILL_CENTER } previewHost.addView(view, FrameLayout.LayoutParams(-1,-1)) @@ -449,7 +456,7 @@ class MainActivity : ComponentActivity() { } }, recordingState = recordingState, notice = notice, status = status) } - if (depthSize == null) previewHost.addView(FocusRing(this, { engine as? TouchMetering }) { controlBar.setAeLock(it) }.apply { + if (depthSize == null && portraitConfig == null) previewHost.addView(FocusRing(this, { engine as? TouchMetering }) { controlBar.setAeLock(it) }.apply { canInteract = { !bursts.controlsLocked && cli.active == null } onZoomScale = { factor -> if (factor.isFinite() && factor > 0f) applyZoom(zoomRatio * factor) @@ -463,7 +470,7 @@ class MainActivity : ComponentActivity() { try { engine?.start() } catch (e: Exception) { setStatus("Start failed: ${e.message}",false) } updateCameraChoices() } - internal fun depthFrameArrived() { + internal fun previewFrameArrived() { lastPreviewFrameNs = nowNs() initialPreviewArrived() } @@ -560,7 +567,7 @@ class MainActivity : ComponentActivity() { it.includeFontPadding=false it.minWidth=dp(48); it.minimumWidth=dp(48) } - liveIndicator=LiveIndicator(this).apply { onSizesClick = ::openLiveStreams } + liveIndicator=LiveIndicator(this).apply { onSizesClick = { if (portraitConfig != null) chooseDepth() else openLiveStreams() } } val leadingSlot=LinearLayout(this).apply { orientation=LinearLayout.HORIZONTAL; gravity=Gravity.START or Gravity.CENTER_VERTICAL; isBaselineAligned=false addView(engineButton,LinearLayout.LayoutParams(-2,dp(48))) @@ -640,7 +647,7 @@ class MainActivity : ComponentActivity() { withMediaPermissions(true) { (engine as? MediaCapture)?.startRecording() } } else withMediaPermissions(false) { controlBar.controls.let { if (it.bracket) bursts.bracket(sessionId, it, controlBar.support) else engine?.capture() } } } - bindBurstInput({ !videoMode && !mediaBusy() && !controlBar.controls.bracket && cli.active == null }, + bindBurstInput({ !videoMode && portraitConfig == null && !mediaBusy() && !controlBar.controls.bracket && cli.active == null }, { withMediaPermissions(false,it) }, { bursts.hold(sessionId) }, bursts::release) } captureRow.addView(mediaButton,LinearLayout.LayoutParams(captureSize,captureSize).apply { marginStart=dp(12); marginEnd=dp(12) }) @@ -702,60 +709,14 @@ class MainActivity : ComponentActivity() { updateCameraChoices() updateMediaControls() } - private fun selectCamera() { - if (cli.active != null || recordingVideo || mediaBusy() || closing) return - val ids=cameraIds.sortedWith(CameraLabel.idOrder) - val choices=ids.map { id -> - val endpoint=cameraEndpoints[id] - val name=endpoint?.let { listOfNotNull(CameraLabel.facing(it.role,it.facing),CameraLabel.lens(it.role), - CameraLabel.angle(it.role,it.equivalentFocalMm)).joinToString(" · ") }?.takeIf { it.isNotEmpty() } ?: "Camera" - LiveChoiceSheet.Choice("Service · ID $id",name) - } - LiveChoiceSheet.show(this,"Camera",choices,ids.indexOf(cameraId)) { index -> - if (recordingVideo || !resumed || cli.active != null || mediaBusy() || closing) return@show - val chosen=ids[index] - if (cameraId!=chosen) { - pendingPermissionAction=null - recorder.finish("camera_changed")?.let(incidents::export) - cameraId=chosen; zoomRatio=1f - depthSize=null - resetControls(); updateCameraChoices(); restartCamera() - } - } - } - /** Share lens labels with Benchmark, Probe and History; unknown IDs retain the short label. */ - private fun cameraLabel(id:String):String { - if(id.isEmpty()) return "No camera" - return cameraEndpoints[id]?.let(CameraLabel::full) ?: CameraLabel.short(id) - } - private fun applyZoom(ratio: Float) { - if (depthSize != null || !resumed || paused || closing || cli.active != null || bursts.controlsLocked || - !(ready || recordingVideo) || stoppingRecording || cameraId.isEmpty() || !ratio.isFinite()) return - val range = zoomRange(manager, cameraId) - zoomRatio = ratio.coerceIn(range.first, range.second) - engine?.setZoom(zoomRatio) - zoomControl.setRatio(zoomRatio) - } - - internal fun updateCameraChoices() { - if(cameraId.isNotEmpty()) { - val range=zoomRange(manager,cameraId) - zoomRatio=zoomRatio.coerceIn(range.first,range.second) - } - engineButton.text=engineName - engineButton.contentDescription="Current: $engineName; tap to switch to ${if(engineName=="Camera2") "CameraX" else "Camera2"}" - cameraShortcut.contentDescription="Choose camera, current: ${cameraLabel(cameraId)}" - cameraShortcut.tooltipText=cameraShortcut.contentDescription - zoomControl.setChoices(if(cameraId.isEmpty()) listOf(1f) else zoomPresets(zoomRange(manager,cameraId)),zoomRatio) - } internal fun updateMediaControls() { if (!resumed || paused || closing || engine == null) liveIndicator.bind(false) val idle=!recordingVideo && bursts.run==null cli.setUiBusy(liveCli, recordingVideo || stoppingRecording || pendingPermissionAction != null || mediaBusy()) listOf(photoModeButton,videoModeButton).forEachIndexed { index, button -> - val selected=depthSize == null && (index==1)==videoMode + val selected=depthSize == null && portraitConfig == null && (index==1)==videoMode button.isSelected=selected - button.isEnabled=(ready || depthSize != null) && idle && !closing && !mediaBusy() && pendingPermissionAction == null + button.isEnabled=(ready || depthSize != null || portraitConfig != null) && idle && !closing && !mediaBusy() && pendingPermissionAction == null button.setTextColor(if(selected) Look.onDark else Look.onDarkMuted) button.setTypeface(null,if(selected) Typeface.BOLD else Typeface.NORMAL) button.contentDescription=if(index==0) "Photo mode: save selected JPEG and RAW outputs" else "Video mode with audio" @@ -781,8 +742,8 @@ class MainActivity : ComponentActivity() { mediaButton.isEnabled = false mediaButton.contentDescription = "Photo output is off: enable JPEG or RAW in Live streams" } - engineButton.isEnabled=idle - cameraShortcut.isEnabled=idle && cameraId.isNotEmpty() + engineButton.isEnabled=idle && !closing && !mediaBusy() && pendingPermissionAction == null + cameraShortcut.isEnabled=engineButton.isEnabled && cameraId.isNotEmpty() val snapshot=(engine as? MediaCapture)?.snapshot ?: SnapshotStatus.NONE cameraShortcut.visibility=if(recordingVideo) View.GONE else View.VISIBLE snapshotButton.visibility=if(recordingVideo) View.VISIBLE else View.GONE @@ -797,7 +758,7 @@ class MainActivity : ComponentActivity() { zoomControl.isEnabled=(ready || recordingVideo) && !stoppingRecording && !bursts.controlsLocked controlBar.bind(videoMode,depthSize == null && (ready || recordingVideo) && !stoppingRecording && cli.active==null && !bursts.controlsLocked, pipUi.selected != null || pipUi.busy) - galleryButton.isEnabled=idle + galleryButton.isEnabled=idle && !mediaBusy() labButton.isEnabled=!recordingVideo && !stoppingRecording && !closing && !mediaBusy() liveIndicator.setSizesEnabled(labButton.isEnabled && cli.active == null && pendingPermissionAction == null && cameraId.isNotEmpty()) listOf(multiButton,multiVideoButton).forEach { @@ -817,17 +778,19 @@ class MainActivity : ComponentActivity() { listOf(mediaButton, engineButton, cameraShortcut, photoModeButton, videoModeButton, zoomControl, galleryButton, labButton, reportButton).forEach { it.isEnabled = false } } updateDepthControls(callbackGraph.isVisible, topBar.height + dp(8), bottomBar.height + dp(64)) + updatePortraitControls() listOf(engineButton,cameraShortcut,photoModeButton,videoModeButton,mediaButton,galleryButton,labButton).forEach { it.alpha=if(it.isEnabled) 1f else 0.4f } } private fun chooseEngine(name:String) { - if(engineName==name) return + if(engineName==name || !resumed || closing || cli.active != null || recordingVideo || stoppingRecording || mediaBusy()) return recorder.finish("engine_changed")?.let(incidents::export) engineName=name; resetModeSettings(); updateCameraChoices(); restartCamera() } internal fun resetModeSettings() { depthSize = null + portraitConfig = null if (::callbackGraph.isInitialized) showCallbacks(false) pendingPip = null pipUi.resetMode() diff --git a/app/src/main/java/dev/halcamera/MainCameraPicker.kt b/app/src/main/java/dev/halcamera/MainCameraPicker.kt new file mode 100644 index 00000000..875268d3 --- /dev/null +++ b/app/src/main/java/dev/halcamera/MainCameraPicker.kt @@ -0,0 +1,53 @@ +package dev.halcamera + +import dev.halcamera.camera.CameraLabel +import dev.halcamera.camera.zoomPresets +import dev.halcamera.camera.zoomRange +import dev.halcamera.ui.LiveChoiceSheet + +/** Public camera selection leaves special sessions and resets lens-specific controls. */ +internal fun MainActivity.selectCamera() { + if (cli.active != null || recordingVideo || mediaBusy() || closing) return + val ids = cameraIds.sortedWith(CameraLabel.idOrder) + val choices = ids.map { id -> + val endpoint = cameraEndpoints[id] + val name = endpoint?.let { listOfNotNull(CameraLabel.facing(it.role, it.facing), CameraLabel.lens(it.role), + CameraLabel.angle(it.role, it.equivalentFocalMm)).joinToString(" · ") }?.takeIf { it.isNotEmpty() } ?: "Camera" + LiveChoiceSheet.Choice("Service · ID $id", name) + } + LiveChoiceSheet.show(this, "Camera", choices, ids.indexOf(cameraId)) { index -> + if (recordingVideo || !resumed || cli.active != null || mediaBusy() || closing) return@show + val chosen = ids[index] + if (cameraId != chosen) { + pendingPermissionAction = null + recorder.finish("camera_changed")?.let(::exportCliIncident) + cameraId = chosen; zoomRatio = 1f + depthSize = null; portraitConfig = null + resetControls(); updateCameraChoices(); restartCamera() + } + } +} + +internal fun MainActivity.cameraLabel(id: String): String = if (id.isEmpty()) "No camera" + else cameraEndpoints[id]?.let(CameraLabel::full) ?: CameraLabel.short(id) + +internal fun MainActivity.applyZoom(ratio: Float) { + if (depthSize != null || portraitConfig != null || !resumed || paused || closing || cli.active != null || bursts.controlsLocked || + !(ready || recordingVideo) || stoppingRecording || cameraId.isEmpty() || !ratio.isFinite()) return + val range = zoomRange(manager, cameraId) + zoomRatio = ratio.coerceIn(range.first, range.second) + engine?.setZoom(zoomRatio) + zoomControl.setRatio(zoomRatio) +} + +internal fun MainActivity.updateCameraChoices() { + if (cameraId.isNotEmpty()) { + val range = zoomRange(manager, cameraId) + zoomRatio = zoomRatio.coerceIn(range.first, range.second) + } + engineButton.text = engineName + engineButton.contentDescription = "Current: $engineName; tap to switch to ${if (engineName == "Camera2") "CameraX" else "Camera2"}" + cameraShortcut.contentDescription = "Choose camera, current: ${cameraLabel(cameraId)}" + cameraShortcut.tooltipText = cameraShortcut.contentDescription + zoomControl.setChoices(if (cameraId.isEmpty()) listOf(1f) else zoomPresets(zoomRange(manager, cameraId)), zoomRatio) +} diff --git a/app/src/main/java/dev/halcamera/MainCliBridge.kt b/app/src/main/java/dev/halcamera/MainCliBridge.kt index fde7bf3a..f50d0759 100644 --- a/app/src/main/java/dev/halcamera/MainCliBridge.kt +++ b/app/src/main/java/dev/halcamera/MainCliBridge.kt @@ -33,6 +33,7 @@ internal fun MainActivity.createLiveCli(): LiveController = LiveController(cli, } captureFeedback.clearResult() depthSize = null + portraitConfig = null showCallbacks(false) val modeChanged = engineName != (command.engine ?: "Camera2") || videoMode != command.videoMode cameraId = requireNotNull(command.camera); engineName = command.engine ?: "Camera2" @@ -72,7 +73,7 @@ internal fun MainActivity.createLiveCli(): LiveController = LiveController(cli, updateMediaControls() } override fun tune(options: dev.halcamera.cli.CliOptions?, reset: Boolean): Map { - if (depthSize != null) throw dev.halcamera.cli.CliFailure("PREFLIGHT_FAILED", "Select Photo or Video before changing camera controls.") + if (depthSize != null || portraitConfig != null) throw dev.halcamera.cli.CliFailure("PREFLIGHT_FAILED", "Select standard Photo or Video before changing camera controls.") if ((!ready && !recordingVideo) || closing || stoppingRecording) throw dev.halcamera.cli.CliFailure("PREFLIGHT_FAILED", "Start preview or recording first") val requested = if (reset) LiveControls() else options!!.controls(controlBar.support, manualCapabilities, videoMode, controlBar.controls, pipUi.selected != null) val zoom = if (reset) 1f else options!!.values["zoom"]?.toFloat() ?: zoomRatio diff --git a/app/src/main/java/dev/halcamera/MainDepthBridge.kt b/app/src/main/java/dev/halcamera/MainDepthBridge.kt index 1d8d7f6f..1ce3bb1f 100644 --- a/app/src/main/java/dev/halcamera/MainDepthBridge.kt +++ b/app/src/main/java/dev/halcamera/MainDepthBridge.kt @@ -4,7 +4,6 @@ import android.graphics.Typeface import android.hardware.camera2.CameraCharacteristics import android.view.View import android.widget.FrameLayout -import android.widget.Toast import androidx.core.view.ViewCompat import dev.halcamera.camera.* import dev.halcamera.ui.* @@ -13,18 +12,41 @@ import dev.halcamera.ui.* internal fun MainActivity.chooseDepth() { if (!resumed || closing || cli.active != null || recordingVideo || stoppingRecording || mediaBusy() || pendingPermissionAction != null || cameraId.isEmpty()) return - val support = try { depthSupport(manager.getCameraCharacteristics(cameraId)) } catch (e: Exception) { - Toast.makeText(this, "Cannot read depth capabilities: ${e.message}", Toast.LENGTH_LONG).show(); return + val id = cameraId + io.execute { + val portrait = portraitSupport(manager, id) + val depth = runCatching { depthSupport(manager.getCameraCharacteristics(id)) }.getOrNull() + main.post { + if (!resumed || closing || cameraId != id || cli.active != null || mediaBusy() || recordingVideo || + stoppingRecording || pendingPermissionAction != null) return@post + val choices = listOf(LiveChoiceSheet.Choice("Off", "Return to Photo"), + LiveChoiceSheet.Choice("Portrait (Bokeh)", portraitConfig?.let { "Active · JPEG ${it.jpeg} · Change resolution" } + ?: if (portrait.available) "Manufacturer background blur · Photos" else portrait.unavailableReason.orEmpty(), portrait.available), + LiveChoiceSheet.Choice("Depth Map", depthSize?.let { "Active · DEPTH16 $it · Change resolution" } + ?: if (depth?.available == true) "View sensor DEPTH16 · No photo capture" else depth?.unavailableReason ?: "Cannot read Depth capabilities.", depth?.available == true)) + LiveChoiceSheet.show(this, "Depth · Portrait", choices, + if (depthSize == null && portraitConfig == null && !videoMode) 0 else -1) { index -> + if (!resumed || closing || cameraId != id || cli.active != null || mediaBusy() || recordingVideo || + stoppingRecording || pendingPermissionAction != null) return@show + when (index) { + 0 -> selectMode(false) + 1 -> choosePortrait(portrait) + 2 -> depth?.let { chooseDepthMap(it) } + } + } + } } +} + +private fun MainActivity.chooseDepthMap(support: DepthSupport) { + val id = cameraId val sizes = support.sizes.takeIf { support.available }.orEmpty() - val choices = listOf(LiveChoiceSheet.Choice("Off", "Return to Photo")) + - sizes.map { LiveChoiceSheet.Choice("DEPTH16 · $it", "Camera2 · Depth-only view") } + - if (support.available) emptyList() else listOf(LiveChoiceSheet.Choice("Depth unavailable", support.unavailableReason.orEmpty(), false)) - LiveChoiceSheet.show(this, "Depth map", choices, if (videoMode) -1 else sizes.indexOf(depthSize) + 1, + val choices = sizes.map { LiveChoiceSheet.Choice("DEPTH16 · $it", "Camera2 · Depth-only view") } + LiveChoiceSheet.show(this, "Depth Map", choices, if (ready) sizes.indexOf(depthSize) else -1, content = Look.text(this, "${support.colorSummary}\nNear: bright · Far: dark · Black: invalid\nView only; photos and video are disabled.", 12, Look.onDarkMuted)) { index -> - if (!resumed || closing || cli.active != null || recordingVideo || mediaBusy()) return@show - val chosen = if (index == 0) null else sizes.getOrNull(index - 1) ?: return@show - if (chosen == depthSize && !videoMode) { return@show } + if (!resumed || closing || cameraId != id || cli.active != null || recordingVideo || stoppingRecording || + pendingPermissionAction != null || mediaBusy()) return@show + val chosen = sizes.getOrNull(index) ?: return@show recorder.finish("depth_view_changed")?.let(::exportCliIncident) captureFeedback.clearResult() engineName = "Camera2" @@ -50,7 +72,7 @@ internal fun MainActivity.createDepthEngine(released: String?, status: (String, return DepthCameraEngine(manager, cameraId, size, thisSession, telemetry, released, { frame -> if (thisSession == sessionId && resumed && !closing && !paused) { view.bind(frame) - depthFrameArrived() + previewFrameArrived() } }, status) } @@ -58,12 +80,13 @@ internal fun MainActivity.createDepthEngine(released: String?, status: (String, internal fun MainActivity.updateDepthControls(callbacks: Boolean, topInset: Int, bottomInset: Int) { depthModeButton.isEnabled = resumed && !closing && !recordingVideo && bursts.run == null && !stoppingRecording && !mediaBusy() && cli.active == null && pendingPermissionAction == null && cameraId.isNotEmpty() - depthModeButton.isSelected = depthSize != null - depthModeButton.setTextColor(if (depthSize != null) Look.onDark else Look.onDarkMuted) - depthModeButton.setTypeface(null, if (depthSize != null) Typeface.BOLD else Typeface.NORMAL) + val selected = depthSize != null || portraitConfig != null + depthModeButton.isSelected = selected + depthModeButton.setTextColor(if (selected) Look.onDark else Look.onDarkMuted) + depthModeButton.setTypeface(null, if (selected) Typeface.BOLD else Typeface.NORMAL) depthModeButton.alpha = if (depthModeButton.isEnabled) 1f else .4f - depthModeButton.contentDescription = "Depth map: choose a DEPTH16 resolution or view availability" - ViewCompat.setStateDescription(depthModeButton, if (depthSize != null) "Selected" else "Not selected") + depthModeButton.contentDescription = "Depth and Portrait: choose manufacturer Bokeh photos or a sensor Depth map" + ViewCompat.setStateDescription(depthModeButton, if (selected) "Selected" else "Not selected") if (depthSize != null) { mediaButton.isEnabled = false mediaButton.contentDescription = "Depth view only: select Photo or Video to capture media" @@ -82,7 +105,7 @@ internal fun MainActivity.updateDepthControls(callbacks: Boolean, topInset: Int, internal fun MainActivity.selectMode(video: Boolean) { if (cli.active != null) return if (recordingVideo || stoppingRecording || closing || pendingPermissionAction != null || - mediaBusy() || (depthSize == null && (!ready || videoMode==video))) return + mediaBusy() || (depthSize == null && portraitConfig == null && (!ready || videoMode==video))) return pendingPermissionAction=null videoMode=video resetModeSettings() diff --git a/app/src/main/java/dev/halcamera/MainPortraitBridge.kt b/app/src/main/java/dev/halcamera/MainPortraitBridge.kt new file mode 100644 index 00000000..d5a840ef --- /dev/null +++ b/app/src/main/java/dev/halcamera/MainPortraitBridge.kt @@ -0,0 +1,51 @@ +package dev.halcamera + +import android.os.Build +import android.view.TextureView +import android.view.View +import android.widget.FrameLayout +import dev.halcamera.camera.* +import dev.halcamera.ui.* + +/** The Depth menu opens this OEM resolution picker. */ +internal fun MainActivity.choosePortrait(support: PortraitSupport) { + if (!resumed || closing || cli.active != null || recordingVideo || stoppingRecording || mediaBusy() || + pendingPermissionAction != null || cameraId.isEmpty()) return + val configs = support.jpegs.mapNotNull(support::config) + val id = cameraId + val choices = configs.map { LiveChoiceSheet.Choice("JPEG ${it.jpeg}", "Manufacturer Bokeh · Preview ${it.preview}") } + LiveChoiceSheet.show(this, "Portrait · Manufacturer Bokeh", choices, if (ready) configs.indexOf(portraitConfig) else -1, + content = Look.text(this, "Choose a JPEG resolution. Photos only; RAW, PIP and manual controls are unavailable.", 12, Look.onDarkMuted)) { index -> + if (!resumed || closing || cameraId != id || cli.active != null || recordingVideo || stoppingRecording || + pendingPermissionAction != null || mediaBusy()) return@show + val chosen = configs.getOrNull(index) ?: return@show + recorder.finish("portrait_changed")?.let(::exportCliIncident) + captureFeedback.clearResult() + engineName = "Camera2" + videoMode = false + resetModeSettings() + portraitConfig = chosen + paused = false + updateCameraChoices(); restartCamera() + } +} + +internal fun MainActivity.createPortraitEngine(released: String?, status: (String, Boolean) -> Unit): CameraEngine? { + if (Build.VERSION.SDK_INT < 31) { setStatus("Portrait requires Android 12 or newer.", false); return null } + val thisSession = sessionId + val view = TextureView(this) + previewHost.addView(view, FrameLayout.LayoutParams(-1, -1)) + return PortraitCameraEngine(this, view, cameraId, requireNotNull(portraitConfig), sessionId, telemetry, released, + { if (thisSession == sessionId && resumed && !closing && !paused) previewFrameArrived() }, status) +} + +internal fun MainActivity.updatePortraitControls() { + if (portraitConfig == null) return + liveIndicator.bindStabilization(LiveEisStatus(0), false) + physicalPipButton.isEnabled = false; physicalPipButton.alpha = .4f + zoomControl.isEnabled = false + controlBar.bind(false, false, false) + manualPanel.close() + metrics.visibility = View.GONE + mediaButton.contentDescription = if (mediaBusy()) "Saving Portrait photo" else "Take a manufacturer Portrait photo" +} diff --git a/app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt b/app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt index 5da08af7..621409ea 100644 --- a/app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt +++ b/app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt @@ -88,6 +88,7 @@ class CameraProbeReader(private val manager: CameraManager, private val extraDev sections += guarded("Identity") { identity(id, physicalOf, c) } sections += guarded("Capabilities") { capabilities(c) } sections += guarded("Depth") { depthSupport(c).probeRows(physicalOf == null) } + sections += guarded("Portrait · Manufacturer Bokeh") { portraitSupport(manager, id, physicalOf == null).probeRows() } sections += guarded("Sensor") { sensor(c) } sections += guarded("Lens") { lens(c) } sections += guarded("Control") { control(c) } diff --git a/app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt b/app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt new file mode 100644 index 00000000..48794344 --- /dev/null +++ b/app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt @@ -0,0 +1,267 @@ +package dev.halcamera.camera + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.ImageFormat +import android.graphics.SurfaceTexture +import android.hardware.camera2.* +import android.hardware.camera2.params.ExtensionSessionConfiguration +import android.hardware.camera2.params.OutputConfiguration +import android.media.ImageReader +import android.os.* +import android.view.Surface +import android.view.TextureView +import androidx.annotation.RequiresApi +import dev.halcamera.telemetry.Telemetry +import java.util.UUID +import java.util.concurrent.Executor +import java.util.concurrent.Executors +import java.util.concurrent.atomic.AtomicBoolean + +/** LIVE-only OEM Bokeh session: one preview, one JPEG, no benchmark or manual-control contract. */ +@RequiresApi(31) +class PortraitCameraEngine( + context: Context, + private val view: TextureView, + private val cameraId: String, + private val config: PortraitConfig, + private val sessionId: String, + private val telemetry: Telemetry, + private val releasedCameraId: String?, + private val frame: () -> Unit, + private val status: (String, Boolean) -> Unit, +) : CameraEngine, MediaCapture { + private val manager = context.getSystemService(CameraManager::class.java) + private val library = MediaLibrary(context) + private val thread = HandlerThread("HAL-portrait").apply { start() } + private val handler = Handler(thread.looper) + private val main = Handler(Looper.getMainLooper()) + private val executor = Executor { handler.post(it) } + private val io = Executors.newSingleThreadExecutor() + private val busy = AtomicBoolean(false) + override val mediaBusy get() = busy.get() + @Volatile private var active = true + @Volatile private var firstFrame = false + private var opening = false + private var finished = false + private var device: CameraDevice? = null + private var session: CameraExtensionSession? = null + private var reader: ImageReader? = null + private var surface: Surface? = null + private var availability: CameraManager.AvailabilityCallback? = null + private val closers = mutableListOf<() -> Unit>() + private class Photo(val id: String, val done: (Result) -> Unit) { + val delivered = AtomicBoolean(false) + } + private var pending: Photo? = null + private val openAfterRelease = Runnable { stopWaiting(); open() } + private val firstTimeout = Runnable { if (active && !firstFrame) fail("No Portrait preview frames within 15 seconds.") } + private val captureTimeout = Runnable { if (pending != null) fail("Portrait capture timed out after 60 seconds. Select Photo to retry.") } + + override fun start() { + main.post { + if (!active) return@post + view.surfaceTextureListener = object : TextureView.SurfaceTextureListener { + override fun onSurfaceTextureAvailable(texture: SurfaceTexture, width: Int, height: Int) = prepare(texture) + override fun onSurfaceTextureSizeChanged(texture: SurfaceTexture, width: Int, height: Int) = fit() + override fun onSurfaceTextureUpdated(texture: SurfaceTexture) { + if (!active) return + firstFrame = true + frame() + } + override fun onSurfaceTextureDestroyed(texture: SurfaceTexture): Boolean { + handler.post { if (active) fail("Portrait preview surface closed.") } + return true + } + } + view.surfaceTexture?.let(::prepare) + } + } + + private fun fit() = view.fitPreview(android.util.Size(config.preview.width, config.preview.height)) + private fun prepare(texture: SurfaceTexture) { + texture.setDefaultBufferSize(config.preview.width, config.preview.height) + fit() + handler.post { + if (!active || surface != null) return@post + try { + val support = portraitSupport(manager, cameraId) + require(support.available && config.preview in support.previews && config.jpeg in support.jpegs) { + support.unavailableReason ?: "Unsupported Portrait resolutions." + } + surface = Surface(texture) + telemetry.registerSession(sessionId, "Camera2 · Portrait", manager, cameraId) + if (releasedCameraId != null && releasedCameraId in manager.cameraIdList) { + availability = object : CameraManager.AvailabilityCallback() { + override fun onCameraAvailable(id: String) { + if (id == releasedCameraId && availability != null) openAfterRelease.run() + } + }.also { manager.registerAvailabilityCallback(it, handler) } + handler.postDelayed(openAfterRelease, CameraReleaseWait.LIMIT_MS) + } else open() + } catch (e: Exception) { fail(e.message ?: "Portrait unavailable") } + } + } + + @SuppressLint("MissingPermission") + private fun open() { + if (!active || opening || device != null) return + try { + opening = true + telemetry.event(sessionId, "open_call") + manager.openCamera(cameraId, object : CameraDevice.StateCallback() { + override fun onOpened(camera: CameraDevice) { + opening = false; device = camera + if (!active) camera.close() else configure(camera) + } + override fun onDisconnected(camera: CameraDevice) = lost(camera, "Portrait camera disconnected") + override fun onError(camera: CameraDevice, error: Int) = lost(camera, "Portrait camera error $error") + private fun lost(camera: CameraDevice, reason: String) { + opening = false; device = camera + if (active) fail(reason) else camera.close() + } + override fun onClosed(camera: CameraDevice) { + if (device === camera) device = null + finishClose() + } + }, handler) + } catch (e: Exception) { opening = false; fail("Cannot open Portrait camera: ${e.message}") } + } + + private fun configure(camera: CameraDevice) { + try { + val output = ImageReader.newInstance(config.jpeg.width, config.jpeg.height, ImageFormat.JPEG, 2) + reader = output + output.setOnImageAvailableListener({ source -> + try { + source.acquireNextImage()?.use { image -> + val photo = pending ?: return@use + if (!active) return@use + val buffer = image.planes[0].buffer + val bytes = ByteArray(buffer.remaining()).also { buffer.get(it) } + val timestamp = image.timestamp + telemetry.image(sessionId, timestamp, image.width, image.height, image.format, "portrait_jpeg") + pending = null + handler.removeCallbacks(captureTimeout) + io.execute { + val result = runCatching { + val files = library.saveCapture(library.name(), null, bytes, mapOf( + "requestId" to photo.id, "cameraId" to cameraId, "engine" to "Camera2", + "effect" to "manufacturer_bokeh", "jpegSource" to "OEM_BOKEH", + "previewSize" to config.preview.toString(), "jpegSize" to config.jpeg.toString(), + "sensorTimestamp" to timestamp, "correlation" to "One extension capture in flight; OEM processed JPEG")) + PhotoResult(photo.id, files.first().name, timestamp, files.map { it.uri }, files) + } + deliver(photo, result) + main.post { if (active) status(result.fold({ "Saved Portrait JPEG" }, { "Portrait save failed: ${it.message}" }), true) } + } + } + } catch (e: Exception) { if (active) fail("Portrait JPEG failed: ${e.message}") } + }, handler) + val outputs = listOf(OutputConfiguration(requireNotNull(surface)), OutputConfiguration(output.surface)) + camera.createExtensionSession(ExtensionSessionConfiguration(CameraExtensionCharacteristics.EXTENSION_BOKEH, outputs, executor, + object : CameraExtensionSession.StateCallback() { + override fun onConfigured(value: CameraExtensionSession) { + if (!active || device !== camera) { value.close(); return } + session = value + try { + val request = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { + addTarget(requireNotNull(surface)); setTag("portrait_preview") + }.build() + value.setRepeatingRequest(request, executor, object : CameraExtensionSession.ExtensionCaptureCallback() { + override fun onCaptureFailed(s: CameraExtensionSession, r: CaptureRequest) { + if (active) fail("The manufacturer rejected the Portrait preview.") + } + }) + telemetry.sessions.computeIfPresent(sessionId) { _, old -> old + mapOf("negotiatedStreams" to mapOf( + "preview" to config.preview.toString(), "jpeg" to config.jpeg.toString(), "portrait" to "Manufacturer Bokeh")) } + main.post { if (active) status("Portrait · Manufacturer Bokeh · LIVE", true) } + handler.postDelayed(firstTimeout, 15000) + } catch (e: Exception) { fail("Portrait preview failed: ${e.message}") } + } + override fun onConfigureFailed(value: CameraExtensionSession) { + runCatching { value.close() } + if (active) fail("The manufacturer rejected Portrait at P ${config.preview} / JPEG ${config.jpeg}. Select another resolution or Photo.") + } + })) + } catch (e: Exception) { fail("Portrait session failed: ${e.message}") } + } + + override fun capture() = capturePhoto(UUID.randomUUID().toString()) { } + override fun capturePhoto(requestId: String, done: (Result) -> Unit) { + if (!active || !firstFrame || !busy.compareAndSet(false, true)) { + main.post { done(Result.failure(IllegalStateException("Portrait camera not ready or busy"))) }; return + } + @Suppress("DEPRECATION") + val displayRotation = view.display?.rotation ?: Surface.ROTATION_0 + val photo = Photo(requestId, done) + if (!handler.post { + pending = photo + try { + check(active) { "Portrait camera closed" } + val camera = requireNotNull(device) + val chars = manager.getCameraCharacteristics(cameraId) + val degrees = displayRotation * 90 + val sensor = chars[CameraCharacteristics.SENSOR_ORIENTATION] ?: 0 + val front = chars[CameraCharacteristics.LENS_FACING] == CameraCharacteristics.LENS_FACING_FRONT + val orientation = (sensor + if (front) degrees else -degrees + 360) % 360 + val request = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply { + addTarget(requireNotNull(reader).surface); setTag(photo.id) + set(CaptureRequest.JPEG_ORIENTATION, orientation) + }.build() + telemetry.event(sessionId, "portrait_capture_submit", mapOf("requestId" to photo.id, "jpegOrientation" to orientation)) + main.post { if (active) status("Capturing Portrait…", false) } + handler.postDelayed(captureTimeout, 60000) + requireNotNull(session).capture(request, executor, object : CameraExtensionSession.ExtensionCaptureCallback() { + override fun onCaptureStarted(s: CameraExtensionSession, r: CaptureRequest, timestamp: Long) { + if (active) telemetry.event(sessionId, "portrait_capture_started", mapOf("requestId" to photo.id, "sensorTimestamp" to timestamp)) + } + override fun onCaptureFailed(s: CameraExtensionSession, r: CaptureRequest) { + if (pending === photo) fail("Manufacturer Portrait capture failed. Select Photo to retry.") + } + override fun onCaptureSequenceAborted(s: CameraExtensionSession, sequenceId: Int) { + if (pending === photo) fail("Manufacturer Portrait capture aborted. Select Photo to retry.") + } + }) + } catch (e: Exception) { fail("Portrait capture failed: ${e.message}") } + }) deliver(photo, Result.failure(IllegalStateException("Portrait camera closed"))) + } + + private fun deliver(photo: Photo, result: Result) { + if (photo.delivered.compareAndSet(false, true)) main.post { busy.set(false); photo.done(result) } + } + override fun setZoom(ratio: Float) = Unit + override fun startRecording(audio: Boolean, started: () -> Unit, done: ((Result) -> Unit)?) { + main.post { done?.invoke(Result.failure(IllegalStateException("Manufacturer Portrait supports photos only."))) } + } + override fun stopRecording() = Unit + override fun close(done: () -> Unit) { + active = false + if (!handler.post { if (finished) main.post(done) else { closers += done; release() } }) main.post(done) + } + private fun fail(reason: String) { + active = false + telemetry.event(sessionId, "portrait_failed", mapOf("reason" to reason)) + main.post { status(reason, false) } + release() + } + private fun stopWaiting() { + handler.removeCallbacks(openAfterRelease) + availability?.let { manager.unregisterAvailabilityCallback(it) }; availability = null + } + private fun release() { + stopWaiting(); handler.removeCallbacks(firstTimeout); handler.removeCallbacks(captureTimeout) + pending?.let { deliver(it, Result.failure(IllegalStateException("Portrait closed before JPEG arrived"))) }; pending = null + runCatching { session?.close() }; session = null + if (device != null) device?.close() else if (!opening) finishClose() + } + private fun finishClose() { + if (device != null || opening || finished) return + finished = true + reader?.close(); reader = null + surface?.release(); surface = null + val callbacks = closers.toList().also { closers.clear() } + main.post { view.surfaceTextureListener = null; callbacks.forEach { it() } } + io.shutdown(); thread.quitSafely() + } +} diff --git a/app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt b/app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt new file mode 100644 index 00000000..7c843f44 --- /dev/null +++ b/app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt @@ -0,0 +1,26 @@ +package dev.halcamera.camera + +import android.graphics.ImageFormat +import android.graphics.SurfaceTexture +import android.hardware.camera2.CameraExtensionCharacteristics +import android.hardware.camera2.CameraManager +import android.os.Build + +fun portraitSupport(manager: CameraManager, id: String, publicCamera: Boolean = true): PortraitSupport { + if (!publicCamera) return PortraitSupport(null, reason = "Physical camera: select a publicly listed camera ID in LIVE") + if (Build.VERSION.SDK_INT < 31) return PortraitSupport(null, reason = "Camera2 Portrait requires Android 12 / API 31 or newer.") + val errors = mutableListOf() + fun read(label: String, block: () -> T): T? = try { block() } catch (e: Exception) { + errors += "$label: ${e.javaClass.simpleName}: ${e.message}"; null + } + val extension = read("Bokeh characteristics") { manager.getCameraExtensionCharacteristics(id) } + val mode = CameraExtensionCharacteristics.EXTENSION_BOKEH + val advertised = read("Supported extensions") { extension?.supportedExtensions?.contains(mode) } + fun sizes(label: String, block: () -> List?): List = + if (advertised != true) emptyList() else read(label) { + block().orEmpty().map { LiveSize(it.width, it.height) }.distinct().sortedBy { it.width.toLong() * it.height } + }.orEmpty() + return PortraitSupport(advertised, + sizes("Bokeh preview sizes") { extension?.getExtensionSupportedSizes(mode, SurfaceTexture::class.java) }, + sizes("Bokeh JPEG sizes") { extension?.getExtensionSupportedSizes(mode, ImageFormat.JPEG) }, errors = errors) +} diff --git a/app/src/main/java/dev/halcamera/camera/PortraitSupport.kt b/app/src/main/java/dev/halcamera/camera/PortraitSupport.kt new file mode 100644 index 00000000..d2b678cc --- /dev/null +++ b/app/src/main/java/dev/halcamera/camera/PortraitSupport.kt @@ -0,0 +1,40 @@ +package dev.halcamera.camera + +import java.io.Serializable +import kotlin.math.abs + +data class PortraitConfig(val preview: LiveSize, val jpeg: LiveSize) : Serializable + +/** Manufacturer declarations; a listed size pair still needs session validation. */ +data class PortraitSupport( + val advertised: Boolean?, + val previews: List = emptyList(), + val jpegs: List = emptyList(), + val reason: String? = null, + val errors: List = emptyList(), +) { + val available get() = reason == null && advertised == true && previews.isNotEmpty() && jpegs.isNotEmpty() + val unavailableReason get() = reason ?: when { + advertised == null -> "Manufacturer Bokeh capability could not be read." + !advertised -> "This camera does not advertise the BOKEH extension." + previews.isEmpty() -> "No readable Bokeh preview resolutions." + jpegs.isEmpty() -> "No readable Bokeh JPEG resolutions." + else -> null + } + + /** A visible initial pairing, never a retry fallback. Prefer matching aspect and a ~1080p preview. */ + fun config(jpeg: LiveSize): PortraitConfig? { + if (!available || jpeg !in jpegs) return null + val ratio = jpeg.width.toDouble() / jpeg.height + val preview = previews.minWithOrNull(compareBy { abs(it.width.toDouble() / it.height - ratio) } + .thenBy { abs(it.width.toLong() * it.height - 1920L * 1080) }) ?: return null + return PortraitConfig(preview, jpeg) + } + + fun probeRows(): List = listOf( + ProbeRow("Manufacturer BOKEH", when (advertised) { true -> "Supported"; false -> "Not supported"; null -> "Unknown" }), + ProbeRow("Bokeh preview resolutions", previews.joinToString().ifEmpty { "None reported" }), + ProbeRow("Bokeh JPEG resolutions", jpegs.joinToString().ifEmpty { "None reported" }), + ProbeRow("LIVE Portrait", if (available) "Photo only; size combination must still be checked" else unavailableReason.orEmpty()), + ) + errors.map { ProbeRow("Read error", it) } +} diff --git a/app/src/main/java/dev/halcamera/ui/LiveIndicator.kt b/app/src/main/java/dev/halcamera/ui/LiveIndicator.kt index 1ea58d78..218318c3 100644 --- a/app/src/main/java/dev/halcamera/ui/LiveIndicator.kt +++ b/app/src/main/java/dev/halcamera/ui/LiveIndicator.kt @@ -98,7 +98,8 @@ class LiveIndicator(context: Context) : LinearLayout(context) { eis.setTextColor(if (status.warning != null) Look.statusWarn else Look.onDarkMuted) } - fun bindSizes(streams: Map<*, *>?) = bindSizes(LiveStreamReadout.from(streams)) + fun bindSizes(streams: Map<*, *>?) = bindSizes(LiveStreamReadout.from(streams), + if (streams?.get("portrait") != null) "open Depth and Portrait" else "open Live Streams") internal fun bindSizes(value: LiveStreamReadout, action: String = "open Live Streams", selectedLine: Int? = null) { sizes.maxLines = maxOf(2,value.text.count { it == '\n' }+1) diff --git a/app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt b/app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt index 976ee52a..96cebd17 100644 --- a/app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt +++ b/app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt @@ -25,7 +25,9 @@ internal data class LiveStreamReadout(val text: String, val description: String) val description = active.joinToString(", ") { (label, size) -> "${label.name}${if (label.key == "recording") " $format" else ""} $size" } - return LiveStreamReadout(text, description) + val portrait = value("portrait") + return LiveStreamReadout(if (portrait != null) "Portrait · $text" else text, + if (portrait != null) "$portrait, $description" else description) } /** Multi: one line per camera, numbered like its Split name bar. */ diff --git a/app/src/test/java/dev/halcamera/camera/PortraitSupportTest.kt b/app/src/test/java/dev/halcamera/camera/PortraitSupportTest.kt new file mode 100644 index 00000000..595fedc6 --- /dev/null +++ b/app/src/test/java/dev/halcamera/camera/PortraitSupportTest.kt @@ -0,0 +1,42 @@ +package dev.halcamera.camera + +import org.junit.Assert.* +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class PortraitSupportTest { + private val preview = LiveSize(1440, 1080) + private val jpeg = LiveSize(4000, 3000) + + @Test fun `declared support also requires both extension output types`() { + assertFalse(PortraitSupport(null, listOf(preview), listOf(jpeg)).available) + assertFalse(PortraitSupport(false, listOf(preview), listOf(jpeg)).available) + assertFalse(PortraitSupport(true, emptyList(), listOf(jpeg)).available) + assertFalse(PortraitSupport(true, listOf(preview)).available) + assertFalse(PortraitSupport(true, listOf(preview), listOf(jpeg), "Not a public camera").available) + assertTrue(PortraitSupport(true, listOf(preview), listOf(jpeg)).available) + } + + @Test fun `initial pair matches aspect before closeness to preview target and never invents sizes`() { + val wide = LiveSize(1920, 1080) + val support = PortraitSupport(true, listOf(wide, preview, LiveSize(640, 480)), listOf(jpeg)) + assertEquals(PortraitConfig(preview, jpeg), support.config(jpeg)) + assertNull(support.config(wide)) + assertNull(support.copy(advertised = false).config(jpeg)) + assertEquals(preview, support.copy(previews = listOf(preview)).config(jpeg)?.preview) + } + + @Test fun `exports preserve unknown errors and extension resolutions without claiming verified combinations`() { + val support = PortraitSupport(true, listOf(preview), listOf(jpeg), errors = listOf("vendor metadata incomplete")) + val snapshot = CameraProbeSnapshot("now", emptyList(), listOf(CameraProbeEntry("0", null, "Camera 0", + listOf(ProbeSection("Portrait", support.probeRows())))), emptyList()) + val text = CameraProbeText.render(snapshot) + assertTrue(text.contains("1440x1080")); assertTrue(text.contains("4000x3000")) + assertTrue(text.contains("combination must still be checked")) + assertTrue(snapshot.toJsonMap().toString().contains("vendor metadata incomplete")) + assertEquals("Unknown", PortraitSupport(null).probeRows().first().value) + assertTrue(PortraitSupport(true, listOf(preview)).unavailableReason!!.contains("JPEG")) + } +} diff --git a/app/src/test/java/dev/halcamera/ui/LiveStreamReadoutTest.kt b/app/src/test/java/dev/halcamera/ui/LiveStreamReadoutTest.kt index 643e1cdf..95033455 100644 --- a/app/src/test/java/dev/halcamera/ui/LiveStreamReadoutTest.kt +++ b/app/src/test/java/dev/halcamera/ui/LiveStreamReadoutTest.kt @@ -4,6 +4,11 @@ import org.junit.Assert.* import org.junit.Test class LiveStreamReadoutTest { + @Test fun portraitNamesTheManufacturerEffectAndItsActualStreams() { + val readout = LiveStreamReadout.from(mapOf("portrait" to "Manufacturer Bokeh", "preview" to "1440x1080", "jpeg" to "4000x3000")) + assertEquals("Portrait · P 1440×1080 J 4000×3000", readout.text) + assertEquals("Manufacturer Bokeh, Preview 1440x1080, JPEG 4000x3000", readout.description) + } @Test fun depthOnlyDoesNotInventColorOutputs() { assertEquals(LiveStreamReadout("Depth 320×240", "Depth 320x240"), LiveStreamReadout.from(mapOf("depth" to "320x240"))) diff --git a/docs/design/APP-UI.md b/docs/design/APP-UI.md index 13508f48..bd26796c 100644 --- a/docs/design/APP-UI.md +++ b/docs/design/APP-UI.md @@ -22,11 +22,11 @@ AEB가 꺼져 있을 때 셔터를 길게 누르면 연사하고 손을 떼면 셔터 위에는 `AEB 0/3`, `Burst · 2`, `HDR…`처럼 현재 상태만 표시합니다. 결과는 같은 자리에 기본 5초 동안 표시하고 접근성 시간 연장 설정을 따릅니다. 상태 변화로 셔터 위치가 움직이지 않도록 한 줄 높이를 확보하며 긴 실패 이유는 줄바꿈합니다. TalkBack은 `Start burst` 동작과 `Stop burst` 셔터로 연사를 조작합니다. 합성 중 다음 AEB는 시작하지 않습니다. -## Live Depth +## Live Depth · Portrait -Live 하단의 Depth는 Camera2의 DEPTH16 해상도 선택창을 엽니다. 미지원 카메라는 이유를 표시합니다. 선택한 맵은 잘라내지 않고 표시하며 가까운 곳은 밝게, 먼 곳은 어둡게, 거리 0 또는 신뢰도 50% 미만은 검게 표시합니다. 중앙 거리와 표시 표본의 유효 비율도 읽을 수 있어야 합니다. +Live 하단의 Depth는 Off·Portrait (Bokeh)·Depth Map을 고르는 메뉴를 엽니다. 제조사 Bokeh와 센서 Depth 맵의 지원 여부를 따로 표시하고 미지원·읽기 실패의 이유를 보여줍니다. Depth Map은 DEPTH16 해상도를 선택하며 가까운 곳은 밝게, 먼 곳은 어둡게, 거리 0 또는 신뢰도 50% 미만은 검게 표시합니다. 중앙 거리와 표시 표본의 유효 비율도 읽을 수 있어야 합니다. -Depth에서는 촬영·녹화·PIP·줌·수동 제어·터치 측광을 비활성화합니다. Photo·Video로 돌아가거나 Depth에서 Off를 선택해 컬러 보기로 복귀합니다. 세션 실패 뒤에도 복귀 동작을 사용할 수 있어야 합니다. +Depth Map에서는 촬영·녹화·PIP·줌·수동 제어·터치 측광을 비활성화합니다. Portrait는 제조사 BOKEH 전용 미리보기·JPEG 크기를 선택한 뒤 사진 셔터를 제공합니다. Portrait에서도 녹화·RAW·연사·AEB·PIP·줌·수동 제어·터치 측광은 제공하지 않습니다. 활성 상태는 Depth 버튼과 크기 표시에 표시하며 EIS·일반 콜백 지표를 숨깁니다. Photo·Video나 Depth의 Off로 일반 컬러 촬영에 복귀합니다. 세션 실패 뒤에도 복귀와 해상도 재선택을 허용합니다. ## Lab과 기기 식별 @@ -169,7 +169,7 @@ Live의 카메라 선택창은 아래쪽 조작부를 숨기고 위쪽을 흐리 Live 프리뷰에서 두 손가락을 벌리거나 모으면 지원 범위 안에서 연속으로 줌을 바꿉니다. 가장 가까운 프리셋의 원에 현재 배율을 소수 첫째 자리까지 표시하며, 펼친 상태에서 그 원을 누르면 해당 프리셋 배율로 돌아갑니다. 화면의 카메라 선택 정보를 갱신해도 중간 배율은 유지합니다. -핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. +핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기·제조사 Portrait, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. | 조건 | 동작 | | --- | --- | diff --git a/docs/validation/portrait-20261020/README.md b/docs/validation/portrait-20261020/README.md new file mode 100644 index 00000000..a27fd0cd --- /dev/null +++ b/docs/validation/portrait-20261020/README.md @@ -0,0 +1,44 @@ +# 제조사 Bokeh Portrait 검증 + +2026-10-20에 Samsung SM-S936N, Android 16 / API 36에서 제조사 BOKEH 확장 조회와 촬영을 검증했습니다. 앱 0.30.0(691)을 서명이 일치하는 빌드로 갱신했으며 기존 앱 데이터를 삭제하지 않았습니다. + +## 확인한 동작 + +PROBE는 공개 카메라 0·1·2·3에서 BOKEH 지원과 확장 전용 미리보기·JPEG 크기를 보고했습니다. 물리 카메라 5·6은 독립적으로 선택할 수 없다는 이유를 표시했습니다. [PROBE 발췌](probe-summary.json)에 각 카메라의 전체 크기 목록이 있습니다. + +PROBE 요청 `dd81ce3e-9c78-4537-a7f6-f8034c9a06b7`는 오류 없이 완료됐습니다. 원본 JSON 371,945바이트와 TXT 264,439바이트를 PC로 수집하고 manifest 해시와 대조했습니다. SHA-256은 JSON `9d325cc099c776e4a3aea92bdd7865ce9cc5baee5e25fe3d875411b13835c137`, TXT `1acc4521cca0a0c4fad46e41dd591b440bf2c943b1de14da52732c758edc8757`입니다. + +최종 APK의 `portrait_checks=true` instrumentation은 아래 17개 항목을 통과했습니다. [실측 결과](portrait-checks.json)에는 JPEG 바이트 수·해시·실제 크기·EXIF 방향·효과 메타데이터가 있습니다. 사진 픽셀은 저장소에 포함하지 않습니다. + +| 공개 카메라 ID | 미리보기 | 확인한 JPEG 구성 | 실제 저장한 JPEG | EXIF 방향 | +| --- | --- | --- | --- | --- | +| 0 | 1440×1080 | 640×480, 4080×3060 | 4080×3060 | 6 | +| 1 | 1440×1080 | 640×480, 4000×3000 | 4000×3000 | 8 | +| 2 | 1440×1080 | 640×480, 4000×3000 | 4000×3000 | 6 | +| 3 | 1440×1080 | 640×480, 3392×2544 | 3392×2544 | 8 | + +각 카메라에서 두 크기로 프리뷰를 준비하고 큰 크기의 JPEG를 한 장 저장한 뒤 일반 Photo로 복귀했습니다. 세 번 재열기와 열기 도중 종료도 통과했습니다. 처음 수동으로 확인한 카메라 0의 1280×720 JPEG 촬영도 성공했습니다. + +`portrait_ui=true`는 `Depth → Portrait (Bokeh) → JPEG 640×480`, Depth 버튼 선택, 셔터 활성화, 줌 비활성화, Photo·Video·Off 복귀를 통과했습니다. 아래 화면은 실기기 앱의 View를 렌더링한 검증 자료입니다. 카메라 미리보기와 최근 사진 썸네일은 숨겼고 시스템 알림은 포함하지 않았습니다. + +| 메뉴 | 해상도 선택 | Portrait 실행 | +| --- | --- | --- | +| ![Depth 메뉴](depth-portrait-menu.png) | ![JPEG 해상도 선택](portrait-resolutions.png) | ![Portrait LIVE](live-portrait.png) | + +재설치 직후 실행한 UI 검사 한 번에서는 카메라 0의 BOKEH 지원 조회가 false여서 진입 검사가 실패했습니다. 추가 코드 수정이나 앱 재설치 없이 다시 실행한 UI 검사와 최종 17개 촬영 검사는 모두 통과했습니다. 원인은 확정하지 못했습니다. 앱은 미지원 응답을 지원으로 바꾸지 않으며 Depth 메뉴를 다시 열 때 현재 지원 여부를 새로 조회합니다. + +## Depth 이미지와 품질 검증의 범위 + +이 기기의 공개 Camera2 카메라는 DEPTH_OUTPUT·DEPTH16 출력을 제공하지 않았습니다. [BOKEH의 DEPTH_JPEG 조회](portrait-depth-metadata.json)도 공개 ID 0·1·2·3 모두 빈 목록이며 읽기 오류는 없었습니다. 별도로 검사한 Bokeh JPEG에는 표준 XMP/GDepth/DynamicDepth 표식이 없었습니다. 이번 구현은 제조사가 처리한 컬러 JPEG를 저장하며 센서 Depth 맵을 추출하지 않습니다. 제조사 전용 SDK의 가능성은 확인하지 않았습니다. + +모든 광고 해상도 조합, API 31~35, 다른 제조사, 장시간 실행, 강제 60초 타임아웃은 검증하지 않았습니다. 이번 사진은 저장 경로와 크기·방향을 확인한 자료이며 인물·머리카락 경계의 흐림 품질을 판정한 자료가 아닙니다. + +## 자동 검사와 변경사항 리뷰 + +실기기 검사는 `CliStoreInstrumentation`에 `portrait_checks=true`, `portrait_ui=true`, `portrait_metadata=true`를 각각 전달해 실행합니다. 이 로컬 검증 APK의 testApplicationId는 `dev.halcamera.depthchecks`입니다. 촬영 검사는 일반 MediaLibrary에 실제 사진을 저장합니다. + +앱 JVM 테스트 911개, `lintDebug`(오류·경고 없음), `assembleDebug`, `assembleDebugAndroidTest`가 통과했습니다. 문서 회귀 검사 37개가 통과했습니다. + +지원 선언과 Unknown·읽기 오류 구분, 확장 전용 크기 선택, close(done) 순서, 늦은 JPEG 차단, 한 번뿐인 촬영 완료, 실패 후 Photo 복귀, 저장 중 전환 방지, CLI 초기화, 일반 Live Streams 및 Benchmark 경계를 코드에 대조했습니다. 문서에는 Depth 메뉴 진입 경로, 확장 전용 JPEG 저장과 제어 제한, 수명주기·데이터 흐름을 반영했습니다. 이 기록은 사용자 요청에 따른 Codex의 코드 대조이며 별도 사람의 독립 리뷰를 뜻하지 않습니다. + +사용 방법은 [Live 가이드](../../../guide/live.md#제조사-portrait로-배경을-흐리세요)를 참고하세요. diff --git a/docs/validation/portrait-20261020/depth-portrait-menu.png b/docs/validation/portrait-20261020/depth-portrait-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..dd32d387e6b8f6c0b8a6cb24e739a8573f9c6cb9 GIT binary patch literal 118236 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 literal 0 HcmV?d00001 diff --git a/docs/validation/portrait-20261020/live-portrait.png b/docs/validation/portrait-20261020/live-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..4c7b67c36dbcc8b8b76dace870a11d530368406a GIT binary patch literal 83564 zcmeFZXIPVI*ENjet?n^sv;m=Md=Xfos0^J z(n3wBL5UC`6aypy0?E5C@8@~H-|x@wIL1FfOu4S}+{wSXW0@xO4zm@WtyUzwK=SUu@g`C@8`eJ^j!4RwLgr0{c-hp;_ts-+tby0ozFe+gO6X+ z)6fL!>nS;bBd4VKT*vMbw<9N7cc!o%Zwvr(Y&=Wje(Y5(c@`P;F>caiJo`SZ7J z3O^sX^6RT@$S;3i;Ms@#{Ok8$T#=tV&-eee9r^k6A&)Tf^X{>K-{Rl3_%|*f75>eU zfAIo=#DB5#-#P+e@c&R#hjNE@Ad$oHpLrdHdwTey-^OAcCBdS~)#yBNX{g*W)4y9) zHG)rT?Ph1TW}^Wui6A$X)Xk;arv9wLSFa_CYfh$nlzo{En@)3?6a8~(ej`f_)ozU@ zH-+4PoAveO@)as~txS){_O@+9z!T0E8-FWG?4Z|3)f2N)t2SJ`h~r?9X}RZcMess3 zX|kT09b4@|I@oA3RMrx~zMP{K@y50>u(!r*bZsDCOQ6^slaMTBj-z3);{AF0u`w|* z4ynKK@ZfIoT>tBrnIkg;g~pj-i}iB1KR=!6&DDL8oa_~}zE4D{wKGkg@#z-@EE2OSF+MGWKGvqwk{1Wnf1a_DT|J2|*Z zwNmT(k!^Qz1eLufclcnp0;{}613PF@;-M!mCx}|M#@wX-_G(W-$jY?uuv2OqT(cvl znOU?F+Lf*to13VmmY}sUvqn!ui}Go%UbjJSG35NGJ0A{S=;GD*@sE&tpyysOH3h3` zcT*}OUD4y9{YGD^L(i-8av{s#>wbLPgRJgvQtw*Qm3{1%_A4KGqZ513nlt`RFLh?H z*!+xD)k!;e&$X`)_~x3joV(Je=CN-5c__Quq3Z2C@u|K-*RPJ$cxCuMAmM%b?%ge%vinueB)9JeS?O<7h_ti=AX}%yztn?vwSFO z+h258n44e!x#tTDdI`45V{>C}u$VF)G!YL0`6sc=Rz%vWDw*&in{ySXo{tBPO1J!YB-@&=#V8D3tf$7<8Z^J~Tj2Re8@V#dpLY#Pf|kgN zEwc~~*%8d)mkMq-#?aiY^2n_XVUo{8O9ZklJNF6yftNssS9uPf%MM?@BEf!h5*K&q zK%ypdC`FkvI5s!Y6|O#QLN7WSf5ZF%_m^2@WgE?j$g_OM#O%zi<; z;9Hvza@S1Hd6FQZDCDrE_SZZe3!3Dn=avB^ScFD;y=ep%*nax+c`u=krj@~u+ zj@Rb+l5O6Y+ee_9)~7RcihdQ2(iIOmhVg+H%Un4AwhC^}qAA$dz#j0=Bm7S%N8|SD zPi1qE!3pY%bw{nLT+82KoH|l`saZj|5NeirYx~^v<_aOvp1VO(Bw`u1ng1|<#)Kp9 z%zu7{sCbyC!NlrpKZR)RBYi`M9}qVl!5&_-ls6@IEtNdrRXe$Juh4!mwSeem7Fiu)Sg<2iHc{1ox|NcsoxK?>7C3aP zH{USFl~iUMzVev=+`I4X z6(q_-8FKmN&(tYi`^ zDQENTR}}Kv%W*>dTWnV113sXmC0yn zjBLx=J@@r((e9q&z!fpNR(pW1e?s7gh-v3mb0k$bGnwL zrie=r6M^j=eI4<~iUlC9CIX*GjawEEUiU@9BtIuo?Sx^rXd=`}gQZ%fq!aovz#OJm zn>Uv`6glDlILA*lm`2lfwk5gkBei#QR6?nCmQZ%-&b&{OL(L78K;9N(;Ogd6v71gr z*fzB#pc!_mqZUwA5As_Am{%gp5Hca6?A-}hlu^0RZ=f!1{r=|ptlIK`*}i!IB=T!V zrJMiU^_=cZLy^r>oQ5|Tv`TBA=4w0kFp=&KWtjQTcD{iIYn zRjnw{t{u@HjpjdEvC^&Xqo>YUqXfB!>1QZ)4U-{(QzOfo)A zQP?fR55$R3nG?uqaLk5STYw-U79nlq;W z%Ea3>hYp5hozPEjt@EWI0g)ITjb_)PV}ZNrQoFNgP4Ng&AiF-^7=$rzmdp-zfOpy6 zTj@dwEhUv$R@QyJzi0BpE{QmJmjRFQL@8O>#0f5kfiDjtCL&06{)`Bf8+0WHtO>+W+fK==oy8C}&CCdm{K(!IGcKsR1g^&G@_QhzPPmC8a@|Fxs|Kmm4x z>1T*w$K44#iC8qZsin|3|6o%BFts+|v~^Pq2sTH~<~kj2xpk!4Be$gF3{>0$yTk&n zS9y?Re6|i4s2uign9UP{%xh-Z0(CIXyY_|ss0k@20LdlRwKB*n0Q$Q!Cf~s8ftm}l z7i#S{XLPmO>wk5&JP5EB1IcsQ)YP=fXF^LYXfZSB^_T~yd2%|#Cjma;wE=@UHz);s zDZ5Fz1n7;N2eIU(qK8?DP5n8m8qY&N3rm99X-Gr=l&uj`%R$%)HZQuwZL;-AFUB6* z#5vR9*McS4qnmMz*pL=lE{aB!14fkD0wqzA3>51v`<)7N$T4xqt9A_QZwA{|n7;9| z+@eUfK{_2N(jHlT4)A{Eusm<{@#W2`Im#UsXIfUWmRet>v<>@Is679`{XBd;Ll` zE7{5NjAg|!q|o#8FO1eELdlpeB|)V^C{Yua!=~qJZxtG_Pp|%jc@5yozMu-I5v4#g z$>A$q78SRzgs=AM_BNnsGqCugcmCO?>PW8lr{W&|c3`dwyP>lFJ&BT+;oUw=LKtkP zJYj5F=yxS4CaU-;X zQ@ag7+75~PqLzR`Z_yZ9cJTa>W#81Iq9V_^fx=-`YGx8+ruV1^fI1OwcK&UWL3>%t z#@zf1V}ny0>*TaRO1$#)0_)=**)wZ|C^LVL8MiZ9TeF5#eMdwIc>Ay86n5xFc#srI z=~WHayo^d_RfPS$(#__)%tfOVai>(YIGWcoRpit+W^z}EBEU14Ky!$}n&A*)!c*l5 z(eto3ZsZLFm?P=2_P2M52j7gRLFycD1o*FnIMRfzZ=A2_n2WgPk#QfASbX^TaXmkx zB{ni5aAP)KaFdHAo-OS$zN3(`S+Jk9ue6|aW=Hs&k*1IpzsUVSeVgA5-mtT?qdH{( z$#;CpUgC0=s>`hVcf3Vl7sOu%YNqEkk%9j4Kw==6URYAn>0S5jv08)#l490eoQO{e zsySAs;iOM9Q0vzQ{z4I4_5@+i>xocWshFCbC6k~U_n1$DJVRh5)F8ymC%X!PsCB|U zGZwMuuy?KZ`0|A@pdo=79m;t;4K39k>BKrK$GxE70C7`^r5J+=rR`ej=&d&~Y&th>I7<4l+lqT|5Eu?aWW>{eNG9>J9 zo1nc-6_-2GU3+0y4}V)%;_is?o|yj5ZR2;-72KY)%I`XKS66}ZRg<*__HzfXB=zr0I#=WKCNQOvDRkK6bne>{L?Nwo`gLwKBO zg#Fq_L3i6Fa2dXYG&{7#sDNDX$aD$u00HAj)^&t<7SGT0yIM-~_F~Kp$_32y)Iph< zYhHA2)0n6}1*mSnIVq^xUvb;=AV_k(3T@#ip!AX$AD~`31#dYZf&O#=s^|M*hv20Y zr%{_cfHo)!e@t+gwMis-_kjYd{GDGoJ|poC`ul!)*QruMf2r#4oEgw}1rcYYhIvEu zMt|Kx&FJz5O}_Nj>jVaAM-P)fA&F;I-ut4a}8 z%CO?_q1P^U(?IcRVtm35%G!y7H(+I84`R5s(ExY}#XpB_V=$2wL_P$NQMwX|htd)B zn*40fgd)i%DQMo< ze|S*qVkqubJRaFQxTvC)WiHc)n-bK20~@*JF4nP7Af`$LUeS>zp?qZWi)2n5QnvTm z*+-0l2oK@&Vt4sO9!RwfwDjHWklOc@REmone|78ES0X)-sE?&~z;-S^J6+TW1oX4%{C=yo zy^n5*nl%7lnuL_@n)T>?qk~BFVJ%u%2?4MSDvGAx22vt-Vv4oOnwHyz~0VHFggS-@*Y=%5U`p* zw>!_e)>{?BT~5W$_XKjNXpSV60al2(t{BQh10qJ<#`^GEtqFuDj``xnR9CcgFWCf* zqv$_A@kx%#wjnMANP2VtjVKMpFO|grk))h*#`4C)c6amk>g_1`TOS`rM=$LBm~n9? zdT9193)l-MQL_<5Bd)=__;a4VXYAXy&q+6dL3~Yw)geDUKG*>tCRjV>r)SWEaCITI z0M`<$>LOQEIqlSc>!$Eyo`!9MtL98F5(QpAPZ#rTgsiqRxP5({4)9X+{mN&rDYP>k={x_gVsa16hSU>7ZLR=(uL8_?@N4i-ccG9HC z#2PLz^^}xUEI`I3L|?9>-4Rg-1vBrYZw7)c@fUvXkOu6KGL%}C`S+h{n#z^};xZIh z%NL>ClDY4OD_xeZd#Tf42jdao>8)_;kd8oH7^Jpln_hSz^@wJ6(N_87-faQfH(*g# zHncb$uZ2Qci(&}I0=fFYN5OlF#a+IX89G-;Zc@Y2 z_7&u*dc`t+L~rNQIP2X+$Ei%cFm}({6Jl=CkDmvd?yCy$C6U|gsi~=b6pm<~Kdpz%eh)YQnmk$1aaKO$V$z}1zDSXo9ff=|y-`glK;7m`utw!C0&NjlT+p%X0&n5U|vmRWV>@J1~^i1BP+PE{sO(Cj%F7`1bJ;Vn8EaZi#K95+aeK!~!ic!R^{n zQlny3>zx(Aw$|P+_YN1(q6;!zd-EHg{{{#Mv5C!TWk>LZ_ti)U=QC&|Ji^)#H+8bK zmK=jf-c%D8B#+Vi#4hZ~d0iLx>FNaWd>@hUY}o2`0!km{IaXJ0KvQ~w*l`IU8HBM! zSO+2P$Z#+PFs~HpUyRyGr5kq2CuJZstn2RF>K4gCYz+>3$^QM1QWrw@Pg74l9IEW( zyHvXv#9M|mu+(ecJ@g5lOe(O7IN#~b>E-sJ-jPX2{vU@3$3hC20`f~CY2Q7 zj&-n1{l|d#s~WzFkFMiv&?sPPoUss7C_#1u@fzpP1^#`C#QR5g_hUd(R}I*KQDTrx zBrx_-o0_Ni(5d$1kO=F0VSapNa+;E_ZiQ@M%XBy zY}w4uFE_Rer?)k=7#nI<|H$;|6d@A!XydRXCqPlxtU5^OSd*>< zw=+~WbJQmhvAyzrK#lq`hg}4#czK454xG3ay+^j`PGbjjR@yL;jA9jPrvF1i&##A~ zl4}Uz)AFjARB3B7ir*tGVx@CeI~&ayCPXTIX{m96H$oZ((ikjvYYDHu)Ra`&`7KI9 zoMac~^;$3YQpE3N)~IIh9u*)9LtxrbKt^`VBFY`fjrA5FgV`(4rWuxt*jW9}mNvB} zI0k^D{72z)v3{X$7GiWAy&U&>7BOa^0*+-i@Vs~dYl8=VaGmCdtPuR=qa2eSpV|AuC zgzr+*%$ryT=uPZ^urU2^Sh$M*r{}i;1?mFulG^p}Baiza2{TCmtOgC(8_E#JnIwdA ziJ~{@Iz@S$n1~ke8wTp;ii-XIFP7|4B8l@TyhSd0otlFkpH*=Orv~Z5`NC_JZ#w;D zD-@NS2T`Z^lRqkhz!pxG#+65|bSeAWfk#Y6Iv(HIQy_n z3iSUB($zXCD=TXf@}l4d)_aiJa2{!A++6Sk;cYi z_~RpTyi)oIP4u_(8L2uI3F3!T=P8%K08285R4b2_ob!O%I=VT+Wuv*W9N;3~S5aX0 zAu?*f$!PNGR)c8{ZD;%g9<^sun5J_}f^Gb|qWth0Jte+jZ4Ny#lf=l%C~9ibKy2E_ zX9|tN)~8Y_(1z-s710R3gNTyTH*^@rB`f1#4!+a~@gw*9VX&MH;U%?gcW+c44Z7gd zva*gifFIlMj?7=ByiYGPg7ne-K*W3@`d1M1ASmd`nDFEIO9V8>pB(TcLx5tT4Ji|{ zBF&oZmy~Hb3sQTT`^lLw*QxtQf=jC$l0BN7_u5AHFkR%=h z^%t@Q=KgIB?&bL+H&PvAKH z_$)B0OcGd8zOd_fXxq+JXUT&8_3c)rD%^IfK22OlaB>ppM%OHG8}=k984Rn2=T&*p zQdSRa3GSA;aFmyr+T}}#Td~6$djix`@k;(xV1r@@Bn>(<4A-IV4^OMLsSyz;fYt~l zc20BWJm4+(M;U_l;c`F|a;8=n%JJgJbx1a^5(`;qO@<1E`$8PjX1j% zV1juEi2xBm9E~*nv~$O;n?q4dsADer=?Y)07xnBnZjiNzC6-B9AOuFo0>SyML~`F6 z9F};+GMoAe;!-*6LkKO)7k7xEW`Lyo=w*yu^IUcOZwF3%FTuL@zELY>0fC|}gl%mw zh8JolvKO#i&ZsS`s^6ePJaX+@NkzpuYv`aLR_}dLj6>EEVtj|tHrEO0Zg8ezIhA<} z;Ud8P1Hpdvazi?J=ULhSU71^a;u>|g-AM`yNu$s~N;Wk&C#{9acT^xI@_!vzHAVdn zuf~rmh(8lT)6db;L}EKDp|`utzQ4}7QZgs}oH{szwT(-NbzX`9!@^>v1zzn)1)>0b z#u0-Bd>=~?{WbM=`36}P65KWXFc=Z3h=}58y(hQ&K3S8a59$FRT{#2R=bY|2eYImsnv_|vyg1sY+ z0W(>|Px7P+)|hr;eqir2#s{iJr9-j?aRE zx3HV?K05liUdkoNQooH9Y3qZC{bFKjs?!*_Fo`T2;`V$XVccw1e4zmi%Xmn(dG*E_ zo4T_IcZ3ZM5(UlD3yvzpP zV%UP=0c&lJ$SyGUTBf*0K-xt8JLN_-yw&B+G$x~uPC}2d>ktNl6o1Gi^V?$2?+Aqw z=H@KKAq`?ErD^>ni{;!zJ=FLs-;<%cIahqTGL#A4%?u(WiC+eKwh#l-g;a;3B&f?+ zLp|s9@?T$`8aBsn3}&|2e&d~qMstpPb!V!o2aIVg`k>j?=M&7!yIBc~#Y#|`PHhkh z%{CjO$G4TbSvh)xlIdh`O?A8IdyFk4Y4OHJdv31LtG&5RE8Th(93my%wAjoE>2Ynf ztaFV`O_SrrH5&{j{L2$imu^GV{{r&A?joB!4+@n$%?t`G2?m^}mLh3i;)qYs;f4&% zk!xDEHymyPE*Qdg+q-V`x=h51o}miE1S=1=J?0f_7{{&-3_{aP2wIX|87n7_OhRNn zL5fv5^l3u9RzQ?_gfDp5$3p23%BM-`__VA$BXWQ~U~D)@yLV9nNxW95b|Q5Z3;r$J zUY(7E9u4lFd)p~<#h3&{L+<1io#}RQ{T}$pcL)Y)JR*J&nc_dHD``Fp&?-*^B8ahb zEP{&M3MS8|HArW>{Ha*go#|Q;p?ifDP9pSD%nA*?$ns$Nq!=0PRo2WLK^VFJ1``}1 zH3{oL>Go7w@8XSvm8c^Y@*@GPJRV@Y3JyMJHD7y>#$JD$2Hk7K3PVW6OSrPE zykun113Wkxq=OEwOdJ%jw>-(ye#j~yqYwz8nFPN%#w91BW@w5BwR%N7s??(V2-2QL zDlcfP8l2Netxt~UR;ekp(xC}{5S|j5kr8Fna#GL1uw7kC04c*t?2wQ#@0 zKIwp=hTKj*aZwnniUHrX4Y27Cr16RDUpz9+1XMXFcr-&GZ0`Wr@Q6_&8qjkd8JPk= zL&3%!)&fW1CA6#&Aw!2&Jr3GMNrOE5UJq&OWe7|*od5RQ|4dzf{6iF(2m61SA^UeO z```K7f9G$Jr1^LL_Wz&rw`<&?#-+8AA~xUGiDSn~_WyeE@!f*2zhu^Vjfa`g#8DoD z4Qf6uo3-v@5%w3_PM{$^$?Eq|ouv)2L53hUMv&-+gL%GBPqYhT%RP zI%gy(xrZfMwe5nHb~|^uKiyEyd#tq--)k4LFp6(si|x1etVfm96GxERH$aGiYED0Z z!@nnJJwbCQ>q5$b*DAL}yT07LCxY{CTuMHT-6EnXl-C!97uKlzT27kLMijm47Sn-Z zgg#iBkbfO1T+uv+;rYwBBl=f2iRw__X037`JhRYmnw_IO)M98;>Nqx9Yd%tOu|-Ub z(49Gc6aT6&D`;GT=F@{ttI2|{Y7-qpntXznNKmabZ&{JQ`So!jSN7z|XgUR_bj$0x z?>t?y%_l)s%WK#+h%8RfTB$wmU3;XqE5@(O#l;1mpuX_C`a*@ZXVVwwXIWWU%#{e{ zkm@uchx7`+$v7W{Tk2M699hoK4pvyivdWxManiLTC%V;Gn=pwmdV`b&{7qx^A5D59 zHK)|vHsit#YO~yk$5KS3fMjOC)vBeQTZOcg7cW}1v(YES>y{Qncg#uALhPSMFh{k! zRhK@Rtha=5gwbKk<(E~N*QA4EkMF;C86iW~uP*Y&!n#Ovez1!t`xB#-P|3pA0s{lbBB`2%%VA3` zV&*oX-+r&LkgG23J8-HRDB^MN%AzWLePK%a#O?m`<)h+ZI5TS>!H|%UeJ$LPs;;j1 zqX}xEk5q7rVT)o^-jxfMT@s;}JbTc8Wd<>4QM;?na4Y1@(s7t}SzK*@Rq2>-P~IWasO-wKkak^r z-=N*1InS&5{eSh}CQF^UDwS$((i-L;<8GPpSjlPmtra>YElmJExwk<-qiSk>U5vt~ zJodY}ZKQAb+WAk+xFeSKd)a3qBfcIk^n)AN%U-3NC^4dV@RGs_cFi#G&5E`6#9kb^ zvnPJ`;Q_P=yhFy8oYIW;*={Y?{i^G^b#*FQ!Q62nP8(G&Vr1YmVM&NqRvWqLz!vMb zJEgt$^poReT{(SOn_F&!ay=REOBTs(=3Qfa82nh$n~RP^V>#}Sv4V0Q)19v4dHN-d ziyP(r-HkY0hIfh;hI@A(2@W9rP2 zFs$pKd#}a#@bIwQ+DE;~s-(n3uw0MX>I;8X_W{e#5AQ{fT?mSfS&j*&OkmompR_#Y z+!c$a?{rB-w)!|EHZuzu)LdPz5b*1=evi%$hj=Xy90X+QX*6>dU;ZWULHd*&MC|>~ zU%p&Pmefxdf{?luw{h$CMvUxbjXM+Lz6%WHwosbaQ>*aFFZsAeAFRNR9s1ftSI11& z+tFgMFpz9~CmlBRPLNWgy(QN!n9&pPJ$i|foN6Dp#f05Zp^bg+v{?=8Pf%YH#e~7u$xwC-RzjJo3S$SWRKM=$0z&`&hlFqc-@4VykZQ4jf>(Q zrQ^z`GN(_+tPnISLks9hpw3!DTyn$@NX8jT!%&$lulBj&*O%u`&#sV#7OMMY8g;yr zZ-upNEXUR{rbUV#S(*wHSa<4eM#>Tr1w zp6MHc@uv6f^k^I1zJW`Zu1syY=*nZy%RRyg#e2DR1dce>R+*o=<@9_&Q5$B^9X_tn zK|Ti2hmP{$e03$nCB?WI!CzY%9aj@`Q#>a0DhHKDaR;rvlTT}N$NKkaeQ>xah8)Gv zm(pHeJ1XZk`4AB4CTFvb!nE#BS!n9;E+mInAFBI?8$7{N5}Vx|s>@o`oU8KgLlCwY zQmVh58%}?uHn>nIDIO19Xp@jE6bXYG$7w7TH*DLk3{73N<6gtLi5f#+5AcPa7%;q8 zoyr#AarNHxn25`KZxtEdLT@P7C--en@LC?hQAIE!c+?l4hw0~AMYxgD&`-%a4JM(Q z(r9=`Uh)28X9_(yZz+i}#s(Tn;*mdEpx|}-En#HN$;(r|8ygrV=U+<`HPqz%U8!*y z2AWnSEDmLNW|*6ln%jA42``_I6W?+y%A6>7^sHGwSY3uiR%9P~)7S>JzyK~`N>vM_ z5jDLxDPF#mu3B*TiU-{?-gbvMR-5N1Wc9V%hijD>;F0QiE$fDAfPN%C9qr@RxzbY9 z;W42lQ$Jty*=_h-^?X(>S1?g~F2+uE#mdvCu((Ru=7PYP}<5m0qzKTF^&E?be_5Gyv zNq9~u!>1l)we-nQOI&z`N+@1o`d}FoGyN`ICLukqq#b9T@_DFqoB6IMV-pc?80xD? zs%<37#(&UBZyXKIGX-buo#;K@sC%hZzjjQVnia8e1H=9Amg~IbvTaOEShp$Kw|Q-woU(6JpEe11op|k^~^woBgFGG9I_~O3LG1A z8MYs8tT#*y&V6PA-$JUuERb4SAS>6d=r#c_NYaw3d~T+Qba+dd*N~$>ztpsw#!6 zdKrro6F7J7g_dvsI}3nGlkew_+xmA^Pj-B>AD9&a3S!K)KU+Ng1t(1NFPV$}Y_KLRjENy{oy?{fss^WN>P+f%RI2xt8RLj`XfauW$@zY8}sEPExmm?M~|ol&i#QG4RY9A?+$z8<-O=f zN=qN4ru&o`sH_jTPDJ+lSHcLrcpZ@Hh&ZxoD9`0f;i^rMA8vh>{xI?Dlc?oUmTaXI*f~>o=f|+y0W+l9)|K$H`F?*tuvM#yHLyfs1JKnLH@C*( z(k1=fvYzo{Jl~tm_h@N$vIEKYgB?aX>s*#sgHh9&FKdT>h?z4M52lv2cv7}XT@U6Q z%X^a&BtJSmjgzh&Pg7D4ZGCg74=c*i3I9QEl-rCY^gk|&wiwvHHa)sn!n)*x9Osn6 z)XS&^&EBA?A^NbHSznTpFC)>!GO(%#`g+1ZNJ2YKlpjIE%00V_yec_6w5SrP;-X07Qh89(X75uzhZ)_A=?pnDn$`L{I}o&S!lqkYFOQ!B#GIAS%WsGH zJSr)fk3&WAuAc?bHdjR&LsxU}`SzW{>RDqZjw2*$`Mn|oySMU=jM!Am@0 zkwY3kBu=GW$GTkjo#4ij;^`R^x}W>RYtVcB6Sasfe6IGE{cBGd@f;9GP}4fFeLfgit@_A)+a~tZM*#YqlR3Q zp7B%5$j8eT2c^$N3Y%}tk;f8TYlTy<0(AZEX zZ!BfVId{&Sls@&udpxXlLu57autbvtKY!8*gJ{jbbtm`Hl7rHd$s{TKY6Q1AXfj<2 zrixWize&)HQ`?#m@f@9-@PvwZd(q#0ZHK|}0|Nu({MzNMvkvuP zt6@Of{x=|geU&l98?uizw`o@IHObsLYQ3_&8F#bK>36VX{_>N5V4+A3 zeJhqID#f0&^Z>Tq4qfHan(hW#sYK&qi%XG>m6b4w%P9(GWz`myTHDx&8fq}_#EB>? z$uw@xecqVmYu03rNZM`U{pp`R^P`H)ksFaY8BOEfK~-Pzg!75!3w#B~WVptXe{c$*Gm_pR z=1_S)Bfs5elUD8S2&a)8Z#z3*hLZy~rtS-eZjst1DLK>BARCAGbTl_o)2iB2z$Ggz zvWUc%!{_|b*49@3#rc5)MPEt3RNaHvS-1Al-*I!zx5K3N@xagmqh~v-6_;@){ZGXs zZ~Un;zO)5&yrcyBST<+$K;aXkFy@>XH8bdzRil2I#wl-L&(3sJGsOsY=>hh9ExO1C zRs}wT-nmCs7jVOkW@cj23eCC6Qf|v3g4UKvwQ_O_4&e5A_-XK|ocO3RHb z*5IAy!i8q>lf3Z^+{2d<9 zn_;3VB_+iqyI|Ew#c$spi$pI7bUEx~;EFoN(Odq195iFzpw)J(JrVaYHBI$sQEl&R zk2zqVrD&RMZ6U-rh7PLKzHG;4x)BnK93K+#AKPk*JBG$(v8#!7R7}v@&=r^4w_CsD zXWMywtkIJd9s7EoQ{g_(Jbmia6FnIX*_N$o+CT+zdhj>Ntlxp!*nn5pPpOc?#IwbN z6{I^idKg}fH`ouLosih3;_b*Jd+l>n?E~|6Rmy0xD zRv1M2>p|kE^XS42uDzL+aH8h&%`7Gtl;7o$kg2tiQSaKV--!mweyuF}EPjyI_lIz? z4AT3PxNO4QZyye`O;-^7AEFq>6qhw?8K`fS%sjQ%{KIWGQmAr2@v5JL;exE6O3?^7 zlJZ~a{c;e?$!2y$an|wUvlpeOs!B#vA0U2S@Y)Bq`=%u%m5uM09dujiBtOMRd9IlI z_bq*KO9n7&5c#KbSJC{3A*brW$)}$Z;>3bRj#qDW9+IE@wreTY*g#F`gns6AnpVa} z6Q)yXXE!_*?&02?pue`+SIzqIhq3j43qwHjRSM}a@jwZ zy8i5cbPtG_DQE{0zSwQVpvFk;^Y1ME-@I))Qi0w*f*voA&@k3ZoQ{sxAFYZZOG`;A zgt&)xVFxhd=Oi0URd*3&Z{@^_SSe^bzj$#uKj-oKP=)Pi^vjy>@n(N*R~}O_(A=7@ za>6t(-xxWj$sddJDI3Y1gW;pnm8Uyk>LZ4K0&Tut&Z}gP30ot@qTpg=q-gliv%=*UUy>$4P1_z$Fse>< zZmrlQ63hDR@ywKEA0&=meLdvRQThf^-YMGbRbv=7q;{C(yj3s_OHNI0i#ycs2*ZPJ zjvr*o;QSkye>Ybp&fa16n(o&(e_VrVLJ1`A8+NVjJ%UVLWk?i*wvMm89%Gp2` zK17N0uZsz0kr3ZK&4n)k#^p?`wY{tf4@2GJsH+6TDfa(rzi~pT#5HoB{8zKHIg_X1 zRfz^i)jv>l%@{KspV2jKtn6@9=KKdp9nm9lT?Zc~&bsbn=<|s7cmS$s_JrGkHo! zFPrS_;pgAlwfB#|NUz{fL~owgXqEOa^5@JtmH(`$taJp$*O$Vu^e?sWC~cAR`_78D zN_DD-a85GNl3rdu&9x1g?~M}HP%)ena*B=d}mhv)9Ys*zGC~!B!RX10Jl;$gk+>5;&!10KU)?u;0 zSP^)jG;xFsUX<^sv@$U`3t9DZ?O+Ueg@1$Zkib2`i-RAhh(2r&Vw=OMm7LV}Y2ioL z(Niou7FzhrXZCdW6Eq|Z*bDS(@eaf|ps0#{L!1M?Z2<>7KKBGW@x3~Fkm0~lz3ZKn ze5f(tb9}0^0I_cIu<7H8U?*ax6+XbO(bT{yWcB05*0!_n+TV*8J7H962VyZzMl`~? zbLW0`BOEukO5WcwunA*KK_8=eyb-nZ%uHO_`&#pyg7^GT)iR+n7ZU@fisPqvr6>Bk zyu>}q>dgWyy{h5+EcCul*Tl}xKMwJDqx$*t=jb@KI4XJn^SbGb3>48;HgMQ0(PW*y z)Dlm!3vqj-dU@7CbJnlI-`&#xONHQQ+1sj(A9{-GU2=Fltgg#;5EH*l9iK7Q=9vdAU{QU#lVMV$oj$*Lpb$YeEvomg- zH6(?6vx(qdE%k$)hTMpEg#>oHd!xN)4pV0YuEW@4&1MiL!6-2uGBJ&d5obrLtpmzP zwmw@!;T@&!d#yDO%(1Sy#!&+vBG#0hS!R{zaYkRKs$7$6pR$waJxRZU_F12Qa+6HS{B?>9}u~vNBea5obbJ1LL!9iHt3~jxSIv zxpwKyN~*M~>g)&HX2?oPLl=_Ohzu;UfpaXi6B~G;s*w zRy}D>zv@^+vhrZXOO>_A2>gvS#3+eceR8f0xxB2h+9+4et5be1&EANga1A4xyH3g)(beCQDdNSJzi-m8 zD}9$5aOo1eWR<4@W#-(>>99E;rBzT2-lNbKrJ!zwfR0H@;CB7~piZfD^ldVgfU(EG zGW11hyNx;z?tXh|hUotA;&Vpy|g;9tZJ{F$$hwTyLntUwB(X<~9+*J8R zU=>0Z23PIs5r$ulf@=6Pl&g?PPFTI`y|X0~dsaqN{uHNbx?-R5oo_F%&>5SL^z40) z(^<2XlS5^(Cyd-ulLgeP2=Qn_c1BJ2`K;61X9S%)6IAtnT@yK1lVfXDb73_yA^NyM zpfOPJN00m+h@ENl_4fn^T-_;2(zPqHxpCun)_DK> z<~d=C5P$52=x*DFORaC7Gyo{kG!Hw0bJyPvHMa;gJ{~wB->tGTR`tzXJoGC$crgvD z+xq6Wrn08_H+7smYsV!0T{@R8K_8)xgR`bI`5VA#0vxe!0@nwgJ~f+t2^*R0vulgh zr98Rr!nMnfz%twQdK+27zJDkGM&i}_{v&uL9<8_m6mV1H+09FrV7RQAYJxOd5p}^7 zJGjpch$O2j2c*(cT93tlJ^rKH0_1(!Z)fGOB^us#mAc<$h(~LccD!@)B^J=>L#y}S zVVZtlC(PH&<-S!=+fpDebFxPAcl0#-S2)H7CTqHIYhExC8|vf- z8dY&ki`r#~j;JuDZS0fo&+Br~EHHmYl4J7;31L<9{QUBfn4v$SPTpfLCakZR$1Az+ zy<)S{)pl=}#6eB7rL@zD&@Ik=oj_=|8%!?C3#y=OFM+mdyWa$`$|YUi-s0 z@?2ibQj_PHUKiqH(8ScM?3XRxaWgcP6E-8ST{~^bI5B_nNwj2sSB!k-B?EUTUKd z-+>s+-5arZNaJKIxN)1_*denX|XOCK#WDm!n zY{Ea(!wN3_J&3V}ua@eUuEp28WD{?HyVAFi3~oBD#CSNv4~7P4b?!WzxPxL)0!|>iwq8u;5gpr&h{eKkIPQ6rS?Wnb;|!;z}){Xpwr$NXXk6a zSLRm-`N|h1Ct9x@#p4`}U2rdVw8;hD^3~8nIcIA4*_5zmmCO6hwM(9VTOnj;8x0rN z8wbV?)m%-aZZF=81toa@T|)d8V{?bw)IHM^vTq|#TocMMTO2G7l7?wnbBtnNI|ZL; zy{K0DtJ1jV$^h3;NZW3$^R(CZ&-`vvaM1-MW(H^V>L%fGBBvb3nC{9*B}%O_%X^9yv`P1Yr_Y}87n{#USew^-NvU4~WAkQO*bP}e!ovoC#JvAM z?7d}JRBiM(I#}2kh%_h&2vUNigi45%gn+bw(k0zkbSOwj3j!hn(j7`kw=^gt9plh3 z%$&91`M=kD&Zl#oPv<&^=fk7U?AiN{6~FacYu_t^wzI9*?@c|oftl@XE{8!+TkS!Q zhXR}p>^DMm*)Lb>mU*SGV;!F;*_*z*B&;?og14vfVcxQ^+LmxBcQh$(K4aefunPa& zS+lfC#O>E(r^~d}-(}lw}%+D1NkRyiPyy^(ivMT3+!hiIS@5a(k{)CMe$S8L&7H(?b zEbXE!pAQrT$_o_fKiQ6|4t5xe&HvRR_zpAC5K2Y0`(@Q<)Hz(;4o<*pRif7B#w&Oq2#H@*(8t!bj7Qtt*D9wu)#@krBGtjH7c^ZC42#tCzDFGJ0#NZd-a2cZWM?5wB*Z`^Z7*@ZXEezZ)cA)Oe z&10Uu*z-(Mhxqzd%ircC9$_8^D;>MFYhT;KDhNx$8H5gi#VMg89~FjaJVyLYdD^RY z)(MnlW`$pb6bv!9wxOJVOIAa;)KFTL&gT;!)EoH2i(uE3QhDVE`M#EoxlLykEZZ_C zXs0hK2+Y1W(RsSu^CyuckfJ9FC;98=yK!k3m#qu^8BGA2C?{p}%I@b?BEkjlBFaZ- z0h|XWQnhlf7%CPFcGtk8z>z$eSj$jI3%AKbRn+Mr_drzydR5`)S|*34y$CB_N~%w- ze9rI>2^0-I8@^_tl;JSXmrHm-oX+mH(&ojf?h)y0e0Q`2$qzh0wVj;LcR4jN>=Kc4 zgtlC>ae${<=L@bisEi~9yJ32i+w;jJTad3)Qz(_IQ)bVZZiaG6>amP_@u7uzZd-|j z`);@F`$so|bR35b{f8Hd8g+A3B6Kx@s>L?Tax$qk)(2B#J?04c`T6rWY1Mly92_As z;Y?}GNJWZ8*Fl)=%ni*iiw&Zkc4Abs&&1tJ!*%2{ywdj*Sl>5g;c3g zdNiZu8~53F<}&{P>vJzEQ?$kKX$4={1QJ3r+_QPe+34`NXe`va?E_T`86U3hR;YaJ zrT(m36E*C(VE-!^B$GaTbqrKN^E&OR*dtasE@9 zj)poGe?Pxl+g~Z*P4)*y+H;}4XZ<}kgz2x674}c6>s%%gv9Yee&&iq^3TJm2w+(oN zRvM1$Ez(&I-54$jS?lYyto>rT{8t7$ajK&pqRtPRj-6M0B}4nvLmO#bxT*-*dA@q- z?eXYN;HGv-1Xw`7m0Ns0SD(25!}VV$c)x-({zzoz7X@r5UOVHud}IIG@xDPTZd+R9%_eO+&%E92 zfN4t8RVDHX>W^2=BWwc&QUW*RNN~mv9uvgB+8Dj4Wu33XD%Xw~;I_i|#A8QzyaF%l zIdfQ+__emSA~e!OG+HspbC^OKlQ)z)^V^FO>BWnmSPnBSah;Y8Rgl@`Yl)2IR4be&|d0#~mB zFEJ7Rk*@yetEiE3}cz`K(b6%_*Wao=s{FzrF6D(OIQKK@&XIk%W8 zr=|f>f^`)(XTUJWgR(;O(JhDJZ*ygYs&a!@_`?RjeW+3+E%O&S4dyM2z<8xg-}(Oa zXPf2a_;UM#k_kipkYL^7u6j^eZ`8;b{QJ%#Uh|I5<7x-^8ql>(oH z_D7Ar*`cw_3V|1;LxQ)S_Mzu-WbDa`nQ@f0(=JaZv9&KJ%v#hR!E^#w+66_bcGu?% zCZT98w}H}QkA#CizwB}^*8`pauplWTQ@atV7Xx*3Pm$u8!bu7WiVT_PUo-j7t~MqJ zJ$*i6zguXUlP7g!uCTzhBcUsEgVOZR3i5LEx|VeSyjEm})wz~@ec0!by36Co+OAzL z*d~LVU0~-Wra5$y!AB!MQC0YM8-%&FEWD?F6M@)w1)K21yfBxX+B3pv_t!LSzuDHiUSkvf z%9BK7kILleX|F*C|*e}}H#Y1gt{`jB4#O;Jo{?S`(l zjEsys@88`7;ZL0Hzfwk50!^AcdT#cNThB*mRb^sQ_ESJ+XtCP%IuHPmgzZ56bux_%&^l zI(YKUbON$R!aiUc-*cp9!E2wC8{=;3r$wh%S#I30_*aG#nDgCS^lz*~ib+(MIJYdb zTvh@m5d0nq~5{I}r5R#-0t=mQp=WI)Ylcfp!Qt2{gh`NhC1bX8G&jwULm z%|%c8_@H>1TmQEdQs86)Z!Nutvf)*V9>f8Kgo;t-^}e-!1TGw2@U2gKRpbYFF9^=5 zkc2ej`}dIzaf11KHL6XG_mE=tHoP6LPsRG8A>{f3;gxJjUELj|I&7*V_A<{ixzIm) z?zDOyTavHVU3Ft1@Cia{w6dWR30|vCDfq+-M>EhO^#lkDWr=?=W%0Cxk1`M;b{_oK zFyg|K<7bh#GEf)(r^m$k|M}+N17uz357q-&h6DNduLaA2I2?$>fi@iY21E-Ee8Ya% zsRQh=-=6FLUA|${%W(necZSk`TfN4zen|>db9cWx*tc{0eZ_7Z*>5LyifFHk*umEa z%Yw+ufjI2-&^yqQ1M2|Va9|Y=tm1)HJWzuJ%!Fvc0XR5-(1;iugboKG6Nte9Mn1sE zAO;5*`2Zs$Ug7^o%z?H!{m}o^0w7aA@Q4Q_A|eL=&pe_yG^Ig)T|@6Rue87xM0SW0 z`KR}r{j8(@l_VnM-x|mF3HO7q_XzicWjPRs11&)vsKJ369H_y88XSNF1S1__rUR^q z$iV?dKETKz1_vS2K_m%caDb5yFfxe20XR4S2OtIq;NXB)M8x3#J~;3mC|}_!omYjOjF$Z^r1S|Rx6p`^L6|oQAP{iM2FiM?G``CRWLExCEi9eR^_4t z<)2wCj|lsF><*AyW92T43-|}uvc^7&ZaW@J!yYN_W5$mdp0f5ny`vTMtbw({*KXKJh^Yk4?fthx&Ht5dem1yDXO^2{jmGtjNQD!j4})| zSFeVt<6UYS{XR>wujBJK3?%~&Fo_te`uHtP>Ws3c29nNKp5 zrrUElj1v*hOFhlpT4v@l=`#Oh@uN_SQjoI|Z*eO$QPADh*vQ-Z*Qd-9_#oE7QY!@{IxMNnbr7 zCwqGdJw3hEwYB=*43DniVXDeX4<%LyiCm4KkdR6`*;Hi-iJ+jMx|tc1_brnwQ7zmz zZ&C_7p04lg3?Zka4EXqQk(;-GK}uShgvWuMHNs4l^=W1@5z6HH-e~T|q$%AXV~{`P zTVefC!|(g!SKLlZaY&zs)r}3~FjMF%m+QD#rcrKXX`xa5=UelnS>c7rysMNb?_Wuv zL;A{Wq$ibF;11od#&U9UIN@{{D!Zxn;P22qPvZt3%OBmz=YmLgbLc=F>@e?1aqr$e z;!3YVwcuqF!7q={f+$pU1u5ivg_V}NtthGoI`q`o<4h4DvY<0dd94f z5?Yf(M;Wgxy4t%2L8n8hH>(QG-b+ho`60tlhC(8)S$q5U$qxqzpM#Z+uZM^&l?Zsk zp-3VEo6W~wx6KDXT|LEFbuNWrCy`1gL)E~3wMOz53dPHC6siuwrE)dgpV~Lz)o;>y z;cSuqhe+2y!&iMxvYeHqp(1$auR8hbsEyB+Mc6Aa++)c4!8!O68LC5=l3-r>iMnuw zfco@ATBO6{742Qi!Mtm<(03WyCtglg8{SxSg-O4A_s(xO?l8*xSu(6%Qbwxjl?SOI z1LI$&4MPN(ILc;zAkDwguWr>uW@(|T+%SPrx~`^T#^$iCX5n|?i7}AN@=ojP>N@}C zu5BV3`t#T>l}^{ij;*FqE8iM}F3p!nplj{;R%gTmK`H4CF@A_xmeY`@%`)Z$joe@7 zd2aaYtKkH@wTtZP>gwOOH^hXUmV(MLRl>Tivy&d}kIehXX($FUCGaZi&+xs+g{7Ik ze~?Np_MAZ`Okkyz2i?lk;m0^gV0xXEt(IBO5Go1>o^B6#Hcx4SFiI3^wq1i>gA1X1 zKekO;c6re8USm75xDJ{sE}!^i1P@9rnO`b5>~GgWx3hc%dF0qz&mS+Er=j`am3A=# zPQ4xb1=ed58|sDh!KQU;n0gJ{MS^TsDH~~Em(q=f&1DztL=PHTDz-8AGGcoYMX90l z(?Cf|Avq0A@B_&cpifmN&tqpR?x9efRow;WQbR(>^+XfhmIQ5oJvN@aXm&wxePHn2 zC)2Nb)%Y{g;Vh)xpViFyn2w<6)!~p))Z5s@!J{R=U#_6vt0*+VL)QL=i-p3$DqbT> zJTUN|>M>5>QHE5)7`r~YXU9qgD)_H-heA!81XVpN)22r?2g zIcT9%kJ_$BIULx(qpEvacAWIi5<~0^=Xc`7;FRkDY zwnu&M&P?p2$q!jV1o;HqxHwAxUa$+8XORihD6=zBZm-A63Z zJw}-eskUr3Zf0C*>GT_9vIZ0VNTnyFA~xjq}Ybi4w<^{ zRM|GB_Jn{2C@0A%4xzkVk*#>^U+{3i82$ZJyO>wvr7m6tSopYNqb6h%G>;yZPqp(l!(hR3>Cq6-cPvi0A z`N=B}x*OLGTJUB6f?RIxDzr32gsPFa4ukz1TS+xoDcbNcGn3~SF);}a_52nbggi4h=ep>4 z!N2V|T*8LoKrZ}Ia{eqdfWE6BBcRP3_f5Zb5!-(bg<{%sccY{YSqUPhe}2S;*_1Ts zrR;z8V;KO+oB?KGy1&u-^l7=!7qdMpr|ijDBOX-XmRoWyhu66qp_TH*%F0T?RI{(} zwV}SgtHoHwWCVlEr#E+1*&?*w@FsUM|C=aFQ)_mv+8KRJq}M0#TQ_JBXm@1dUf%*{m6^BoJ|eqoCt@wZfktiES!5A>NVldJkcdhH$1%=a7io#&Qt8YhJH7* zI7?yYhATXZ@@AN%xrRbr3|q=SBCb-UJ92Q-l79&XF zR?|t~(`3m&gYDH>hbCvnh8$fwFH0iS@B9DFm_eYdyxi_Vw=)>VQfR4M6MPs`O?ctF zJ~+KDhzG&0gC4~t(jslj$E#_ zB;@93dYy#_>@o*DN2DYZEnSHzMK_Px{8sMFZt+r{&81%@b$4Qf2 z9#{?|#HC&g3o^eRXsIDCEkPPsU$Qw7XwV*KxFM*XrG~U=4k^dz=8iYEgSCYRz!A&h zR$sB1{f&BBpaRN!LwTkxJ=pb(L1652N(uw`#4vJd>XB*fRAqm&!mmaNKJpBklm0lL)-{PiFvCPs(Ja`=ZZZShcf zEv|OJRNsSLN6mfB%wz-OLkWkk3IFzh(?re#xRV*S96F8?ciUHiLfc|#DQUZ=E(_2m zLnEWV-qX@jJ}KH9{9IihgR33UIqWDD_4U2E^JJ%f<$atH<4Ys#SV!YDavoru&~FbP zAICaqSx-^!NV6##T+~t6gIJS0d$aw-mz_E?F6Fjp)Ss8h0k ze#;?hr%?x|(~@BjLkYGcgJT9q|Ij)(5&rg=IN z?j$4LMDFKi@O+WwxD(zs^NT90ZHLH4!%(65h8v#Ux|BBr@TW&e2Xrjrs9X)(6`cZA z2m-t)7IncD2UnfB2Bt?~ZwK=*Cui2LCly-`(^lgq%XSmW|AqyEEp{PxUqH@l0x=rH zltRDu1~}AaE)07=sM-<1q+CjSy9sj=Eb#bj8PM|L#cZy{U=>e1Cx|(y%l9jE)nNM& z*xE=vKf?lZY)P)Ju1-)Q$pBltzGzMTUCBIl9t6*EZ$=vIx}2=$g_;(FWw#o6gKr54 z2&BE%&HFo|QDXDwiJ0e~A8%~OTx72rV0_-lMsWl`&JSr~od1qoK4wF4Z{svdT!eH5 z0*0EupnEBAtEx^q*KV(Ib9uOi_*2dg7#cTrr&{}iajOIC6tam0IQsyW7KwHMdkVjL z?OXI@cbmI7^VUitvOa8xf&OOp)Z%feXRQxx8$b&|+wIwOx;3<-@L~ZHqS9QX`GD;Q z6b42z1z~jbe|+g{jvl7sv)~eQzL25Hx|8iq>m(26&jf*w(cd()_@13z{rT^{R@;k& z1wOFG3=AnbquG5H;;2=M7;r#U5!)2e}w-{Q9?JU>{ zUi)(&TwK1Pl{zc36La_WkOJ5%ZbJbdA0GpBL$DyzgpCEXm3Lei!1^#0dZ^_eM%8p7 zSn(l$U-Q7ka_RKfmsX(AN~y{25S)32`F$%tjzT%SLt?G?oYAGZxq$KQtc}TNzgMtn z*inopKb)%Wxj69i=eJ7;#tYv2f7>QEHDE~pGgN$k;nK&|p1aY@rO$AHpB(nWzU(h( zzHe?gY@^+SA0Kb?Ee#F0BS>W*;6ZdgCNOEaIOLFP+LMMml&eR@ZxwWAe!N7ek}Tr6 zVDW7fs(=ZRR)=^gtl75C1tW>tTOYPiEt&G|`o3I`o%OhG zuCevSVZ*h+%*Ou{Fx4s495ueQ+U!f)eEkeMxSDLITo;9UNP?{6O(l-dkkU%z7FMHW zaozvEK&ReCxMH0gkm!g?PwjuVfCfZO<3^4dLWSAcS z90dFIpPIJRDy|P#6#bx=#JBM`T(M!@(mJkQC$OvQ-N-Va;B7?ijndRIrAn14>=x2V z#E?~Nx~{Y{ly9tvTm9qPNX@3ss`d$Pyk~FWkmeAn#WR^nEh&>FU>WS>dJ_;^!x9>) zSFRJN`Chus6Naa?Hxd4-8Fws9!>sR1Tz5etoETO=*Js{9ts)9x+wr|i)H76*HEDzc z3@4j?4d8?+!E0u8$l6D+sfP%vWvM0KwBm*H(Tw&`=sgIlgDC2i_WfGG^HTS>(%k1^ z^Wapuyzf-D!WYUyptzM+8& zs~>$mDaCdMJDxx2b=@O5{=SoLq#oA74?BZw?MJ6J47IgNnSBk^TBXY$o#!&r;bI}^ z`F9Dy%iN9Y?H;u4*Uv+&DTinehm@30qs0UA^R^w88>}Chf6t~Th7i*_+qC9tvLHIB zc!7IKM+^pWA2=)42m{P;cYnO?6oqa3pz-uYvoP1qchVDGwubyyVIgiBECEO;Mcl~S z%)=3#)~-E2N@kJ+mrvaC?=>qdL4XQ8fWk`(S&AiOa(}ZQvVhZV6m7g5_l=&TbaMg_ zWH8CC6JVxF&>_Nr{2g}UsAy>XAEbueV@08y;}NM(vq_5Rgc!>2X-lM}qN1Yc_n6+! z&WCW&s7|g+&y=n4S46vA_7X&LOR;p9D%`Y+6Ci+0&$h2#{pA)0N&Zom!s z?hQzl)nTdFWGV3%-DMqnrB^nK_n3IDYyBW9H7;K2V0JZ+k`|GWfEdHVt6o`+yXlR!?UZngxXfMI-K|XD=u+1(>HU z^?ae6Qpmviya!-@B=n`C`l|3NTkEoz$IQpWWF6-V)upW7Q^lMD1QUrYiA;J*3hA4> zf4rxSX?b`MozIzYQ)1YIEk({BHm?IKK44h<}>;K{;5sEK> zrv4RK*ZK20Iy!J0EI0VFXc4z{wv^kH>3~KcFf<%3bHFaxb+6ykz1X1! zUtp9#xvpL{Ffw8UZO|J&XJcf<>$pH3fS}Cv#e2XeZ}iX1%sesvtjeZD%PyUj<_!0D z*c0%_0ObLj!L!`PxB0>~!FsT$vnpkg=M$mC&G$GfvOQ{h_DS%}Pvt^Q&?QRXDf=P9 z+&7Cu3NdLpI97=mrgx)rGjM~#&uVO7_SziaA&YwtagzxP+KG?~laOG{!L9g&o>vOg zT-Z%tZ!VwJ>@_=IsCmn*a41?2?%0m#HT-9EwM}^MFQ_aT5J31(oaukQLO6(n4-VGj zKS@cBM%dh+vS7*M+?SgWZ3l*_tEcCph=@qe?ham5N&?<4VQ^d;arqevNYhUbH*q=F zZn{0rD;=2LJ$9Pi8sZ7C+UX4db|-pO6g?Klr#lkqWWtQLhYB^>)pB%cGS#vIm=oP^ zA`Wry?+MOV0gy(|njc1qkA?Yto}@Vh$Z|4>r`<1AHmV`)nyfBcT)KR0q|?{kp#sw$ z^VHQ^04+{qF2=XZf=%*kpiku)gpCPXo6KD}d;4WCsraj->qXk5?`|rbaejC+< zU2ZQtt^)nnY;CR&+h*;_V^y{F3@rpCvnzsYV!BT-$DLExww2U&=z9dDiSb{W^y?54 z8DfL2-5IKO7p)uZIz*zJK;;Ma9Tq|YI}>)s>C|-`9%(!OdE?UfL3OEeW2|H{QfoqM zd|M3x(ij00>fCwc5zl}1_g}_%Zj__HWM&5xS1wvY4r?WZHzT5DvSjU-7CKVP${*u_ zapUIYeeZ6Y`vb zD~Q=WFO zgDvgw;86Rj@y>}9QiXe?ma9P1VEm}8O0FQks7SFn$ENnxPmHi47V5PX<<%q%zL2aN-YI6dvJmR?=o>+&$wPWhOJjz@SL6|lfBuEoChi)EbBhKhx>`Y21 zYa;WA;7bN^>orQkYrQJy9Q<6)#BvK~hww>?lEtFoi49N8M$jY*_4_m8Rs{@H(&YTb zc6-EvL*4%}>}}jV9{`#o_C500Sw$})$Hk!tCu;A=w`r!NC+k^APbsmGGRTMB@8%6- z^yh_?ZTS7L)d;lAC(|oeuYT!!fVhZ0Go{Q&DQa1gg=(X2<(k1}S!CcD$8lWScu=fW+4T_6fr^w)aY!tMka%s@Vs|lKVi*=w_+7~3D6vZBJ`4hG z?~Q@2^{h6FL=4|E*=)c}5f3IKl*_0m)$tzoM!aUXCV4x_ku^Fi3w%E=ov@lX5uS)M zVw4GUqJI7`vu|Q0k>HNQ(h+PSTRTNVoRooNRFsY13kj#F&IK9d4it=YLfHMjB?U0+ z1pv(ONAlZaH<3u^_ghG&UMBn_A)J$qya5|6uRqxwflb(`Umg~k zc;w#fddtUmmo}T#t1bY;1nVzv1QZMQJBcS39)`dTvpW;cC}Z#FAnoMj1TkiKk&Wnk z2%&0gYjce^vH_}HER2~uF0iM^>zTk-Rc+RDHu#F+{=ibz;kR=LLZa)rp%hI-1qI5+ z#`aE%{_XAAK5f=kWRNcR@!hCf0*2hkNB|>H!}tja$my69oDJMDZsUPHiee%d7P&)g z>e)dM){X}lCwlO~kQ`KQI7+~H>>U(=O?~SWmj;O=gN`MgT(^xSmZ;s|=LK#fOWaVh zJ(r2D-Yq7OfkAeWesWh0Nw|qjYm(;hZ$H?dQI#|aMa9Iv zcInRm3fpP!!ALmrlV9v2_~jgsS5^46oW`B8jVf4`Ltskq9NDE)G2|2!utzm_uE|h> ztKd#eXYN+T-ag-FcFl2dgaS#iYG%baQ78E$AZBO;a!zQs@f}^@v2I{k3f>B1DtN}$ zvYmjO8D0rF^evQ^T|&{?8rImfT>fZ20ya0Yb->Y_O%e3=dk8}*C@h7(10%dcn9>$Ovn0a~GJ2*_!q-HISRkHaMS@TC8 z9zv+Wq_&EUN=$H$*X}%o4j=Qs;cf^uuF)&lcg3+ zbMGF^KLjRsM%B+xaT*+?cf;mSY0(RM_~oeGHABj5jT;Tf#tf7>n2!MA=+a1}sSSC^ z*&btwjrZ4|iSUDiOU}<{D=RBY(WVW4P;X{pLX1#qNH6J%n^jwF)>AaE_#nnY51Ho# z?@N~WsRup0+iC04P8;vRtdg&XOb#Fd4`cK}6wmTEV#9H@Vz^fk9lURzmr_?RvsGUx z9`|$`Q}QNLzCmUmRwIP&~mtczG6WyUc5kl`tyClSTy$v`J~+`Rqyw$0H#nD$%?^M;ju$vaM=HBlkl-K-^}~lA%$Z;#_fF~4-ud@ z;AJV)yDJpLp7#T^SWR9 zv?UGdF~GLi9Kl_tM(Kw^_*?}Nay`+MBHtM4Bve}8s%T;tucO1w#ig>ix(fd z1`&b!eLNagnyblUyC*SZKBrm~L;g@5vC0dB`ON!JgPvGNXO!D=$eT_gHx%?EGgFv# zGS8NpONRVABoh50o8V##{Ly0?DOpMi3V$ew;iYx{jco84AV&>D4aBN4;dAbsjFEN?$R@s4P_=+44Gk);+W#xWL0d-C${PcqdqbDyp> zK*2^E%<&vP@GOc;#$zp0?~!QF2>p5u3bo%OV3`bxg7mhU)t5tvc*UWN>ID(i+2@-u z+1bN9P}cymD{!3fh!_?9S`>D&0r7?vhT`{d4c0g*#8EU0AA9?;QgWj8zKY~kX(sto zIqplJOOhT_AhT>j&>@o9o0*?)5kAS=3VImlIAn^Xq!3w;WHde98V%$k4dQ!%1`2MA z)eX^tF{r7gMP+4=cE1TA66#g833_KYR*!?%zSXfEI(1(Lh_4J23p z!s9A;ml4mMMVChJkv(M}wkl_bAH>VW3$dp`Q4Y;3vOM!?karJ6-uV$tmjmE%9l>Y< zlkZhPOiNvso0!q7J&K`bg)vT~`Y)k{mBF_6rOe*(NcLC*=Z=I5LsSmeOGqe(Z9+yZ z+dXZOU9*72ldu6uhrH%Usww4ePues*s&8CuH0^b##8)s#(MK$9AJ3tJ(y@yQ0$2Df zhu(t>vB=X!pO25%acN9?bA|*1677-b{p@!mu#Mr~!Nh+YJUl$GZ#dnrzCN^Nfk zQ}My+^w7Xm8I3g0nr^s!a3fL2>8bw=gQcOc`?OX zSS{AAx+ZRSA8|>5(~lLYsI4ihdJE#z>2^x(d=aK^d z#S$TetcfIIeT}~UeVu|fCyoh}A2(4`+3~Qt%P{!*94g5_4zlUF&nKJjhcRMUxMqPd zMTBl5BR!#6_+$ZWW%ojn^*Cj@<5DXO;OO2;{7e^JyFST7oysUPA%<@xL_3`}0jg%e z`E6SNuyCInhsn9U>*{{IIb{etu?PJRg{zfnhXA|E;knhKH$`)FNX^<>Z*_feCU}a! zz(Z?cq?7@+V|i~oE+AkdqJ!%Wm{-W|mca^X#di0^Ivo+XA*%k78!@i(6U}Tnt-^;2 zj_Aq0O}s85@-FSmF(zNY@+z*bU^v)2oFHIfvVqh#QdSiKgFImz@1Pdvu|5deSkwy* zn|Z5$F{b?x)~qpNSqM5m=iw{th!o$%S&9fNb=bb+gsg;7R6Jwl8UZ-)>++ucWq zikdnIMgT%L1mzLM%Uj2F+!l!;o~_7T>ez|m_u$U1m6Gp%fENC9GR)Rd9 zhx7iJpQ21pFXqP_4{t8)_oNry7!(61Foz$33W3Yj&M6nRkFTxA96j@x8%znkG+^6Y z&)w~rHL<0KPEgDVF6SKNAwZ?Nf%$8_{fsO8X5po$k438iatDTb;li<5)?UIr{ic_I z`QWRnxB?|SV@gSr2mpAS;#9Q~-)#KzJ`}m)Aii)N<4&4%a8gtfrAw2F=s2%-mkvUv z;7isUJZ|+;qkMbIQD$guDH3R7{!R*rQFC|bhg%sX2FF1&9HHrCY zRbkswJaOvP+l799_aZw9E7o5BKI@@DzXQM%iCE#c*^weA>a`W#^6cy-@}Vm5PMyj@ zzkwQSLP`zx4NXA>L@hle?(~PjH*kCCgNM5bYK>MT{Oy6bQ#WyT9!v+~d??1Z*Nf+u z-Ghhz{sY`3i%s`h{{S%fLzRLqpY<3ygB1UrQ6w;Wu8-&84H4{o8;m#YNhz1)x7=x9 z*9&do&`Q{vH{y=kvYD1w>?N_Tyag6uMqQOZf3)1O0RRP9HFgGs<`oydNuZ#d?i1`3 z_i%7@oTRyOkq-aQ_aP_T)^T8pRu#BltPTAeW)LV2$-nhDv$^-RQpzIlYuIL;m$?bG>pwtIZSw!^(wi zA1cvHpcx;kq-c?}K`vsnZfau6j{*!zI{m6)`4;ioqq!Sum&CL8Pa>o6X7K=39 z!hOl{Se)9dW5(0>^v^6V2193Wp`QMqvYDPC_h?%YKg6|?_z~Os!e={%&x5{9(?;%l zsOM^}z-~d$S!Yiuf`k0gB`nUaqY=og(3w&_*R4r}dNFK^xpgtvMFQbE5D|dRJPgBJ z&mkm(`a{mhs!4Y4r_C>nJ;YW!711=+_;&vW3n4H@Az4~{U`;fUipr$#2$8rK%5Wzw zYC8@--52S@nm@jNH`KB^f)r1prxitQYgVB0Rs+Z;ystC1{xVfGtJf(qYC5kSeuCl+ z-HJ``jmMj5Dj_9rtsNnD(jEHO0!B~PBntzDCgC;1k@ayyPDL^X6P-b?C1od;#4DU=To-|p`j?)gR?{K?yA8-ahkolVS%)R12R$%+I^ zi?GvJ$ZLboWXe*`Ae9OGOT%!HIM#gBZ`{t<*cjKGQ^D@J!asH~O3%~f{aK||5)zWe z>fK>WEMa$dyfLd7&mtuyb+avMBT6v^oDc7{tlbJw=HI zxu3m#PTV{ULi7Tl`&*|YCgxSgo*10vOEbt59&k?3%!+I>uiB_2sEn+HU&1mc;>AKg zyVD}|ZP*VTxW_o>`cZ6xQ+0XB3B9PsL`5Ex$qpA2(!BvbhHYBDb^Kyav*9O7K?8vQ zb$Wz8FMqLO=4;cjX z4K!V-?=VQo!MhTT)wmV0`q&QP9F7hrE=asS!L^7HR3N|BH@O9NGbA$SD$4uV2dH;} zGR7(J)k767E6MQ21k{TFnh%G(mjm5=r&Sd$wK^C|;IZE@1gLUA3X2SPIs2t0>K34g z20Eu3LP0ReJQnh-K?M9HXZ?=nd_YQb%UH(_ql{*mk?&W;dQsLj%l_1Z7%5yq=sKFsIYe1-O|DsH8i4 z9Ptr)clIA$tfZRd-tFDPW9t|IWoN5SZk0|ahMMP;i*l6Xvi4l4{ucFls1uzk*_z5} zd>U1KE4y-OTcgr-?M~v(kh$2oD4imlN%F-kLha?B$cqn2ccAPx(&@kZ7dW4Y>SG<_ zl}9V$|Mn19c93{();iB?jgu9RZKp7J;81iz+7xCM^C*bvIlq<1M18ZR?v zOB^>NO>nH)iGz62w(XWW-I{p;&rx2vAPg;}4U$)1PW?7NAEHc^<1L~IY$ev$YqRNa zg4c3WVxzApuDWk=4PWakO06iiyGqnS_(SJ@6RI-j*Ig}Zr$yzEVxy!x?{zz=ah68} zgfcF5N-vCJT#Z4>FdNzcstA)}?kqmOzVL%`$Hf2=LQb_)%?i{Y1Ob}rhfhILMdgBW z=t1C=T<_TZD?BdEETei{dM-?sQ}A~w#(f$CSRU`Sz9cO7Wf@126HvclM z7E?8Hd{)%j{()z5w~Qm(IiY81u=TcGf?GmfBW44)J)g7oo!G8&soE%MBl`E__cKIi zdWpwjsZd0ByH6cI8zhBtzt|Mmxn)fQVk z0}hII}4`|}mJ`q1km zyyvJlZyc)1usUC6^BePKRUv-0;&>9{QzN6zHQfXw*T*QOFon3=kEiF~?A(3TcVc5h zRG;?(1Oo7=hY$7PQFX@WVPTo+J#3fXZ!lUr^w@36hBJ*#CyCl7FP)h2YjC6ce0l#D zdmHCYMl>#PX-uYM&UJIUd#AXJ(K>Oga^AhNY;L$Xr{AM7lrCpw4Y#{-;@Thl7;%sk zh&GB|oP3?+2(f6Ow>5RhKZPHUiaX;t?f4Q!Jv19D7+r^pt#crD{f2DcSfyLWqs$eN zCE@3P{Z5`bHNU@oG9}d;L@Dn88ljG#3)2<1`JI1!vtibVcBE|E=nu2*#;D6QY3-8R zbZ>_4hR1SKy3Z)THg=47&KGIXBJRz#KzIBsGWORyyr-l#|Mp1gZUk2@KX6za>cea- z^kt@VRJ*I*;(q6y%|>?R$p8H8?dqYIhZ7}h_!*PttpINe+5AiD-{r*3(>-|bV0m~q zEG%rb!wXkCkFRvwFl&n`^eoq_`&~)Wd+G!vFuYM$W{>VqJFfMWma#&*ilQhtTnv2u zZ0cpbf5W@FuGpi6R-?`H_{K!%FuDuwHHoJ`)9tVKkBa>N=K1GaEY02fF~Zgfj+n7U z2SRGp*?!0!ehCW?_o$M7{yY!AGp_D1n_62*oA1$hmR;kYSR&?plQZV<+P(etzwb)) z{YA&s-&C<}&m52Y+{`onhgQ7(coF}OLCU0QqN6X}2_vLeu2=1;nYU>dOwFA zU@@pn=fSH-*xXs^Q%J$4Ed0t^n+POy<6P)I15w>aD{R~@thqX9>=01O%0LkP&M`8+ z1-*-nW%I3l;z%xj|G7~7a{=l+jURSg4)m^@ zW4E`|JaE`UPm8T|(7Ex#4$9LC@pBHXc|i47<&KvDwX)|zOK-R>3Nruzd`kej#}{xzy9{yM!+6kpfK&0=ihPA-G-8+ znJ<|+T^LUSF}`{^+-7O*|NKO{7v9@fD5mxF+;cT*eF$>ZJG*rD+pDIDId*fs*LTNP zcWxQY*ktMKq|z}Q!MG&hHGoY*(R<(bB$}GwIo?asBtXa?UUc1E#SJR|?e8#-S&t8vO|Y=m+07YTp=XZ%T{xYE$Ux8^=P*;K|T8B za4UUK?pr10rmWPgtFKV!{UAjzX?MUuvoa>yJ+8gxRO-9DwabYBbM%d{XZY<%* z@Hq21RyMZQvqZ;FwF23JI;SrOMaZu@Xn)f&PM*8&oO2j|XHOw(?!P3O(m(&OM(lp` z6=hX5)fk#X=g9WG-2n17-B}{P`zupzJiXxN`7Fj&*MvqBDE|Ft9Eu?7pZa+8 z(AVVTyO7c56FyCEp}|(0V{GE$Qrhn^Yiddq#3*p2l)jlnd>P3^Sa}=OgibkyN*Qt{c99VE%;*||4mMuhrsh2 zY$v!}Iq{pPkKYir^Y(g!zTF8SC$@}}f#DvY-e_fI{#}!hXzC0SKT!!fV!hpII^Cef?c8RE-J9x*23oRBTY5kuj0kb#;vSwf{0Z z#PmLK#0$HP>Zz)J>NEc}Q-eRu%Fcd9-{?hDOk`Rld%k^_cVO?gj~jJ6zq0gZ^OT~9 zxo)B(A|k$gqaR=3^8R+-&=HIf>fKDEOA?THR*o#<1BQ6x8uH1fPoG42Cx}^l7M_^# zIYTv<_m1H(xzfK_Fw28iHg#OcIldf^_UC{Xfly3O9-!#CHop=zKpWsFMDEowG&An}#TWT}YO`bgY=ti5LxT(dFFe5mDUY+B5fS?@W1DTMMb4|i0-r^6E3o!RrcvQd@N6s?P>mC>)Be& zv)gM0p7_9FRRkii++h|I(+g*Y7nT#;#ugsp+Mne&nN12G{PR#mjr_oas#F+9eXv9&hm;OlA~p zI}24$^vc(mndb*`4b3`}UJQOjJxTxcNkTq`SIPAHiK8|5ySTZVTP@5S$$iWRxFjK4 zsRFvu_etjBwQEcKJW?_KfWNk!YUf5qA z{c~x*VN(oDjKxK4#`S33=e2<2|SU1yxhMDM$1|T}|@`b=h%2aFI`+e!Yw$_us!@An$1) zAd9Eqx-=jio>^ouXaIkgU}YCHgaOCDf8V)7!9}^}Pw2lJy!Q6`_xMn&il*k(eSen) zb}-_m!)bj1KtO=AE58@2`kq<@_|xP=5M+=fORYHZ%LQ zlKaMBoVch(5M6&+_u??|DwLfeQrSJ`j6M_A;obD$LHp0yPdQXCV|!**PpCAYi0&Y> z_onYIcd~}pcoK9wy-DH}(uM42k^oJ`fbGT391Yf&#u(GvK>PsKR07K7K0|)76ISXi z)a%oQxgUF3_kpKAZ}96gUm|Ct{Kqn)hlwQiOzh9wkmY{ni+ar{DlBeuot2eW_(%=I zSgg4IzH7V*=M#WyXlVuYyAJGT55(P|iZz0)Y^|f-dq1g6?W~TV<%yvq=^U$A|VZmfPm7S0s=C0BWM)tjS-c_TwW>`uGxML%g!`#Ia4EzTg|a0f){`D{jgcOK!?E^JiPYrLpMtXvVdh>11lA`0-0y9FWy>D?>`7j%gFcw*S_-aZJfT< z3A23#7^B(%@U;#`>y|jB0kaX@9{4p*E#XTmpK^9~w#kuKM-6ke90?uLpLg~*i2vKT z32-K$hAbQ&=S%YA@CS<*kKU9!cmD66>1(InSK0_L)N%Yi^T)JOXHU7k>L0E4g?eFn zkeF9>QT+CKpm^YC1u5RhC)L$&O?+M+Ra8;ARstUC1+ia7$H5u&rv4NXk_5+^<@)vN z83k1PIT{)a++ST|Bah%&l!%P1^|v=~9>Nk_VB_FWzV8_WCXISe2p>GKvSRnm+$ZWX z74P#%u@0Vg@((d>Tm?#_EFNgQ7?fdt}hdMe@`QU@Udh`DIEuo`t0=v64c7cCbp;-SQg>4Y2D@@7P$r^^XBIYEbxom$Xvp+3r_h6!1Z8*zqbxEA~J z(m#*;4ea-o9>~5o{d_GJcJua4MNP90JqDK^e*sgI_h$7BwM7_YS5TLJA#YT)waw1S z&2Df01+7 za=-gCoR;dRX6J*{8UF+;L1bbC zp^j`!E^WV|$%Hy;xVK9WRM6;j&>RT>3q>*aSELp%zP|+9 z40mfMFwN#e;E$Grr(#||`3AM;bX~Rpied5Y&L*6|JHXy(#~D-|&J7}^(7+R;q#xc_ zsRCyzB;?$+c*WZ(?SD!~#Eu&5Nywe~^~qTCwfPZv&^3xBkpqt&JyJny75~#(_kT@0 zq{m&7KQ}&(2=v#zQ~c&7U`l8>^60LNa4BlF#9Q!2E-uRb zvC0K+6U79e1H`KrK79Px29$z$>0oB~vx2F08Tl*1x;@W$VEA+O=}bgG{Qcn!9Q@RY zR@EE4$$xSD(3@L(YiYnNAfV-Y{&w4UgDOzmskmxi8uMT8Po2y?qL2yxNK%q1i--uA za%xn_xpQ^RqK#C+V(+i+Y1ntP+|T2n{4f=iBiwff!VIDnaW8~YJR>I-)PsjIGUC^- z-&5E-8TjAC&lTC&XwSSbfp)@o{(*Z|XBN zG+0ni2{?N2sm_Lu#muP+a}gC(dL zMW`OJVG$+e!Kn(r!S@El@EpxKR#6f+_y8wc_s-Y;lMDhXuzX67AN#?Fb9yXjIStQP%@Y zf-=ZRDAj>Af;|s@d+7Mz7p{EnqbF`~nu#{`Y&^cCdK#BO5oUXK=(|W3Gsq znWX{Akru#|8?ZH(_G{icpY)Ae<$+<)-qE^o1r`t7y|lu@PZEb;9{p!@ACPDJ)S;<@ zLNN0axHW?r@Uv)n&|koCKZoVJqGMqZrKH?`_6(i56U(V;G%h{$j=mb(lF)(AAOGEk zd0&1evWQSN4bt;d0m3yqJG(ruT~E-A-nn64uigo>I#3z7Cn*mLA+~{-yq3_F8Hp%s z$oT4Bl?v!+O_YLNLG?eB(EJkBFDCux&$Wc@h7p_8yu63kO~Da)R!o7~Q+Std^6;pF zN$G@`6h30`v?s^7c(IO6RRthU7S!H}xqkgR+s&ev35kh~lsCTh%sPd9jZ!o-`w%6k z^aSPk0C6`^L4YIhm4ODM6?V;oTX}O^r%(aXI?BezNgzgI(bwQ2MfVR#NY#ch$UMsK zn`Px!22nZ%(XgP8jIY>H1se6|MiVYUdQ>VG zrZc@Q=yVT*Q}wT3i^3WQA{*036Rw=gsl4P(yJsd)R);C+Q+skvbNMc#$A5pmS`2Ik z9J-Sgz7AFK;ll@2L&JpAr-Q>{#*Tm^3Be638%K!$H!g3jD~KjQ1-7-dEdwLctiRCK z#OKu|$k_@FxDqp2Sy=c@2T* zM7Q%G;u^{wK8sR0b?#hJAyZJR?Sk#c561@Ia33>8z1$OXl;d3(4P6HOBN=&lFn$MH z;6@zVpWK_yZ5H8z)j4`hQSp3rO*Jbsvl=HSr|6b1#TtDZrH?poq$+RZtdEzPCL5bH z-+`kS{@qIMw{O?Bf!Np%mhT)BU<`bBAP9LIfc7an0R?O*@8H}Dn7wNN;S+WL4C z>M~Hn>YJ-1JWyS^9i|jKcGf3Nd|uPK!~e+LLEcb&@gls-Q)(}gx{xj(D+08~ori%_ zmqu;)xSi*8kV2H+?*^}70TI)%=lqL_IS{*^tPXiqAW9Pa>)fgjkKhQj#G zm?ZLkpow;68`U;Yf;)lw^l$I)r;GbgMsS-2Srv{P###1t&DgwZ+u7dav7dNc230h@ zWo`v~tAw)p_taBl(vUuA^0qg}&U^_EH*?}k7I?AvZK5GOF`Ua34Xd=bp(vHT5Eb=6 z(!n9mb#*Q?DvEym@89PwarXhDiSIGEn4X&Y2+9CDAlw3Q_^xI5_xnyI12f;@-n_N; zFe&d(#@QMjiBf^N$EG2|WD^#KmkHMadVt~=zDOHrk&p{OUylLAmne~cANk&vseKQ= zDAlw%hR~4~EZ|7^mY2t!TeX-P7bgaZyN-K9?ukz#dCdU2hgt$`10@uQqUP!Lmi(w2 zf-gXioo425URxxvH-MkiwYY)KVBoiVh#n!DvgasyzYmFu z%7DBRD;JmYpFe*9wz%)V%O(wVo{9hp;&- zeIB|4{O8}B8+$jj_nY`0#J2b2g;)RU?R&Or@6Ye{fSE`Be89%ec0Tdak4Ku+bDOg-vb2*c+ zuL1u}T3Pq5%X`@#(^$`p(NRPD{rjH^5DrydxE5!SF6n>Q0iWllQ&+yZ!U9_0e!Nuk zpq1mcRFN_xIHs2QIIYkOGg7^>VXdZ1?3&2uT4 z;#!3FQOPpY1w=nxN(D!M;Eq|&VZFN=3&)Q2k{c<@7Dp?-ggW=mw0M7auD@N7YCBdV z5=#R3XR76Lre2vAbi~3#J4s^g6zbB}eE)$sR>Gk-2Tr%NcL? zwSecApyRabNKZ~j2R8)V{nn&rr&+;NkIfUXr@h71#MeJ6We=Bx=(-qC@jQN_s%Q|e zZ@8cO0-$wxzl&T@J9*CxjGk7m2_zN|@jyrnphj^>ZFO}xHN}IsDW;qEU;D6>Jke(8 zu4w+`re{BJFmU!m;n6Vt{-I{_$V$JsHW!})$HDXDSD2?3Mpx!9DczYLu43PHU70g-((t}!)<{rg?>p}+!7u)9eRd-z3x^)J!`9wl zW_GCW4!ffBcSg67?Z%vTc80YXZgB;4k_W=Q2zlb+3+Rgg1mp`=Z&FA{t8(#^x zBDCrvsolPtO5-P9Hq74L8+KIabjy6nRM>?9r%jdZjlo^SqZU~kU6Qb>IJ-*p`aG01 zlw$1_It#&5rbhlR;=-ozavclHZ+vTFk*Du5v0;dG#dg7wbbwAM5X(}ZIy`w&)x_jX zh5l;q0)BHl;bKe>u@zdg;I(tg$XkE=IvI2JkBr zkK>}fr&hAUpi`G`G5D>nP6j(!x>4tg?#n96$I@AHJ0P!NY+?czkp)mp8LL;;@!dcii-(}C71?=6fO@Qr_(=LtJj^RxbMdd(k=$Nd zH{Eh-JR#tuw8|*F?IiqW*PhC;}W&kJP)QFyr zE-+2AELqtYU}ChRGqJCYZqG9z%R~#k`1xL8--Tzh5vuG|M{E}sXu0{Md_{CMu*8Xz z7ukKQ9p@VfwC^OxCm35fn1|w!FEum_a`MO(2e~GHJRr6`1Mo|IC|)Ro^YZ2U6;M0L zW7*4%d*1qUjB{aO!4z z6^gF5be$CGIPrr+hw%0(8iW)uQ_pN`65}=@OEAxCNH25|ROXXA&-HGiYBaaj5lkX9 zXNQI&W7Tn!%ru;%tEZQhBzqq364PkXzJe_fYUo<%JUIpMNR{#z=)0A(3zuZo= zZH&B!2NvF`%HQ6YdPaSh((4bY5qnf9zv^a&{`s193jMsjixb zkV<$r1c)vnTWa@8N#lglPVTADKT5{G&w3Akjdc5EDKP_fp=3KphXx*;(3@Ez+mnyY z?{NEl&U;v0M<)aDy=mZJFS<6YEsS-7`|CQy25C`HVKR>%rLN-KKLh>^7)NzYO@y77 zm#mD8l9N+D&`tnc5fQNa`@Mc;igWDj8RgxV-_K-Kw2pgt{+*9^)ju=;EuTpa zvi^ocnJ>r1nfzBvgb+5uxvSnSi%9eXRV`hqii!Ozu+!6nZlq3tcZd#+m&M;ry`!^I zfS55PIy&>q7n1rLXFht?TelD(24^=eg9xlv;dd)>p~!pISwOoi4zY&h2xResuTcQr zR?u$;P4}j*074;SYik>XoEHc?HK0pUJAmj}629j?pl=10-OM;V7PHKlu~bO4((=D`B33)cn-cE zm!%=XX=b}VzPa8_XKF%NY&9Z}l&*S|n?MA{W3hHLG-us@2tQD<^Q6r1P`bEwyH_gB z)APMypCR7avT7uRuu~lh>PR#txeA}XcH;)dd1$Aup+Uvf^{Qs3+PSlT%{TKcdrJzO z?B91vKz!%ALP+%UtC5kF4}}yM;CFJd0!fXLyla-8w-Vph6TSJ*do6@ph5d~x?|hjT^ONI>Dgap%xd=4RugUJjQirGc~dwRP1h(V1v@Ns(TY8PHaP$ zW(PJei0T~||4MJKH+yvf;4CyK%FZqak)bjW6&<$8c*F=4Z_btAoJo2GMqb>I8$;7r zZYe4$1=SWdks+H}B6n;GLRCVzX^bKWckQ;KqN2=`C!H_~fct4BY5=O{T%mY}oFclN z*0t)*4`JGJPlCJynP;r|tAEKxuj}=QtRkxfpnEi1F*P=J<|F}q@rR9M9?#WN zHuPhsoQ0rdK7?stz#> zsM(3G?nLrt;Ujmq11T8WUJs#WTeoh%=l1*!ckxycywsh0R+sFX(wH%bD+FBw3e2J`~+t+fTMBDbGu;J-t&xEOQ?unTThrJSZ5%rDvbc}=bPxx@ zJrgo&$a>0ZdIYJRVIEBV92zK6679V4#nX+HC!jk9R++fisva}Ie(P3CS$n?}$C~)1 z7~=Lq|Cy|0nQnHl$Ae-Y449AD2|_FCP&uUo9AF_sPC ze*3I4sjKq-YjVr$ilv)o9a*|Z2JD9%90~nNHAZ8QHBB_-AW!wkCf53O0wXV(R4%MF z%YVDsI_WS4t%}=YlVIk~IqZ|`=w+hVU(Et1Tz%DjH8ojWlU3sDBP;l6fdRJ_r9{7z zp*gA;v?w>B|H8G-bf4j(!#Y9=6~&VU=-#}I!!nRZW3MpuJ515kDjMsRFSk0M414C- zY@J+^v8FSy?L%3j0pWbe8Wj}-wVYi}~c0;^f>-+(-N2k0^q*(WOE z7pPq@7vL`k?W`13tUFLxm%TA>gOoo6&?XdZrLipFd#IKFWcPq3UEhOi7y|y1m{?8{9l8BW;$t zyE$-xmd{3^Y;K^)UR_vZtVrv6Y%@@_utetmxFfsEkD_VD}Su-zM*t5Q=RrlOZjt6 ziytp_B+1@$B=umL@E6@WdD#0-?5=(WAC1Vsq(DcuH2--HR1Gzy<>L+pVMqpp`)DN` z0f3UZ$IjY^d&ME=&Yxuw6_vk!-Si7U-pP#-Zd-4&l_%MY$GiHL2^IS3orqgVXstDk z(sduvNs)``fEuR|I3o$S&Kp1D?s_}mhA8%W+b5Ac_+WWate~fDE?)n(Y}4725LN$* z($do2n-7~@3MJ$8k6dZa(iL>%zNdaWC#UHvdAd&@Td_hC&`lwHPiGL!-}Lx+LSDd$ zkRd9xW*VrxMlax?u(>)5LB>m3-p8sY!O85(st={4FjCk-tI1Ba`X%jYY+$1eF&YSj zdEkG|4wPs^rdLMhaodaATB)-569ea4E(pvhMMF}nMK=3{;2A+?R+50(niAz35@^4f!r`59XBSrnx55e1d@%&N;ET*emMx!VVI) zke1bg+zl{vl);fGlWRT2#DoP~BwsM#q+K?5%m{f5(4XqD<)R*Q%#Ta6<)GWfMW-~a zm?6T96J&S>JxrZ=Oy4ji#u63FHu8B!KDz!8O{F0)cl3qLQyhD~rkf~v(TYM?pVkSq zKl#tkT{B?QE;lwYSZy8wbx^Rg<%BaI`jO-gYB6Gc!V7X6ietiaMb^dI3Cti59NR>u z4U5(X1!K2cTWOs;am8es3WxQiGU?#tV)NdzjlSK@+}h3lJ0s}OSxA)JUi;+Ir!6(VU4bO3@1|Kd>@|5%sTkn15jlH5GG25#@e+1EM=@6Mc@9VGkrEdaK; zQO%L^yrCPT>ng0z>6)RIsgX=3qV>XF7o*~z!MZZmx3{%@0lyElS>YG?NZu!q0GM}a zf^0wd~?T}20D-?O=L19SlIJhJc zLN9U{-RJK|JI74&Pcpd-?<kk^cL9t6(>h~5b=V3u)zlFVUJPT(CZ#NS4QcD!9jDFsO2(e;`dqz-{|faj-ty-8?$BTG<- z8GY@KK>_jg>ckXPJIS7?$vx9{iZGaH>c2`ZuzA67RIfh0;Q$T8nZzIbIC<`qjCUK7 z;^Els&v{xi#a5eURNKUEjQAEEeO_}obtzy1Pc(SS7CerKQ)LU?bSEi>2C4|7D1YfBkmo#QEoce}C?+7+NZQb+3Qe<9-~09vlovC3HfYi0L4B4{&MAVERHa zwA;)BH!pCqz$YprGdQD3Ej-NjcQH?;(tTKnfz6O zS5+I1`o->4fIU4a{jp?5{m zRV3GC2d12I%g9MRxtP+m=1KD3v0bcM#WP?6Z!Z;@_Scm-VP5P^DNbg*XY&|ZbKSD` zYE`5ro#%wC=k6*=Jzl*7CC- zK1<7>7mB{%%=)rwp51ZW_rO0Trc4yw)!^8)f~YyjSy|Nr2k=R>0ItUL9b&V=$8uV? zos@$70Y2`&VEj50VLD5Cx!T z>-W{b)E4pPd?0%`PPP1~x_Fe=UepC|>^47qxvn9@)Ap8hvDGVLAk-scpS5Zo)bZ$x znD=wt_wszY<>R#gaFtm_MD$+!6z-snA^fm?J*g)h)4{B12M~o5p^sJH?xH^zMmR;n z_m*R3&hL?A3ZgmBuWhNN$ucY`n4&M_iYdeEF5!`FM@JR~sJFVX_D^zjy311VMPkh% zK|u*}(K>*ZQdG920?QgB?i0Xn>?^AOcSR5TCty||zdmT$hg0`Cp+hPgu6j|25hq23 z>aUdmb5^I0y<${`LrR(E68HFo>u$NcoRh8s0h-|~@dYjc!K{qkM57b>4dC31CO=c~ z^Yb&-m)(Ro6oI20XP`!Zxm7C0r=RlT-EVTM6o-?NlJxZ5AWeUOp2B@$JwbkXzg39*nD=zPaO+Bg4Tef8uNmG3bZ5&V)wDH~I7IsqMm$l+`Bv z{`Tz|MQZgj)6Qvj?13NFJ#E$OeV}n^ZCWd7o9VuAb&OyBIqiV9MZJ@Jv0-s*qhpEt z><+KRTC>h+V@OvnO_uAYn4hJgA=cwCx^?VR-G7J+9fyueAdiJNPZe;6uKccyJr9$!>2f-7TLKxC9Urz#b4hO3rtU2?1tY`MHt?GPq2Qo0Ulxzuqfa ziEc%i|NKRF&O`35A)p0%DSyPD7uxmnY&_k0P$ua7Qe?;B!_K@^voG(FGr7GHpS@l8 zDGd|fDwrE3c)|g-W*%~l%(}qUl?3FA=Uv)ZH~uQGbl#^%2^f9-T#t~qC+h3#Jt9bs zX+9(Cvw}Jblf*Sv9lay3hCrr(4tFy&2jIeQHB0GDwdK~N7=b{$d5OOKtfkuX=g*_- zCwj?28LMS|IOiS_hk3DRSJB-mB38#II0k>E-u$XJSSZ$BSyDv0vYG?o@A{E2n8e|B zYt;loV8(hVJ0fNG>rXUA6M56`Z+P~8e0jj!>iNDMUh6qG)>|xmB?JF~fyT07&sj{T zY(jIKhr%tNyWiz3F;ub$2zT{sQa0~5FPN=!m7XRCIymiX5@ z&3!I@Ql`k%(~}h&4UpuzL-at2E)5$rqEjoOq;b&^`wZ)m3O4rRhlMQ`*SUl+FtzBO zoTS<@S27_9jtG7uX0p7%TzQTIBnaT8_qF^%g3eA}p8NgOfSM#Px*l62zh(A*8$c&+ zw+T8cQ551n)Th4ja9ce%vq@hwB|2;<;g;$p+=#VERV*b_kD7; zo)z%=_$J?kB~kCajtM9Qh*lA$5D8&r2cM7K6E&<>ycE+54a$-MdBt`0P6?dQbyqZo z(6aFh#om1mbU?hpK&ZKj!Y9(*)xo$Q{CZ53K;xOo@tCjlWDszvY`Ng2Lf+O^QMvGG zGg&P>R3Ydc}F}jN7Gq>;A?rme36x8 zo#;YaGnB4suG?K^8olc{J5fHR?T~wT zPI8uvtgtA}p@dbQ;l`*Q>pz}yr?IM-F51Pa(kwu;jA~#k-ImXi=%=cYqtE^3D{vU~ z>BMz=-JOd5T(?lY&E|S$N!45hc*Fznh|k~=SwUi%gyR&gA^hzvGAiM<)W9BMY7B;6 z27=$vFVIt}PYOFEUW7=Rzw$Zw`P9#G$4hw`I^`-=91ONjC5}#XJZ8O*Zv-&e^JnR9 zQlh&`i)4G+uFsw5zj(P-{AY)j=EYBLH|Y98h~q;mcD! zDX}fE0BKM9oDf39%FN)oFJ#4398c9g@`Jy3F?vVe@-h>UY=C=_6K>FLbrv0%-Dko2 zyBVL>o}w~p{K)M4Vh7h9UXj5`qG~i-T29-Vo{G|1Ddn55ofx&$!osPUQf*jL@pqK% zg4WG;{8say4A}dMilp+~LWv2kk~eSOwq;xDu#a!O4RDRN zx~@lby=^SJPTb<%A*t?5YwoK91tM705sZzs`MVQ{V1mXyj_exf88G@S$*kg+eoBKj z1?EUS_4Y5kG!230B?QeC%_>Y}hOqXKUsIlSHhD_y_6|ZnrW9WW@Af z4}4AodZ0G1wcSmkR};PM_6C(rPr+P0Zr=x@PLV3(*W8>Y=g7Wp7Jx_`d*-^cb4L(# zBlS5@RT zrF}d6W%Yf7H&l}z!`WN)9Qdi<2CFg?1VYq@|n-I}JekRSl zV2*wBEBpGDPw~=0l#Jb^oanHyRNo_%$A6bOdyMreFO{CZ-H{!fE&Uuc>nli95rDp^ z+@AbIcy0)&U^@WmyY?3VUn_7N9BEp9yKh5=+|V*gkC^QaX#v*TWRb=vP;OW!bZhP` zAS>WNxbYpBACOuSZ2{A*tZ6pg5qfqD3q|Mj5d$5ucWL5=p6 zwhhO*imwzEd2^F90dM7I*4%`QSz6o5VhBh3iVX2X+|9$rQ`+_~jo5HgU6T`04$S67RhJ+O9N8(F>HB zBtSMT&{LIWw!dhP1q&Y5D7hQBEXvTTJ8i{va0ModXhB!v*2&Zw3$a2$F~Q=~~;*k_&2 zZg?I%=Y6U%H`335_<%#V?qKaj5xiP!FYFzw!0|Bosr6nManaP9PPV zh)8*jJ=a}Y;^5|-Guy7i$SbWOFZ~dMSp>sB724^+d3{e>2&!4)-&|LxQ;;O=m)rWq z*FIe?(#Y>{)KG);hUaRfIC^lal(zYatSsJ0UIfEf=8AX8xM7dUptS;sWN2A5Reos4 zu~-h$_+Pl5X=DZ@v5Q?2-kPu4fMFiGI|#)a>V(^%fv@9CHzy!Yl3rV5Or3E4(O4+# zrX7IRNj!r~z~JeGhDtzM?Fa>&FR5G{_p*N(h!BsA@bM-rppJ*dLvg<@b1 z)P4Xq@nhxonYzTH&yK*FMi`K;z~py?bRAL)QVh+amZ4RfIP|kufH^GI94C){x9sbm zbg3|CYlJd`%!PiS7%l&8Z^oDxobV`ih6I>)IL8T^O%UM9)l`}*>L9%%f~Q;FYuKAq zjCYCW05IjcI6aA(<>@Yxz1Qe6LE7_q*1tAJ61b^aKc1Ug(%d1$><$e^`>1P1Z;pA2 zC7!)_GVy%%zK2N)vsA29Wwn9R=HFbw6^(eEz=~zsk|#JQnpW7 z6I8z(Pe^-p^6*QsYoAe@t5Ow8P}qL$+4cK#o5eB2Mco%exUNBSQ#z3sxhvzgzvDYM z#gaBW=`9LtN(BUf<(W@#!DQwKs0|$xI?t{{Z7m<6!KCc_{{0O`w`)Ma^;82y*mBI- zYs;SAX1F=QcC3H*kX6nfX4~#lqJfvGgwL1EYy{H=Zcoq|*_8*v>YuvT@25yhUujjemwry_!x6otQ~m%k;lD$VVx>+)@aj^;l-X;K!doe}>&Pmhrp5 zc?EEFCV*D!*WWfQ)G{$?XRY*Nvj9%28UFEl3>3L9umm*no+~y)@pD;~F4XW0l67@- zbjIg5cQ#3ZSoKZizt%YGArbb9twk6HXleuy>H^FZi3W%Y&p#^VdZARh zIwz>8vTV#f_&o7BKFecysz`e#hbV6+axfmKy>l1c-EcKtMh%#Sb<^FC0eu!F>9a>f z*Y4|VL}EsNDa-j@WRedI3cB8!H*K;|#pLuJhI*Z=C|jwZ>mPesg?siVXl?%WD!wqY z`meN?zLA0ojSNgnxJo7b$==l3(-Tv;=#}Nm)g;2P!%wc#D13VV@A$X`k=N32GHW0~ zGuH&uv<>}N4L4^6JD+crkVqMdT7f%V2qikBFd{B3WCvM%*64dS!w+6~>0aj5-}$*2|5>0-ATV*rtY^@piyb4;fzYC3CQP(~1wdO^a?{*@dtKCJPfKjT6X=V8;`~H#BF@u=-&3~VbCP7Y^3DRbJMSs__ooJLh~dact)ZV_IuB6gC9ZvzK48 zD)O+gD05u#39x`uklik)Ym^dQtd@qo>glPwwH3MgmO@>8_Z~Bk(Fsakm#UrB@C)v>nTksOg5S$|DpFZI-DXue4f?xj z{kMO7SsjDrQ!|^no!@;o;+}PR4HiEMGEOG!meIo)kY+P|7~$bZx2h)Gzyh?7!Sfvc zE|>3y_fwtK4CXLt{K&>p!Dr&NP%Ypu3|n2e{Bz0h=UR3r?QY4A>YCZfV)6uQEUC=< zU218m5KJSaL;6)akOs?YMwSYi_{RK@*_%cqXeK2U1}2YXMP!_lEzD3=+w6sG(($29 zR%Jas#)3gtb7X3BCnM5@0{WB3RzrQ8%DA}`7$tPz0df*t-D=9~Nki273tZMF9InwE zS@!oY>?gZiW-5eSyxcdW$Gtw!4^)_F1@~?hG0vBNzpTx)<1bA<7I*my^v`+AH~Uw= zCiU}G!|AquOyi6CrX%rbs2sfk}zP2jkKfGMwnkicO_3PJ~d4uMf zBGYKvx3RzuHR8~iSJm<89A6kx*Evnv9vfic;Ls=X0IiJkMcdHW1f3V1=?>xVT5U-% zh9`M-KS7*1_=9!%I`erBJ$i(kXb7~5h50I~TBMC{pLK=D^4x$R?f7ZumJ z#qs*FPIZ0%15`qHvWf}mwEi@w7T^!nKm?#ihBEs>2Dr^5w*od0F(&@CuQukZX>v#L zlQE|f^;~T;NoSzf+sAMTM+{w9^;EJ!!R%>dO zJ33S@`rQhd9J@8&Txlg9Hd_68MM{HgbhlCSU~A@PpwZHn8u*01zn@+CNORi{5=y^- zD;(`G6wfX=cUIdH=g4i{dPOZu=c4R+jsQ@yHGY9?yGt?eR`}xL30>Q@*|mCZQhoWe zhD(i0M%5qB!NW)_w05K|)DW>XfcXapRP>lcR_m2*KCHFO_x~C>DFwtbL`^B?Jd?f! z8@06*%T%+u>vFF=ZTL)~`A@ffbRVGs|2@b%V!MG~lnCScK8J?VAoC4?YE})^>4u}f zJ}f}ZNDXvj!Sq9giLg=IH);M^7_J(a2yPD# z0h{lcb)=M|azhRUC4A>Jlu_H@8c2n*>kUtfU# z%E*7u%l}sgpANrz5amtAmv7F|mCWXA|DBwa^7QoNw(92tHa{}3b8oO2MDC-ISo#1A z-HjMlIErL3P+%(cFOM)@KxV%z&-UHZ%C{)$T0)#)80qE*e1lq;Mspe{%kB&fLA~=Z z9bN*cHRfeQ&=u{j=W-%br)z}*4dg26=q&RTgUV@cYn>IG`7WL`>Bl50BH%n%N^pTn zZQEa`q*T&&Bi!Y&Iz@Mp=EH~^%u&8}r6!Px3H~=M1)^Xl;RveRhUeq^#~$+gQP0=% z2b}r}N#&cPl?SMFQanW<#&Lnc%X@QLpklkDZRSxta0wt3P$q6Sf!WIMhTi9-P@FlK zL}ZqVrX>=>Qi-g^#hB#nXu@P~ZeX0=sCs*XMiKxLR$){4Y%2_=Q>}$Qovvrko`sw2 z-H6dEvNQH$6c&Ia*99!FfCN^Lpxi5pz^G_oL_9WrK~28-b#7#C##n+c`$y63X?ffo zt~dekcNw9!Ltm{AGTXPjleK{1N`HjjMr;N=3r+}%kl7GKHyP+_%nU|_6<5z*lELZD ze*3mR1hrBI1_scdnvb^^f=n>hd6s>=`9q$Y5OC^3lQEXbVxTVZBh4obH&EAdpq6NF z8XR~ks>pm0vM>X55jx`Yy*;s0CCv@;av(i)rk=GV^$bF z=6@UsZVKntbDd7Qz-Kcou$pVplcNHR2Twx5#B%_J2GN9c}itfsD^ z5jG78K-?x8_Gbd-3I09_e1}1%&~zs=*Lcpt6ubzW+AZ{bD6BFTZA(QQ|O8RM#n1(hI%JK1Vppfr_gLXRs zST~AlYUd%(umJvL4W!M21In_TU_cLo(;!+1{M|7iLIyzWvj)(l5e%$U1h8jFIpf~z z!xSF@pftq+jwFtFv|a6fU5!x1VF;6#n$biMt5P6u!GfaVE+bNXPRqlq?Y$RiK@-0M zXgS~d-{3^+q4I1%s8n37z;X4Xy5>UKrE6&17f88T=(lXQ?v6k94wz&AJNx!;{0f&6NBndZ>B6;U1MyLI%(m z2{b!x;d_>+T8%mv_$Q;zAhYA)x2v!_tTTz&3NTo|%-BM6RGLzqD6%x=6?GX!yU!52oeoYksbfe6LQV@(1HO-`(88911e#{Vb)K4uLop5Z)0LPjcQcZdwX|cnwp!NHQPU5mFn7D%7h0^JFHF? z*|+z|l>`Wc{>jYdGhP56YEE*%Y`b;@{%+0%Set(z zfvZ_4w~Gk#jzcxSKfUkIG=xk7{Zn5ryRwB>Md=QiD~1vk6j2^vw>n(5K$_JB^a!X8 zFqIl9E|%}%L2Rw1T>O>h(AprKI$);A+=;#Iz|-t@8JqD^V%IIsi!p(r z1kcDZuh?L@(+$)lobP=N4K;w(P9q% z)A9VoM{*|f2Z3a}iU2(c2ZgL|?uj{)5-7CzC<%{@ zz~#4hhat0U6x|h>peb+N*n%_@Rj|;i<3%xityV{^fXZ1h#Hm{X{cf7yZgs{os0 z4CB>uqeS3@sV7aQ=I@_6K*@J0C6<^~lBMNA@3plctuIdzkKjO2lV*Tv5Iao8kH;Z> z=%Z@YX*S!Dy+oH`Tw}eFhoZF^u&JWp-&f@f4JieeV34tKlK?RT=Xps>R|TkPb}Q{3 zaF=+Ooewu+3guq*-%N=LvfqX}AgyVhT~Nw7O|hb0p2^?=sWL9X09?#U7*AR;WgOA< zHo=I2^>`c>24|v$<&g>Sa!inQOl`yA&WTZ7xN~Vw!=blxo{OhK{%f+722qKKx^pBH zTt3tS2TtEkPaYX$S0=g&_xc5Gqe?oXfH)rqu#h?9yYVdbk*21m2|Q&u0BXXB=68)G zK~-AL1P^Eho|wqc(9m@lRh!$y1nMB9))l*;1mcw~x8>~nA=9kc>hD;e7OU;?2U zQf0cg_jnu$oY4#sk&UTDEwAlNbLgI!)<$*ti7rR!{DUTYIB?Eb`wEKd-iX#kP7bC5 z!3W!m9f_{`Zm=yfJQ--{5o3<%iC^&D^dLDQF$KWUuCXeaJr7Rm3&i;s0YNE*?oRe1 z!?$s;vD`!#*dqP0BETXSU^dn>9Go*fB!9r_-wDj@j4_-?TrccRB>A!hGFsS;R8}Bk zUPnR$Dj1;d~<2^=(6#L8^r$F(w=i3;F}Ku-7%8Z*Na^I)u| zXV(vLqN4-!!=a$?3Mc~%_=}RjO05OuuRM-du;gF(b!P07IOQL7B)p;n6F(gV0>2<` zAY>kz&~&gD?vR+=b3x(}7ev(#eys(`KEqMAtaMAi+&y#h9(d+Z*GUUlwk}NAt+hq` zsUNp?Ghxw*fVkhwTHdOFT4T-HNXvXpNZVIv5c#AS990na9y1G?HDfsfC<>+wP@-^K z1iTtt0IvAh8RlmU)=&@93aK;nYI{pZr&b0DdC0GhrTKUl%S}XF0$^S+Qw=Pcc8Y!K zZzTK!@{e*Jw9~q>vn?B(7$_nDJ$2p*M2bVuHU>Ug)5akwztWf( z51kqBBD;dt<#Jz}N6egBAHkVJ?eF`m0lx)eL_A!VDLkUYO7e zyT>s?{8z33xAYtwPnQ{R89}@PpZDfX(_)E$nu3$XW?Q-M$U_Lo{A=dmMNs+=AqrC; zu_6XHZ2{Tk{YNGEg}>GUA`6Ul18xuTn19>9ytN}V6S9qe>XP=-Y)3B zi zn!;oC;gOgpw?OmNzNQihJ99xTSsklqI}vVL1NmAeNcTO-Y}_t^mSBG}T5=&8v2Eb2 z{RJ1$8Cgftz{T~P!GC@k1q!Q8U%>dpoH~Vcs!D{l>Wm=~+~y@8E|%p3Xpq+>oMkRf zz-bKOD!hc?AZR+%-vbQe`0?Wj;E>LhE;X^-y5$Gcbnor#tX9+_I5s$s(v#fa zFd)9YJ(TPCxH&>@v^wtoYrDBh#yd~N8X|bu*4KCzW<_R+hTsg^LM%FNapC}KUYEQh z{T@-+8#}5HsBj@C*aWfHAETf-hxsfLFNXuw!59Wl=@~Go;=pTSZG3_Fs(7S9o4L>` zP!){2iU3#{)Y>Gqr!)%)2jGf8)0jI_Al~u@6L`zfWu8i)kh8=AtG90w-B}yMY;Qdd zzk3}M2p3nKE`|n+6MkN;5;UDI(dyUl%dS**Q+reCMuiw8kEC|Hk{rfuqKJ-biP@CP>~^PcYG&G}Qi|-3 z3Nzzw1{HIk)ScfIRfYmKgpfCt;L z)+Kk@lo<< z-ZbAAH-H&udgPX<$dedayJN?jP|QLp#TqrOiFL4`4{CseJKRoS4}pF#4#ry=g;w5R z3~1107Gy#$XbDxyd~BW{pG#yDhc~KHSuAJlx7a^@Cga<50RKntQj?b;Z!I6L8%S1n z=u((jsjpvMnl7Y#t1!6Tvnl(4c<|SZa&&eR)g&3@EJb2S7Uk5V17D{k zyy%H0WEX|1t9}hW@Z7F&D)?Z4ai(+}f`&vHhEKYV)Tuz@H2z?zVO1f`o+(vAAt<0P zT)=uAOZlo7$RtX7osRDYXnBod3_;$9kS_U0*El2`D1ghM?Bsg~&z#`ZBg0GplAWK9!^owPareR8oy*5wufJ8v-BV{;CN7 z(Y3k=xu-4EI-4D}{LyFX(#Ymc7sQqm=jPJ585U`(n4x8~QkjUbaUtqVX>$R| zO#_j7R{5Ia!r6g$X3wGBqlM@nTiq(sIkkPsv1RZDC0*fX^klK{agp`GhzcplAH;%7 zdT#8SJto@PKw@+~E`j(wUCS2ncsCK$?1qTwr2U@VFmKG0zMzuQ1i<2`v8ftb7xLQ5 z+l7`(kg-crvGL4k6VXeyktPmf4P90a59QX6dasyq{Rme5c9(5}l#ss9yyob!{^YFT zURqnKWis|uXoq zKL{&`X1)Ara&E~WBpy!UUh>Y$a6p~7(ZQCiD~7E{Zn&P&;4)EOPMo{N5M1{M=e%G>wgL;(R<^Pr2aRIddA_BLYv!ohLJzCLoAe&hbL%Q#r4as>Cr~R|9f) z)E;x}_+|SNs#*Kg2V+iNiibS92D!b&+epO_Kz!#VnRIUE6G&1WyUA5Uk?>=%MgXy^l-yC+y-hmbce0Mv^hqVWL} zA|7b=5}2+a1iK42<^#o>(nwf=A(1Qnqe;hb3qVY2U!M?CAx%?q-{NDa4kxBjs<7~` zxFFd~lMy=o_h7k2qG==oRswp#Z@7j4v`p}D{UAAgqOnfg8;T?Qcc01A01q=0=C5HN zWm5;9J>n0ZiJleH6ErDOv&g4DO*-y1Ziy}+n}ZA2jLb#^W+&C%U` zWgcdLRQis?hm!z=>P5~dmk<#=!5|~@kQhN+J%Z0X1z15WSfJ0jtWt@FF@Q%iX7SPQ zPkG>$6r!lq?yx{XTJ)b2-*v@kmAL1xb8TZ0#Q)*ie+>@?pg?ad z?z0^orjn1Ur95?T==)aF)TqJk->_Nq0wTWvBGode)5ysOLy_i_6b9XC8Ju`xy$t&@ zCteVsj7nKJw;Gr}jr#7+ud}T|a+)~n8xGE6@zL_{HuybDTm7_nGmT^*DqJGNv3GRu zlj{Q+p3k$W48z6hO@M??$kc_1m#bC9!$Siekk_y1w!qM*vYdWTh8Lyj3BVRwd+Hg=XQS7avlwO+&n;2i0(;j_GMaI7fv?QHlR=YmP8`?L8!!=I901anYt(x zYtBDD7*y05zbvcGL4~BUv7$Y*672(f-z{#PG(oniGP*H(*&&TLK1N3o4i%^;L@df@ zPDmx8SvNo?bun)|z=q`1EYLnFg@uK#?U5icg5j!5L23J&)vv`)ovl=KNR0xA*oVo{ z+@z6Y+}`5wmnVo1*t+6;`rf55_%n1+%1xI}>vy^a#46Vx?I?$?%TP36L8D^rjY zNGRg-JR-Ol(y$HVo!aH&BXa*%s7RDk5w5bg5t@Y)XW<&YrjP<{kugd`uANHsMNh03 zCKpKpRgWl@!evBBSPX$nK1+-%i5Bs=jE@Wb{|t@+IIP;2hp7Nm zi(!{SdAR5GPm^cH;*E?E{9~%pRR?F~yObCj+@`KvUNKJ&8Nv!{6 zl$h=!%5MNq`KR6~w+3-pcE}3$-42aYtJUN`=)MVG5)aaFJP<&P)MP(`IHqNY`G2X= zrjjXKnHsC|Q3I*U%YEsGPo>1s%ngv-l!F hBQy9v#CUPzONAr03H(Fb9OwxZ@TD5x}P(t~3Gm8SF_1qGx^??lIuPEZjL5D*ZMF1^Dj zB_KjXAoN5DJwON@LXvl1&hxzA`}g}l9ES(UL2{jCpKGtR_C6DFTUV3)0Pg`dHa7N~ zH?HZkvHkZg8{46azwU$I{BB)s3g3S5ymHg_;)SX{*8-&&j_Hwzj*O4c0w5Zn@9eC< zyY9&I205)Y?&Qp}GMSy7oy_`r6=h}RiLqKw_no!58vj+hCaq`nj?T`}?d|RFi;J=I z^YicDzYkAKOPigak6fL>Yiem}dHMRz)N8Y`T|B(^G5^uaGk?HCRd;5yN*#JLUn_gh zf51~IlqmRP9L$0I_mjQu>+=KrhQIlmSXl{lB}&EmuTHo1=NV+x)$J7j{M$HDy>v_W?Yu^){n-*{Z%dd149YnkSMjeB?S9!4_;+SZAoi`=3wpQtan3!gR z6}&;M z8&!W96l-@?(R;pMjoO@_Kc7}DkXM=yW3)uZ$fH`t(_O=NAf8QGQ$#2EcuB*`E$x&` zi%r(KFuDYBv!e_KgSJ#p#oqD0D5IygZm7CF8Mn#ccr^DdTiSnRa;q<$dECm%%GOZe zS?0TUXQq2n`O59_SiCw*)n{oeiTYBb@U_!^wlbcuJ(rokz4g4iu`o=VFDN0p`&h&1 zEo(i_j*O0yr@K?`SX&Dk85!L%G2uEUq8f5Q7iMA*zFACil zAn!U>!wJvqC6R>S1=0|@?~97M1C}Zt_D#&Fv;22yu^4SL8Gl1_b6yIeDC)OkBCT|4 zb2`;SBO4ivt26}8r{5pzI=4sj`0jr7obS)uf=Ny+|7htQ98{Rx7#JAn9UJ3^5Q)8?w=l@C)-5RgN`=uPD#08xP>4zVDnl(KHX0qDz$ZA9H~52ZSmpmAB7gx zl6GHSzvx8;ZY-EK26zXpb}Mu`*{@-R)CJQq%x$Z517qWp^78V%U%wvF(b18HzbpJW zvNF|0{+6vpn@U9Ih$~!`9z4u8rcS=dc8>o)vwyY6@NrpGId|@S?d$F36bjk8$FJ)5 zXlQVDVIg|F-WRttUZ0hdBVt@)?P8_Bl9Qc%_OO8RajgV#h$G!rtboeI!f<(utM9^4 zsl&sE5sBy!CD`AWv~qbT!mn=+8p37-u^5|KBRQp|(wAIDj>DPgallL`*-y;&X1Py& zjxQCbVIymO*uFElVKeWY@AlopQO1Q1k`~c@^Saju&X^xLMnPjO!~O#niyf-<%;i8$ z4&a0^{1^rWP3~48@!#3neJVugs`r}H*9g3N^(x_uL!=2Do(5VwpV>@pLxXCX-$aC} zk-SWsrOKnOEgIPtd9cUS=TQY736VBy_2UPS1rh(x>@_$C>GFN$<>j)(5c*MX5XiV7k+1GksYL8>OTHppF;rgCASf(P2Y7Gnqqd|vI%7XaTGm6oMMdqkK ztCi474cV+8s&Th<9;=atA4zRx54u*Y2;mawCe;FFTNKw!z4$rh_Iqr%{eJlxp}O90 zVCIq@vh&cg!B3iF;PMZ}fHeo>6fC~)81qD|tQ0Ow&q+{pRp>pM1Bf{sl{NZ?$oKGL(9iaZ9UC}S6A zY-~K8ee#KjYrDdc<& zJJ@U5M3mIw?edkC71IVk_aIsums0V8$T)Y?dyo|x)Iy`eA$@3A*850c1=Rv@DVK>+ zK?0O--@Z9GI!5xy+WpKfnVF~S>g%(zvV_eoEXa^uY@76M^5vRvnz#Ih+rnd(Zk zuY~g|HsdWPFOO`s4S+J7#z%uQ0P`A0|;Rahfs%TT|+@IAU6Mzf-_|&p50h43$^Kcd3EO_e>4& zv-E!FOC(P{U)Q+imkx`0#j0(X7MfSiV{vZ_3dGFK%_q`XyY{eYjI@mxcw04qQPX-K7bL|{ zLKD>q5F4U;Y0(V&=FEMW769n1yu9;Si(istX~aP4S&~9q!EIR4HNMF(wt(pP#6)|m zoL~R}K$p&k0?j)EB{mSg!XY7mo^lEbxKGax+ER&)v|df2>uzq;@G1!@Df}#dKtRCh z34($#-zDepxxQSIHyw~4*-SKZC6P9lo8E4p9_&N6kK&TT&ZGsp4t>uBm_Sk!l4pEL z!M+{82Pz^#JClwH>G*^sUxP!bs#>9;+VXxp24-FK`i zGt;J{Yrm&|6Ls)5ZZo7=?(IeP${rgyw1O9S8f}UN1T{#(n^uspH;So!R}N-q9!2^3 z`r^{m0zC{lk5`Ae^BceC<>j@3b#5WfJQ%BSr*#O&wnDg(g;-mf3!~L;hV;&vQf8-K z$WbRkVJ&$;LERWA2m;CgIoAOA7RG92;b{8n(FJ;T)+x4aktcXukRvIe;&WzLh$HmM zY_-RL+jDioV?o>1>Fy|)+=B`M^$^t=@3Du|OOI}8X^~+?V+PR}Mw4qz<)a^;wx*;o zO3quVek96ZNvu(U@%3x1KqMyOO{{qa3R{wslZVP4XlWr;}S1QbL>D{=={)XaFb>h5E8OG2E$SdzIXWtWofCW zPOiW-!Q%Y%$d7yd0|WAzQcuwVbJ>MY{812Zjzh~zrzf6rplTS`2!J;0>+4xW*E52_YrRN> zYFKD$YC;OeL{wE(ouN;Dd`=A!OJwZZw%xbJ%{R{;M{yg+49&#avmy93GBT3c*r?`8 zY~bOnZc@rGDG^%n$N*Ss4Q1y;#>Ktf)Ya8x+m#?;#(M7d54CWIrGB5E9|^hh@Nlo% z>K9prmgu3j?-TII8^QtFw{Kr&U0p!OqX1;%KOK~6O=qsF1Znd@QLzp$j?(`@-l$*g>-BLrBQp|7ZyeXy|k-H zRq^e~mgRU4P*^Bs7qS&7?gdFvwQz$<5`wpC*;k*U;D&wjl{>oSKnny^c}NMLg6lO{uxn$<7v(~Bw+a_OfBtOKm!sp(*jWcYE705I5nKp> zM_wO9ltt93~bq&PcYijI%ttNVrs&!Wf$XOlh=HMUdp#gS7b#_1NCxQBQx^c{hIfG6?<05V688PEkq`H- z8gB(Lcel47-A=5{^_k&I^70}8S}r9>q0{bc!XA+kp0l<5zfOvqs*uBVil=!f54%sfhow?j{X6XW{S$&wAZIc;MotFp4cmkrN}8PG+OpuP>fTkgzz3U}K&^Zabi%LMF*Y zE=N1*s8sW=NBfz)rlzK$I&Y`4Y?R-J$$HY~2hD#le|?J^`p#1e*&E-L9k;l+NE2ew zgoKkzeJ49!DEcgzHZXT6Jb$?Q`}?b|bO_V%80Ko4<4`jOvkS;p!zdcKi)4PFQ|<9$ zCKI{pjE4j~olYmCSvw|xXsg&}+;F))xu}{LDPd97`tq!nYjxtQSJyl}S3m4oOO|&k zTYAM{Y?5#+CY41jZCRY14R2;KsP3RDw&wIO0V;n%7i0nVZcV{^YgraG*+UuwD~1oKP&}6iKo@l0P&B{m&fcSG>3o;^ALt|K&9& zV0NbiWpObESyzx}9=Js~{1fGPR1_XX7f((}!3CMU28oKCcZ7UrG03s%J}20Pjelhr z7w@pI;CR2rlWDDUAco5%?%zs+%9DmRKX1gt!% zvf>($)P~g_6&fUo^Un=)jUzvSjxo_v2mQ)*X zj<`YLpwJ3{4czwX%ull3JCjq=wBy*(c`j=%(bKyS-eazCY8bV<+)^Kke=2|q^3zWA z5|faK0f{D0VQM1kHHfi3Xj>&DczAoE+GE`9xzK-Rr47;O^vdM`>G6*>fW#D;%8#UX z*#6szLgU@vha2InXVpoM$M7kXCFF7!Z-DX#a^$EnN^A_&G@^sxdO2`M3Zzf#DC;|{ zeb@HcKW+V+!dBrJ*a=XwG-G!{SN0ei8O2u;ebH#Nwd+1Pb3n>v%z?9iokU#?fRsb- zl4_0yV#leD!C?i=;u0VUhFaSDh>vxZx;i*?mhJL#3^nuv@U4;&5 zl(@dFZe1okLD=cavN~+@K3iHtW;NhL(0IHe*GwRAB(uGA7|l?X%jj!r)F;~RD&C%< zR#{PTKUm8;95mMN22EETe#lOSx|`DGmzJFHS(jNLFTF)cmqw6TgT z{IqvWJ3wBlJS`7IA5gPKRioCHb7+P!YKMI(oh{%H`w72k+woGm^w!gnShupoE{4W6 zf(LsGkLof1nvq=Xq?fcUh=8oLT7ehAX3W-zV^MbPSLRpMe3!-w*Bj|OJ2s2v$G!* zcJY=z=t^ia&{K==1!JJrZzk1u#gLPuAZWv)c1fWI<9bCgH1vRW)ZEjnpiBtaP8?+) zogR!+taA2CG4AN=ACK*&`XK`{yos@_)E4Pc;sSG_(9BLjW$#q~V zh_zs^-j#ea04C`N?!c-c=O%b}D^2^|BqSsdV@LyyCUO6x*PrXoA2HuLw0)1?co&&9 z=b4ykPs`7?YW>llgT&7&!tZ_pCG1gFFem~4)EC`Pvxjzy=yM7kYJ1kWdFO@hH2v9u z7++aM36@UogcjWYbI0&BBxHn3k2z9Qd#4N)MI3Zp3f&l~OU^tS% zyHgZwKfgLJ?M7@EJCP!qr~Z6e#zErUYNPXT8CV&jG9w^xCJ;YSP0IZW4RLEcXL{N| z>5wTU&64@`crMSyzh`5-f0YOd-IX~k7V=a*ke%zy)VwK&k!EoTHgKU72eHU=m06gd zf8mnr7&m6CMaaYa7zfs7saj*y?K!%qha03s*VcCfkoDf)-bx2aIl8I5h+CBW1L&7f zQBjdQq;|yj0S3cS%aFyZuHFt>=DA=wzp%hx{(TG4iz~`4=ijZ41L2lxSiaKEF1-V} zioUVv`rY^)XcQh2NMft>J`xE--`jbck};zNuEu1$=`%>O=MF)9x-1uV0UuRCDJ0?o z-n-itORWm=Bbv!x`#o5bk=_(STd`HWhdEbU$q>D$7o;P=Q?wQ2W*BdB?zvQR(2H_qw(r&p#6}g=*7v9P(l`Gn z=enswe!3@pSj_cl;*AD_=dUPmSX#4##HmL)5yQog+PI0hZ)Pl$&md7iX!2ypjdef$ z>K0Q$dV6s;wH0p#L`O$0$q=9!g<6bUMT!EYOQGu^4;)H_N?hwjiL0m+wQwC@1 z7aZ)+R0jpl8DFgl3H!b-ej;0?0nU*v+?|2 ztBlDwy>>XRGC;dVCQ^NgopUkVd%lMR(-*6S4`e8~5mhsnx2YIbJtUtF#X>(LV`B{{ z255|?65e#Lmo6theH#(A_#LW~~+hpWu4^3(0eMiQ@1 z^B?z)To%39e;4szI`{Snk-UUYj~O~~gT03Lvjhd`IsK*6Kt3yxy4nb}20t)I|L^&> z=yBcn51Z{AjuS1&sF!r{e$`j2FHNA z>o$>u7Ql=GBfNY>4>@TebWpkA_cttmI%wuZ{&csE=oXU$TmI|YV~UTyUnWej)C)W1 z{9=+z<+iZtPf5}DmAz(f8;=6FUb)@b*g3PE1{}&6)TM3u-o1NEfy-o?NgZGdmH9TM zxO5*Fs2%ER8k~w;L~E)FLexNRW#1kH37*j&1BnkA)FEanW+6@w6>*SD@_vO5ScqwX zOSSzE?o9qa>s1DLR;aKByGAB47fCORt`f$_Q)zw`P6mi6R5V5ZUBz=+yP~Sfu0q1H z=3;`RRWcZXqUf3Wx;o`5=i!&$)niD#0MJ-resJ&OE1o5?86*sgfq3#q4S$L5Z$TZd zCuN^n@}+-tDm!csr6PpzMpuFRK1S2ufiVkfV(&||Al788I&-Z8o(@rU$DA1X0*U<1@XsMKL_NJ~MBmR@kWw&LA{_MeI`#OQ_{7KjA% zCVHom?d|OtACZbA{B3T*9QUEyo0dt6?lwJDLZ1PCWhV-5iHV8X!dWrP*aSL2tE{X)wrU5cnjhWNtL~06#Qpg+kZ4IC%kkrm1{sXv`b(C5&aA?J? z>g14$RBCFf`||gX(J5Eoy^39BAbtoKVX`AX!J%=J_#Scr#mz;-=AOi;JneGmJ@l?9PgU_#qDjpgj#%mS> z$qryxkZ9|x-i6ITdrWH{-2*T8LBkT5$~K5OfyAZRH+85D#URuZz-$8291R@RaRYYW za)|fW0GnT4OOt&@A=TTqgtE6gay$mnbO(Q1Z~@|ghq`^`bFBU*-|>BWyljx6ASQ{> zN=imfP7dNxBI2mSEfSv8ekFbL5rQ=9;yr_1F`~luo19+px5jg<4twlEsU!tT{B$LTR%CL}89(B+w z#;6;m~XNU;S9Fl6}W4g*B$x`X)PjdwXY6lbSV# zvCcV2``y9KEw-8%Acpv)?@LPXTV@X*K18CB!dIo@zt*eidGfO6@%C-Opv|$s7X@Zy zwntKc69NeCg0~s%^F#J{ao7WXAMln;D;1_uWtnPIC7 z&3x%?G98H2bf5$-v~m>&k!u54BCF~CJXlRMD64K`6WP^fA$xJVHEmA^ds`w2b#b&h z_MTCTXVaeF6`JTv^+*M90@P@Xo;pJg$Pqity(a7)e-)gz8rVClbkAy@NSO28pEbd+ z8CRh|&{`yQkO?*0L$yAew^x+*DMPww*q%3V3&HV2oU{63BcJbo zKS64Rs*JThgtSL@weO>V{j_)g;nv*r5Z>|e@y*8K+tPq==ExY3GBBhRKkalBqZlVS zLGXVFJpjmGgFTT|QX-`}z!aL{WAh**rsCefx65iBsi^m;P+O6r(|Db?naOLWDcBYWGeR-9$cT#?zRCH5B>gp8D{+DYvvn20SSU{& zgIvM4q7@+oWxzr0u$-qN~AauIByODxj;MmaMAQx;K;%6&D15F*!%ke(Y@R-o2b)VL&=Lktk&q2{wU9v8w~f5NS8& zpYMwp&2`PpL6csR`cCspgxEPJpNJFDiP#C^q!D)EDduvrmXR#x`9`R*OL z?&K5e>+C%ASxP<6V2M=}G#<3RXbC&uxU6q|hZ6*oVEG^&im&8_r26y%%hXL9HBog! zgWpZ4hL4A+z9a{V0!J%#T(`Yr9zZeWxYoMl)*O-2XuGL?|D2v`=_OE_6RUWX&dI}t z=8YnsyJXc-sSjOZ2n4F;x-!Qn(w7_21GI0|*v3w1pKS17byG(L&l|o`@x8Pif?L4^ zwiY$VJc~-UZU55FifyDX#hkX<)Cl(V`p?skLw7wwdG4-U^e2o2HvgdysW!&L-`7+Xwfcm=lT|ZL?{ye(KKJpt95mg;pvBGuT5MxNI%1iB_6zM2twlg;ZVKbhm{~ z7r~{pxIpFG+{mpzSX9<3Mza*V*|8y@VoS%SmO=*(_u@(#l{j8cYuO|bf~8A?aXpHD z%kdow@@l^09<}`T_&1SRnjs~W2`5Hqnja%ZA*-@-v6gc3z%#{w$!bO4jW5yF>F*K} z2wUpRLChuRKwPXq1R00b-EmtTUec=7$zL3*6|=^Wi%O@$IE0|Uy)$Fx;)Ev#yU)fC zwkHGzy5VNhnYKN2#Z;G3-_{g20c?19M#jgjIUIH7_&y!G!KFspyiQ?759C`Ky z$*v)FY9-A-O+!E`*h$7`VT`AwnYJ;s@`8kkF%Z=|vtk~Ds#dS`r8W(1etVMq)%8M~ zjr&@o`&vh|hJ;G&7c2cml+e$!6cZm2&T`7|{j;q=B~gGcgP+s=UXA+?Tg^+yoIESD zGM7$7(Hs(lPrW9>l4WIAdK=@r@0XYQxY#?7HVF%=)(8PhV<*;!7Z)%2%}qU}wWqk@ z5{gE_%!nroN9Vs$bq~@&FPRis3s9R`_ZG$~Rm{!JZF9I{IXNYYib}mlH)aGLTuvXMLXId_DY0a76qA8eSH`drU zq>{!P>?#y@t4)R4Bvik-5Tz|5o0a>nZ*JCd@C5WixUY{4oJZsR?=Ky7+I*eR!inUj`J9%D zDcIh5q(Nz9#Ligoe$L8vP@&oCLOAsalUWl;)m>9xiv95;<3_G*sm*nZLdrZA>{x73 zV%O9Jg98<<$6U#sA+FRo4WE)G@rYyC63oyr1t7L&ov!-EZKdRQ2w5lGK3 zT~{7ND&iP!bkGL=X7!?~jLK^7(ki@%3fuETd*lx0lo(=3^!-^X>O0x5|q+$_O7(xPrbef{&4Jt3*YC)QNZMW(m5+};KdOizPxz0hiu#|lIfo$y7YK;zoN zNO`s0c7G?CeH<4-45B(xGF_zJP$|1Dnvc3#u03ID=PSuM>UHIWGE= ziR7{2a{1WBah28JF(lM)v_K%WtvjvjTr!Cr58NO`|5^B|i`K$HY6HJE<&fhAXw%;@ zHNAcA_{3y{t+$(PZIiu7-*a-dn^oCMRCROE_uJhoz2`s8IOgi6g+no+a=NsUzM*Gk z^U?oZ$jxec5Wf`TFxweTw#E**Tz#6Ig;v7|;pk|}YHw1P1}Zf&$LoT!=kO5mO{~eN z`9ybBfOeO1C5%@vr<#X(vPw)3&1wW1J*U^LocdUbnt!BSyr$En~-Z+JLZwYsHt zMRB6o0n4udKC)AF$E5D-rYW9eF!~1jBp{!4;VWIL9&}aBEScEP)Y*&tmK!Z}P`qf}Vdra4z{5*~%U^T+xW3J=Fz+W(-L!uF z-Q9gv!=Y(uTgzni)_N-DqL0`dQh9096k9w?d_^SUzWur#ggPt~BK6HE zF4n3(;H)lx3Fh76D!=O5$Pj7&z8&(UxHb9u4!^>L-*xd4SiM*MwT-!s-&(^vHO6(_ zZ1~)Uz7F|VM9;j~UO4vBadTVQdPjim29_=0#n5YfJCiWo(NAl;2&q@AsJm3U+3V`8 zcJ#^9c+@ui{x>7amko?LLwVgfODzuDy=}SR+=C-d=OFNqW_iin`fKk@wdh|VlpLO6 zS%a9uzL9gsoaS{D4(_z3$Q*q3DH@$?DvoutkE~Z2gjvZt&Jns(R!vpU(ki?6or<@WW1xtb^VlE)I>tN3AHi_R}IwQNfg`3wfT9;0ENo*86i~q3@j$ zV3<#g8^}Jwd#^NAbGlydM*jE=<^KlUTc!BO@ot^+5a!Z!&RGjAdHsY0jh27n=f9E2 zPE8Z%&ok|WZNGuY**wpF-wUTv&Tf2x%oMR4!R{SHJxM;HV&|x86D?e znoDD+ypxKpmC4}HN>)=-jaO;YiwN0DR(7J3MsQ4YbhNIrDen5N_T=g|G?MPJcE5jY zta%jTLv7^x;W^epK2aL9W6bMh^Xty+onZNAQEfJd4iT`1sX7lM^TexGJ8aad2c4R* zi6Q&hUas0?+eh_3QPxE1y}Fq_F-4f-`9G>yJ?NmGV2bZ+SeM0 zgrjte6yfx=CY=%4BtP5hPR?$h_3DWpGVb^FP}Qm|>cG0I*wjh|*RQ_Rex`-DsdDPl z()tTGUe=E}W@D$QqWQ43%KTbS>W-vwK%kput>d+CP`naFQ#Tg3Hd0Em40%}%F5^wY z)`5)fn}hgi4_Yq{6TOiiRjwHvOq=4WJZ9W8fK9D;#P(%JaUHGyHSM1OtuPS9YL+Sz z(a;cm*4$i#wa1ObWZbdJqJMcr>>B#tUVyp#8tT42#Ze3?0d9+8!wWPr2kESS)6Cx) zCi%p`c*PaETRD*swXEbi`7>C>V&d~I)E|rgT&OWdz&h$&N0Dl%GEs}FWv2MW_2iPD z9C`BBw_K)yB5GO5czn5XO2ozkWnSO+kfYmZQWj1g!*!n>3R51@$*q^^d0y9$lq7I$ zB&*pFndUSiV)LZLwO;|5wqP+K`+?AD&SLM67q~4@^HID4Oh(B+CGyPV!e#FOoPPJ|wgV>Ea?^O+8 z0M&OSV=+XZr4fPs9F6AX)*>k}P&vNZ-I2m%;%Lxi*8cVDWLAis6RyX~79*9|ZLKjJUBHkANhcOr(>>&{Fgo{T=lzN9YK}qv z0!Va_;0Jk`=HMP+T}FMPB}fhK!mi_Qg2!o7OeNPfSXJv_u^5A6in(@tf`cJ13bc)+ zGIXQXRm-^lpA}WKmH1$kR2zoB>FiWmdq>{<>Lyi!_s zA!tb|9xin5rHzxHC|*+J&kYSFS3k+v%A~r#;o~i?4I1tpJ1&+u$H6v`EMhq;G3oI7 z9lxU2xqM9zU2jgBVa9EhC)y%$5xyiA;;7^VfyvWs;Q5E=YJ1Fi(Sd@d)ar}+uZ@zP zBwIW-$V(n|6s_}Fbllx)*_4-;*<2bGqN90J|B?iK55)>YPrkYDe_syT-nN%E^|tU7 zb{?y!%~@JrcQUbkljs-Gv$@;to@g#?v*)|rdeh$*6k~qEC{UU0~ zQ{gp=mf=4<&RPfP@0>Z2Rat{s(i7pg5Es!Ulygho;(fT9Ako`b{?K`wM%I+gzZbAD zOGOIF0(z2{L1B@}>P$@#>Mz&ELG(@fX(D z@XgsO6+g?bz|7Ul=Xz;0#`x%E0A8wEDO0*f>=VLFeH>?Ut~1Nxl7YrN0=R-PsXr8xTvJSj&s^)>%Fd z(tw;ZyCj%CH21CTVDIK5SC{fP>bRTyCAkR}q|ak&L0fNgQU~3Jj#Rr1DsbL&GCH5} z@yU}s`{;reeZ^Su1W&s2ml@hOD%)k5U%nnJ%n*KC-sStt(v53lV#jS4<9ffO4m;mJ zJ>ehEBIt0RA6L2VFdm1$?(H6N>}d-=X2tDzWNFpy=q1sT-WT21ER;_$rrO6o*K&J% z5B5}ztK5@$m0g%!DQ_KER3~C{HiWgF$fH(mDG66kLjo`)TVYXkC9NCj*1Nq3br+`uiCLxK`ezTAt`5Y8a;F{jy=d zsewV8HPHk^{-CMKWN!@(jfny&l$+_0VG$T{gd)E5{v~2#JtDzd(78k(bjKyLbE10u zQJ_F#VjhiyQ^2ntB7UpQW+8AcJ9!j?Pg5HIFgje&xH9kbB0nG%Y!8Tjol>6*NQo{x zk)s{Je_}=m6HXblH_Z`_kK7w(&0`@R9o^b1>{;-jp->(78-IyoSE<_r*J5<@$$B5E zfCaJ4+k#)k$E#iVCN$?b5yjRMF2DYwuN*7BRvUb2n*Nh(@N_AZ2JOkV^&gxm5~RJk zb-l0~#oCNp%4gfLF6C}9m^`hvO&gUKO8o5JtXMAfEHTu{ZFJ$yN0fw-MYU_e`LK&J zGBQ&Vp;|f@;v;=Y^tX2ZN$N_J>{hLa>}QGRqbhwbh!6aWXpBo z>eZ(RJKh=<#Y6xi8@S5G zt8ZUZ@vO9`HYFddT(!qv+LgEKTRJ!{a_|Rqzql{X$Cpk885lrso+$KQAa03mEXU!) zXJl>#TbY=2|61<&?8+%YwfU$pjwRe>3`_QhucxOL7)twXg=^C7NkoP`V=PHFH!Ufs z()u7H?dFQ-n^sz~gVILP7viEtb!JJ4n{#b#?O71ji#+NWa!z;UXo2V2+BGejYT5Id zjbYR9e+(pxria5vY3~gqE9ctfTC&WTFPjX<&L7Xx=fS_L1F%u+4o{4q^O7@(d0j6r zvt1{VXQ-2e%@aBQ=1Z2o(t)X4lWD3Lqf5u6uP4Q37nXZkHLQ&A{d5~7KbP;WGz>Lt z6MiJ`1jh=gN2X(TGMMZ}7eK9YgKH4?>c8BHc!jo+%GBQBTFHRGT*2!ocblYPL25+S zgKv3BtPMZd6Sz@+wQ$kWWOXa4PxKhi3x4SUm52Ct+Vi`Q9{nz9UH5f)FiEFgD)f@s zucBC?D4mq*=z#!Yt*0-TI|KdtYQ7uJr-MJGsnHz~#cbK+B@LBb?#(4)-gY%K)Ihsd zAXtIw$;s)jZrsX+RvS_@RR8S>>04uJ^mb7*{#j})WCXlFi>oD2Bm(cQk8{%R`r!6p z11rE#BL-8SmQHo2RBMQ&M!*E`eeTUo(iZVqB=SK5;R`IZywH{%<*8CFKCs$x<;|$Q z)5o98j`tQ@@VnwoMGZ`!luH`Q3g^CmFq*fXq*~w5>vHr~Z1e zmxFR>g`OXB&D8i9XO4bvZIx`5^XSRZD%X_s47eG zlN0rBO~v)D3*e#n(HDK&9rtNmyOw>_cWJGCkvLj<@2Z}cYLXcWk|W4a8>nN$MVL0k zNEU58lBAei9*|ib@J_^X&G3RORqU`}z>6=Ja`+#p zsH*Zqr(`rV2)FGQV%{rs4OWhefV+TdOxmViPEgU)FzceEzn8aYS?s^{|9=~hIWJ2t;=8F1*jiLdWiowwN1cq1QZ@E5nT;S#`EV_z@0h&cYDYs#_8ld)5& zq?6O|3NL)n-8H@FnIfVD9aQ(M{U^{+TvJXB)5zoIlvJ;z&wcQ%Y+kthu=ZF|rlp4W zc8toiiC6Ne7T+q-Y+>^aj|KB~t|XzaWF29yVp!>Y%s|PMqVrFd4e#AQ(?s8(oI9St zyg_AGQ*;0R-H-9@z2QWzP;=~lj-|oMRK)(CY2~D>R(y)bx^MwAcX^?R_lIeDxArBX z|0ZK=xDH$9(RA{eSd&U*D}41dc}&8-f&&h{;>Y=N3pvo)`bmA^jO-vmvv5zk<(JKW z5@~|2d6o9~`IBV#hf8Sw9j&RFxWC(2HlEd{k@`m8N8?j=69MvqYcS1CkA0-ghlzr2jSScB z8!w?#1)&p^ksfG;)1;`Q8gJ(rA_z~LQ)i)kGFJMFQWVHS7}gnZkj!N>eO+ei6oaJ-NwQ=7f_jt%*)wF!Bq{`k@#*Y$wh5q-9t>H0!H!| ztU$e^t9PT1x7`!6c6a4CSDDVq5xB!FQbb3|$Q%Vj?8c2)Xa% zC|FQzX0`ZLY#@%`c%p;aOsGunGs7aQI%v>U>6Yyt!ki1+T1qLIxMQRe_xhrSbbMle7Nx5rv?d`rn;Xw-3#WU2z8b| z-~O%+konu=Y!3U3sOzcJd@5f5w>S1h`Vmb~<^V%8QjfWlJ4>Y2aNu;M z?_$1rerr-+3?E}G+z0*sl9{-M<{?7b2gx_;Ccd4?N#<~eq zUk?fz*>*2m_!Nq9ix!?KuM0;!==`EUy={g!isXm`1tt?EnC+6SiB(MdT%RcPwErwT zjLkI)ARq!IxYkY9&Lw>#-}fgDJlkSa4>KIf5R~wDO^@~Rcv`y8kEbve*_y8v=DZ8W0Zfx&!cO~Qx%PK0*-QqvQcCa$2{_~ zdul?RIm&vUWb%EeS6Et6QL$jqEPv+3Gu3K^Pygc=Yq2%nu;e*^El)o}O+x2I(vNq? zpWQmE%W)Xj&9y)%pttEC{~X_;c0RQfAo#bpDF%5CC3RnGw%?eywfz?NXVCVt`O(5GM^_Ya3q4>ge`G*KkSCR*oI5_<%Jw$cC~yHj z_Qcu$E#`MuMRP5LlpY5RvAv&nsM_W2t?1CtDJdFme^7cJko&)GE!sPI zl5xeRd8)F?z)${SQ%={#b%;xfnC`-j6CRkBpoQeggK(o7-Lun0@8kI@e0oO^RTy~u zR;?x0Lcz6_u&9!z`ZBT-I=9z9`w4VH=jY%ncGJ;ev%$7oAaHbarkJ=mbzh`_PG7En zQCxRfEpXZktbO`BO5&~Tt(7SJ1X+D|bck75RS6a|OB%&m6Y>`7GlDY{Qy0lyM6z&G zTgsEG8=ooA2|s7j{o;A&eGN^j(Yy-HD95bX`&0NV)F?$I`e>?ZYAF!-K@;T`3T}j7 z^8YtP*Nep8?A_1N2AB152?%?kV}ex*TqF<WU<_2>Aw3!$X@s-$R9!TsgC zN~c_*hl+Q62X~UE!VLPCB~KoZ&#FNx9nH*@zKT)FlTqNurME%7vt3Xu{??rf1M2#4 z)ihYXdLLR5)3oHGozuH0D2;Ks(%Nyu+oj8}(6Tgh$z{@m?0rcqd!kT7tY-kRh5wo& zR7;-knhl(4*GaJ@H6^wS{bVzk*G6+OND4X}eC688&jx|cxC#mVr}4KerH+%gzCQ|L zIQ-reB6kG0FN_?J!M#`NcH>N*s(4K3ie6Em%)Am8r-0G1BgEuC{9kGw)3{L*+%xN$ z0H0%1rMTM@C||ugC~M2OFM`c4JX||3P4jR2jmz(tleuy1(X@yq_DU`>-$1H%9Whm< z5g{$tGH!>1L~e^!-*wU$72@HEkZRtN6I@@vPHG9GP0gfh{7`z}CW2fD(@9Z?mEeMw z4BrhetI^lmM}IEECkOT!N6Ne^0qOAkCS%RaXm0koW|3_vc+hx$+aPUODYYgwV(Lml z*Nh(uJLo~N;3{|a`6PYIL8f=Rs;p6s7__>WEF`a&jzZdXiUKXP7(b)HFg zjME+WWoX3xLjC=}7x}jDbVBC1o@W@XZCAl(1wGv$@$KiyD17VaAYG7vwW|ewcIeQW zrW0khh$=QZnpIGs;z|nfDa($4euVBtT>P!G#n!1inYBF`Dh+~#(jg^{7$``03n<;)pa`gdNOwuMbeBj;x5TEqyW^V+J@=m9-|$_= zIKy$)-g~Wgy*cMIpE;kzZ`4trc3yJz$p($uj!e1rW?k{kju3vjWE_TS>7nB@p>QtJ zmfIX?Q{WFf+-)$aYJHsx5#JNNK4&?3c^imXDG-y9r3}nS_hDjDb;>i6ce*)2T=&T}r@#dTd>Gx6wzckkkay6UCWGkz7X*uzc zaz|`-^JuB?;de$^vD9d8K|CJ}cUwKrk`{PfFG7YMy49f~esX4xVS;)P` zQC8G)tV!)b-k@!07_esuO zcpjcY6C-!;)FS&NxAoE|HUlA{@`Ua%+ga2u6io4gdVo#g7agPZjg3F6mhJw?LOB>b z%iY@L{|p%lq6Y`(&K;ZWw1kCsK12vQg^=6xBPSlnA$yHUfPnrgGjRc6^S+cUp&&TO zA4vPN`;T432LTf^2yTyxP+p$h*WLXvjk@R6+Igp{!6Vv7OT%3HEY9cR3n)@OP$i;E z*c=~=iCC9vxZK({jO^GI0+ySQw#?vIm=UKho$w2avnad>ny9Lpew3=- zr#r`wnFFh**o%Zd<)oL)hc%e=F(2%wI@C!;5|e#K(N7K;w7;Gh3y>(4NPUtc_0f<9 zza)+Et+>N9&^vLP|+z z4(+c}BL_fwe+am^;Ca1)e^scF?AtERL?8tzmRrm?_j|@NP7^UEM94#L5AboRufCEg&g`8=q%Yd+oECy#B z3mkrI7zWg(DA3gxsk`7)I2|=Ka`^1D1GubazyE4!^wgYZ#f9w7ojZO_3GoG1Pp38u zY_er&g7&6EV(wMo+gIAPw?tMJIH$|oJh9n5_#i{mXEOJ3o7Da`O%M?|@n@+Vyb_hH zB=!wyNH+3@GzR)=a*lckm`%18jig?jGghf005mnGcPCPaAUnbLETR|x7naE2tHf(g zi8}X5GO}=0eVcz93ezv1J(!hB)qRnCA16j6=)>FdBf(8w%nzCVjyah$FM12mT9nxAJY=ioNtt{gf z2%2%)&*3#&G0n@Obv&k?t6!;0MP*DH)utCb05f>M?x3MV>smP)^2D{O~;n;0?`Z!aVr`QEa zv>}~sZ{;DPMJyhOm$j*uK?ZCE+cx)o5@Pbtmk8S$U;%t(ZSrOHssT^$s|3{(@%DPE zAYn)q8E_v-ETu1ES8M?*)w{}RWA;~`jSEzhp;a0hOj0RQp!?Aa#b$mxCrrK$`;KS( zU1s|LOLBbnss`X~{6ITQ=9P0hcg}2QDeR$@xpn+|!T>-Fg$vWHRnu*rKITyO=R5N#pV8d@q0QtY8)liG(CsIlcsuA56~Ln^Sw8?<^(*b8a{}fA zvf2T|Kq_)}&A$w!ohBkC|AxkPsv$H^g@=tGw>I_;lWkEW?jv;`1_sJk)491O2775QRnS`G zlEF|@&;JIN|EZIHfeoqJ3Z(CUYOX)|r?mS2E+GBl`oI48&-_?axqRmzF2Mi#=6_S; ze>(-T3jViq{ub-_-$wbLjq-n+2@3&x;rY{q+xULM zPt#^r<6V%cpm0JHBn*zr2VqJY$&bR6^(W*(oi2>>KP9O{8v5NoJb(J$ruNdkfF^Ix zmU)>3srl#0-576>Uy^*4N=2+j;Y6~ajlEHk#4f>AlFgTB#~6*TbN!lL-;Qd!5RObc z1txK~dGJOd@c^KG!PRRQuM03f#?V1-5{&V7YvaDF+C50Kc%4`BT<5``>j^;0haY^Z z6Ab+HeQsI+t>XQg2Vsrc7Jg0I?rq3V=>VFf6t0`lCCaqk@~3oF)9jkxQkaVrOD43p zLB4R)Y}(w8&YK~m`BDXU&m**ozaZHMxkKxlJ5g~2jCVgV9RhoKbVTP$ZFvg#43mNqI+E zZpOvf>w&E^w?}&t`p({kP7sFTnTKb*0v+8}7M(Iwe`jUm5MocCI+I4CvxY=G4^IyQ zdyZgAbW69y?s;7)^D{Z6;6TWIt9|SyDd!&__g4o_VC(el82LY+eTA;ObEj64j;g7X z3S;hk69=0RL-L<{S^>@FnMcr+?qBGZ=U9vKpWF*jokJn5MI%W7zkRJ^OmMZ{|GsOq zn+y$pYb(89+v`7_;Ch}mL>Tc$f<9faD*US>FHksHs8%Nc2LpZ#-OCUn^jJ6GdfO*7 zdxEa8m#iE`p@x4WH&#P~_w?{MAFo0~5AO-2d9F9P15j6mfDd__>Ps;AKY*+j_^Hl) zB#83q@dvI8F~|}as|y51L24@JgMlR&SO43t(Q%gd?l>ad<4X9e`){tOCZy+xG3JP$ z^M{#A?48X9#=<{M7xR+S`7UYy8TnuO%Heaoc`6~G`S#|`zpLF;>0)P}HwelK2z+wa#C$q0cv;+^#ad^Ytcwm0on zMC%f3`8CWrmkXEkX{e}vE&bNcLPOj85*zyp^Sn~4SnZ;OYo$k>rXT&?AOHRMrty`P^Ui%&b%kolfoxQb|7}}bZ0t?U^XJ2(JW{c((8JYl{`pa{^tV=RYwRSNe9XDn zn*t<9a zc<6DqXkeMrdDVR#8~a{@Clp63fOY=-PyIKOkN!L^S_=nTO5oP;mv0^Tu>-b$`pA{o z(B1U$cR^WK?f-mJ`{IQQfov(JnQam&X*q^G7k=NN`lY)O{hXk*D?k>9H?E8sd>1%fDNe|&du-V~5a?_FXYZd;|zd*p5?|KiU_m2pfx49BHt zHyW3aIUgfWr0ov>#+qVZxFGQ=)Th|e6numaazQ1(1w%L zD(nx8dy5tZ;<4(GUJ*D^ZQg38J#lqK3m)C$2lWhzt5`*O1V5&m>vzcNHt#X>ck z`Ca~#4k$GhT5@r!+aS9#&E@nkwTf2`YGM@_4aq?jNx9@U)qJNz>ww(a0`o)V0|P04 zP|BF9@!qJ{&eJ<8Hp9k#a8k^_cDPEyZ5@e~C#YdFWK^U#?=LP}YN?kejZEC~`d<5) zAX<6oj%hmoBV#kau~!lA-VL})_)`gH!Ey{ni<_6V8lL{95N-D&w zLu6B>o+@8+mVsU#X9k|RR7e)CEfXzK)3V7tlqI)v$eS6ga;d_~`-%EeBxOdv4g+Q{BO{zIyelQr>|>Z;E7Xs&!wMax&DGZGWnWv}@$nVi%=qX`r4p3Bzm% zOKj#9ZTlMD47qguzH&u2gOQ9%r$b#RwHwZ5R0;)IUt8r_TMM6TDe9O#CJ9&cxxb`Un)Mzf7F&ra}1$&PB8*f12Ms&z#Nun$J1(dm$uCKf7 zj*lb#VFgI2GxDvAk|J+uc{o0;C$@MxADOPha$=8 z(3zP#QBbchW4E_Jgs?0Js&=WdXt!;dJ}XXBDakD%zfM4q^x)0UIVknEZyd8bvI*Sv zuTV{hwoU|F3zv5<7T#)LiPiNqRkH98Ri zSB!J#tf1|A(q`0E={>oAJ~ny-x$bgKhnb}|i`v#S?*6b|B_zI}PT`xaV%ZX9mejQU zS}^4;p~xymLA%4M9gI%@SdCk&*rdzBwig>W=9tO(D@3ucutX9nPEY7S)ZiE|rs6^j zCA@w#;hbm0)dN*@t}ht*{nV0Q-$Na)Bh%^o4D)!;3uub&39E_#&@-DPuNHf9lMbn-zovX^}o3k}1t zSl-bF(ksh}^Q^xgv0tQ@-h{&bZym|Mr|0YUN`c--9%-5R^d~5_WreHr7d+SYK5WJC zOw|(ex+NKv`YP;>VeC*wUi%#>K|#T{G3u#Ol%SL%oT*$O1NEt_pxzW0&xm&3d}dQX zfrHIgs7|Lo=8W$0B`PZO*5e6QhaI{g2GxVoJpgW554Jg8HePPCU+NTkNiWc!DlG(P zaFO2exgFR{elQhU%!)y^wE?#QXb9Q}{Y@t5(jrZIu68J{_=SK@Ar|uzK_jf)wXsJe z4_~?d3}zcqp?~l|3aU=@IPIcVYhI$S=3Aqtyus~M z`ugL*e4ML(PfA>9C{b$+|7hUJq{n4Bi7%&_#OFtMvVWdF@LvA49x!_iS!9j^uU^IG z=9!Oj|CHZTL?6sn`z+qn($WJ3fC~%<%;{Cu;-FBNmhDoM&2SupDpwvJ)=lc^9~XUy zS^Ab($26g~SE!ULgL-B8N>vQS-k8%8YTm5Z1nY_|({;Fg_2Is> zj^qCJys$$*{Zzw)mv6{Aa63p?X`e?F; z)$t|o-QDNoJjruOn_*t+GF0<(mWq{ynsvH`!A;RBYhrdvH)AmJDJrN>UcoR!S<7IJ zVa=QrhuszOmJ4Vqt5AdrGUrE(>1b$#VXxg$U;wtJ#Jp7EQhnvo0YR#>k=mUjCsibh1zg>8E+r(8?rKb^{?XU*6y| zqoUgGB>zgjI$rEKjB|>o1D7c8-#6G^VDngyFe!ZjyW{VsbW@7t>#VAk>-;C9FY4;dxlQ{e4Ety*XM~Wz6Zl$nu$MW>mE> zuuT*W!o$Z;)R#?96LjC8QDS|0>lQnd!=|0o^bm`D80Y3f)>F7VblD_~BLcROfO|f@ zvCij$=oF=%ej@0s^Y-GhUJ8XZU*KGOK2O?`)~4zNYTu>mb>B-eFKS(@dfkMZ&-xeNCw37dYxPz1YdP@1evnhZ7mMVwybsGMohON`>n z9K}7#!l#wDKVGC-a?^ z@T-&1Zh>npc(9=N>(fiJsY*|wf}^Zo$8Buv+=Yp{mr?vNSyNNB!h==nP^7;TwrbU` zWLo^4#W!dIsn{8$DpS`cg;#ug4r?x}Y(*;7 zpAu(COjNXYfz4p+mzGO`OMjG2nvM7I&zpZ)e_El}=|i?8>&Jh>Ao&L3lNt2H2- zp97}L!f;8z;4tc$Xau_?h+S;*JcAXn1?9{2fdy&r(q~9{_wLlZ-M%DnjeSVA!%@GW z%FK3GV+c;nqR*<62D`zIA1@?(0eP(VXQh3 zhFWQB&(Q~m+Kb*D8R?_ag6wyl6>LWAlHuG8F`xkBr8B$gp5AOr1~chgF;t<%c+U*^XDB<^6>`2 zWchmD55oGgJ0q4iEHgpYY|$^22n9+z@O7!^=m6NbD;#$9p%h6tug+)xfPhU@_EnQ( z8w|ASp}+q6Yc6--MX~Essm}v19@73I_zF$}98SVQSMH|+N84J<28F7>qn;#|ocL3} z;8eMxN3VOUg{6I_taY$Jf8L!?O#;l4Nas~3W0|^s{hsbX?zC8eMK1{V=q?0OTWe)1 z2>}n|#_8cH*uQ!$znB-gO7h05I{87rM53rCmG*`GS9N~T$cHui37b?fYdPf7mez>G zE1mDypzM-0wY2bWpq@dT)K0(OFEWx0#&phy<0QV9rgVvN4A+M1IT z4P}z-)@h;Y*vt;vT4eOVT+5yQS(ed3{{jl%$buqLw!;w&4~=44{`jVv{rXehU6m95 z_Dd7$vT1WuP109<*MrRT5@7X^?01Rik5)!?U#E9IW_tlunR=&+MoNt{Y$tU-GJ4wx zm5+1HDHWltBh+k9I13DBhZVSNRw4=L)iNaGpDjX}L`>sZ8k0k0K$T%{o0pn-n%8X_ zuKx0d_W67pi>;@(zS^!k7I8p9V>nc4tX77bDEWDY?H4n{Ic%~(|7^LFEj3=Ls1M5F z_f#ks@u9iayfNkpyqn+LciG!Wn<|TH&Q`9Yc|(< z9A-y^{$64^pzwAd?$;Y5h!7FUgpCJeHMaA65p<9$~YuKV)f2fb197Tlx*=~Z% z^v4GmgXvG%y>V`vTGTu|D&kv<$rS9y5@ptQRa!NQ?#K4TXlO2}b_aFoYatx9>QVeI zBTU+>g+h1aV2SCx>?h6kWsmGtl>mPcRc6)w6JMRwcxqZ0_LweYYXlF#k>934oZFng zvAJY(TRC%OD3Fzk>iM~Y-G2D;?7X!j9s>w@b%Fo3T>mqeJ{>e?%F5fJ(~=8*F~cqBvwD&0_nq=I%2!vGWFAi-jyo0QV=0hD%ZWm5@!ZwhMeRH83(I)7dnMB zRR-nZ4DQWwI~G+df)!#?b=;SDJTS>Ps|qjFMTrcy})?;V5wtX@drM-5_;ZT_$t!?Ku3(eWk6)aPdedz96Bi3s}0N}1wp zAYIds5@+TQF?IR(DXU`!l$BT0T14!Io@*cNnZf2S9sRk&bo?Eh&)dsIqx$a=`(YG7L1**k+>n?F{&57@087au?38SjonD2{o}gPo#V>*2%D_S1rA{Q&CnrbUu9 zhzvoU+C{K~kTd@ZIZsMpV4!0*^#Dj6iAFNV6bwUEqcH ztexm@*&VS_bbX-)k->icq0H8R}~UEN&tvSXFMnfm>pUpj?$o@V7EZakA1lP01fSQ3O6rylkd1k1aq&65&b0Nx!-M% z9PdlSC48rEvs8N-+1dLiosZUqTBA6`VY^{Dx@HGQ?m}k+dGGNqYIcoa5q1KDmIxEj z8XGU!iJ-{#C4aLUj6!x_%H@7wL#EXVU0M9Te+e5GSN>z;H5%1Ya6d8<{V7d4K+f%S zryQ85i*PouE+I#pepkXr)UU5~UIh;QD~{79ta&WiD#r)Q19>*tkb#n}tlxh!s#SG* zQZ_L;x!oT68B2+W25+Z3)So8Kzmav*7c)SH+NjF zV0@YMGAd0hYNg1*?{BD{3&pcnEh+r`{1*C_(aUl`LzQ0PTlGBO#&`9$B52^Z!@Z_} z|6}l z)W%UoO;NhsJgi}lbx#NWqatwXK;&Z)3UN1EsL!@>GTj*>K{`l>HAEKsG&?zISUUsr1gm6_n}YsnLmx7cU+_o%WL*q8Q5P z>6OLUEY;GfQdY=t^&nt8c@A24or6}3OXSj!EMm1h_>{Rqi|m9+GjCw4ZOA0mYLO~2 z^5OWm(WA8=+n_{HiGWv7SQxS1_8if}i91HX!Ri{nJU6UO=?PAQ4~H6u%B0MJL2zwj zh({TtDC+J-diao#IGYXUIC&y9EXU-o1`F(92b zENdMMZEbBhXVvpz@f;j&GH!t(*t`4|YilOrR2IxfoS|jlNj~#&R)rO3rE`$<{P}YU zLBV$#<;%QAI9doA#CI}vJ!EE*7HY8(s^=dTO(?nei%DJZhX#gCQCY`9Ox#{i)K z&6!+~?np`&^6mif+{>$%p+L%45WkS+TE1_^VzkB12h-{IuYFUFqrkoEM zr&OnrPZcY-)@r2_$%DIM>+9=wT+ZMd8aLI_tvDV}Hu&^6`Z3b7u$YLH|FSsP(!=@a zC4J<}zYtY4DrIW=4K?}o>sOhim&Bl+SYGW^a|$J$QQuNnO~=rZu{&VYDjfI?IUsj} zxi!+x$*(C2PDF0AjfDDg&SzjbHSSvQtL8p|RMOslbtk>zNFfD<(3P@XwN}SfULEPD z42~Kqu7Kh2vUMJqaf-keqvh`cUgHO?riY^*BnUM zNWx)+GYNVJ74}<8Z)|qT{aRXHLM<>-D39D#wpyuGyd>>Qj;nXzO>B1(cmL0(>F?6R z=X8Sq4b9WWKw@-VY;mZN*yKF|WQ|n#^oz9q{Mi-Yc7D2S&#@QsoO|PS7;kV}x2%O~ zw;Ibwup43bRNjGqnQ!nwip z0^QDGCeWfy0+q5RCUR0zgJOo{yRG|U=bS*1Ol;Z)eA|kxuIHW&Q*Vyvk3g+81iCvF zM2<`HRn^D6vR#h$E<%q#@CFpD!)>5iz9m}AMKQLzS^$Tbr?`5VZ)Z=-nu6bA#(N}c z;*iuk%&gMrSFvOimyM)(?qr$y#%(yq)t%lP4OlK_7IC4lc-ng>bFI?l5L;Qpv8gN3 zesQ^Iv-h5(8+Vr5`7MfAFt>+%-oPUN@!_i2>CHTt9$>f5daOIZNLjUR9j(H_=ubV$n$~UY`Sy*;YH`O^UA zvhFIlCLC6PurNi#tlXz?)+I6-&5C;W?%h&7Xit4Dv6$tInk?XhJw@m<8MAkhe(%r3 zbm(@n9LJ)(7dLuySeizEbh zcj1k#j;y_X>4-zS73Sl;DzV*BlRYQhS*SWR?kUQ!Y!dBeur_2|)|%*qj^jsx)qv__2bheJ#fxTpq7MKH*`%Qrolof!04}hz&oD{#*r3WIQ8kSs)o!fU+KiOk{Ff503(*A*mp5{I?W8uLXlb!xm;AVM%(ZD z=C^(@xz2www{aqut*G_zS#uzDJXmbjb};~X?(RFH4>A%6uHS*}u)|-RUlQcgaC~2g zh;&D2)ju?B=&W1pqgTEZ8FPn}gCrYrs`c?hGSA_R21Z30DcHJhF7#(-w?%pPe+x`V z>C5cRids)n9a#X!qZec-mg+$$Ev}=ZLuDvMaZ|g%h}4LqPy;Nt5wca8&m;8|ZAI`V zp-~trEwYojkIqd}*7F?>+Xiq{M=M|6!Tgf2edV6~LrCpXzpRBrlFJNifUFtZAmr?< zrDfIa5I{!Vi-17}pc*oAZs()FZt&Xoj5BkL=$41I!?|)PP|KLis6(?rskgc&yaz4v z`VCaQ>EkSe0^?3+YSQpz^?K7*hr3qQuohWHWn6Kr(a{7Lj$UnKvh6-DkKoU6 z(+oZ+LP03STZe}9V($5Q4}T6Sz{deCk_L!NHdCp9r-Bf=pa+TvEw6=wXGnYd_IIXA zr-sjtvyp@VTy=o4d%1rm0}M@wIL!uEYE&Y@N8uovG>N$K+qZ>N6l{yXd$~6g7)ncg zk(Emis^T!7n#=lV5L8~n(ccD$0kwUsLH}Yfp5Eb zJ)p8Voy)`PzKJu^cztrCaL7Ak3vr@qkEvW;($q(7Tc;r;`R4WO;zV_!<{yC!%MOQZ zfORh)jhFeg6UIuK0$jGM>jL+ZiK)yfA(yYPx2jcuFdP_F%Rlo^W`3<}d0^_s6N{|T z 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
QLg(L;Nt|fn`p8!<|eFUJf-$F zoPB=Ge^(Qd!Ym$d#Be7TZb>`hJ<<2XzQ9rI8P)A5?y~PxrsIt(!WIBT#}H~VQK?5J z;%uiU$mUh)f8U*u*K3!W8DaVzcCR}u>d`(=2XTNXTy6Vb)>>2vNDzc|^0g8%UGDH7!!hGTgGT>pZiU+A;X6ja$wr zeVAk-r=G2iJCkIe7d`tfpL~5V1PlfjIkq-7R^ogV0QZ5UoOf&Z^~bkZ$h`f9&X9x& zrE1=|WR|V>OH^G~zwWe}&0OkAjaTo&!~>pZlhf&JGY4k_v*|kNW^0{ z_K#utdUn#u!N$uR0S&11ZK)a?wo%sE3%GUZlUi1c!hdY1V^^0q59g@@6F_)&0GTkD z*01C2=C=b#Swy^BnIlKIg^Li8R>>l_F+mh$zU=`#(rg`=q43bEGJt7H%YUFyo8V;V{Iat{BG)5O^=zA52?R=$5J_ z=AIM(?uS(T>exC&ZaavmXv1%&qOvFojMEP!MV!h>>IJ^8exwNx6z&}b(r`i z!y?1|mO-GuB$E)FJ&AiDZl)7Z#nbrW=zIy{&psqHzD)hzUKC9ozifoXl;=$5y0Ph$ z;vNV`%2h5Rah>DO-jEP`%Y!8zu;^qZKG5sz-=9R`M+zsvQ@`uoTA%ixLPJ*f;4SIX z&q%CQ8}7f8*U!h=lk^-YS~~Y1P}KZ?fuey|?9Vp@A?1jvN__;$x6eqlc)GJ&-yR83 z4hK@J6zr9~*CI~A6Iy}1Ge4i*Q&v)yp}W!W6Y zvfZ~({29yjoijObyYiD3_pQ}j9Wu+ZGS9O+p-r|SZMt!Wet~M+f}HWWarT~{ej)F) zS~7qNY}xtqTm!%A&eU3l(ttw@#?Eo}AGJum#S6dsq78l6`+YW)XrH`awno8aA7cp4 zZ`&2}j{EwBqHa>}QjPPwUZqXTGfvMEq6bBmbcGcA-(B6rpA{qdK-ZmOvy(WVgQ%wB zuRgXtTDT-;^kI3D5n97Zn$4Kr+GaXp{c$AcbK% zC&YT$b_?&l|L;MA1UlMlE6xY^9~(O@f%{zd{OX?F`ViitmhgY9m&;EiW+$rNW0J(5 zvqXQ=m-a{LfZ>3#dhhH}$lbG!V?74C9@;UUJ^uvmWu-&j%Nh62{=Zwk_ILCl)bF|z zc%6MTLG)Jr%mgA^I2#5KZmgiQPv}seUGex*409}?>(BlrWT#b_^6#dCp=Y0%V}EC9 z{6C|*C$ZqTmmvb^k^<1vfhwA;>#4k%#f(`9sQN@3UMGNgk1EH?zeoeVp@VEy6rA`LHcc}Jh*3NN39!%65 z72e5Wh2e2=xjjYl%Y%hVf-L*5#$6883uYN}$}c`N+A*#Y*bkJAVic$jVyT*z-JXm4 z28aj-7M5J`S&GNzLSS5XwkTwA=&z_jul02K1*`}NR;fduP)6#>Fuo}&m#u=-m$5g) zX8F?OXh+TKZr`_A$%a-+#Crn(Cp|8G>zgX=DrQx4#74KR#%G?uQn56?&{18bt%IYH z1+gKOLYo{tL|o4N>L1J(b~jA7J=y!r_HrW4v#y}#1Sp^B{&cWELYh&Z@kTbDlV(k%LHXrO;*Nx*3OAq;t2r4OF$tHQzA9`KBq|dbBaA!XhAUM zRj2w;*?)U#RrGk7W7KxM3I!ki2d#_-8rHX{)tWpdO-Fv?+He@_xlG19`8*uQjCb8M z#liN#Yva&cDwTB}^TxYra8zosFkBL>miv?U0St+Fomfy8Lhw|LVf(%Gi>{B8!QhbU ztLHfl7Ci0QMARfSn}xOeP);gJmuer+V3urOGu=kLSPJ#w9M~>|H`oaDJj*?=C0^km zY=8h>4>Y%Se&iT27QY{NlhcrB;j=rmt`tS^9|qj`6QAaP1)nK=P5E;)$GfDfbv}!Y zR5!A;JT9lO>0A7+ub%ol)n0^?h&KUx4vQ=eDYrIXyY{BOXJxKRoP~ ze&1YA5?LCD`hnPaGZJ2=&~FFZ3-isiH1CGO=>2?sE#&zpy|-hOO8;jfg2Zs}Z(l4O zHMN$0A)AFzncv}E?Wpw{_b&e?+nea@$iF*MXgHRwycYMHBfL^aY;6Y7m=dX$1bDY} z32p7BC$UyM)?G#PX2cHMF0Xz!G%O$^HNx&WZ>=}hN9+9cT))X?XYOm%+zSoA74kGB zBh@WZfW2~UecSVTU!KDMK8O?;drw35_IOZyPV2fruKCuyYHVxnlsg%!TvZSEt)ZD} z&d)|jV3Dpl-ibNc+mxmla24|T{$0L68$$tzFpy$q*h41_C3xv73WvpfkalN1PZA%D zdO%_&wcM5G&ocr05XGMti@MEruhItID)g%O@pfJ|NBvL`u)Pwn)1j--!dACx#%9^< zP&F&`ZS7%~7EBrEGV6n#jh;EXkd@apF>G4M4;l~PK2la|G`~UrNTc1j(U$g|OvScn z!_kBH)(bt)XRYV&1UDXtDMhlVb7&ns2L4$7$6Q+Se3wlU)5ZHE3;!e_?-qD~9E2iY z<~sd`7c#@eCe}O3`rw#q*(m_YB)eLDTm-8zp`ZBU za&z;+@$R_)(H^{B^wELQzBdA3gwdRi#bc)vBFq|5jbOtS zNqv{8x=X22UckHb z>P3soKbG%ooJ9kf!}O$&aUBYsItTb4g&P0MVfN}NDS&Qr*iRubsnf3+&x=}hO<2F) zu$Wh4gTb*1!S`UVUW%cTe(QeqG}r?X&-a*~!#J{bO`*s?3WCSq>^EnO)=Ww=fwhsM zAyJa6-ka6$6=4Ct(6Wr$ZSmW;<$~mRmg|cvV^Y z@tflr){#Dm(%yfH$o?dar_dLbLcKtiiX-f*y)KF3Mqb;M>~E%{Ev1=Vn;R0WL*9yH zWLG%tnwD=`9xh+-K|pbWQyGMqDh>!pUnkjLe7JcW#U^=(BLUUtMFyRB0&nt*!W$GH zY%Qk&3{*-ZkCpDni1jQ*F_*EUQA^m9x{4{u*hi9Zs$?%0#F&+5G;MAbV_gUSBueax zYbobKC7?k^AlEy{_=?a`zjhsnZ6u$zJ<z`6a%vH13LD&FBJ(%TDKH$ z8{0`+r9CjHb$@Pu`}S=vmW-Wg3b3L)c@mKyvuM@wU6#Fu9k5CqP;xopHW1q`mF}J# z!m(*eCjD}WJWOKTBLm91%eNz9n5RncXao($4&g$`8|I zf7UAbQ)i??%C~P}%6O5QE>X*E^%{=OFy7z&IA=Fms||PsCX)QI`Ae1u^@sa5fe?Em z>&EkF&O`R$^&8A8Pu2J*J-3aB|7YL3xp$!7{D=l>Kre~a41i);5bP`Kc0K$VF?yAU z8Xp;OMmii?k2GE$Y23_0xt|q^^qc$YZUs_2qMZA9DA-l}D%Wmwl?t#~~uX>3~ z)ywWMEmHdi1kdJ6lsfhL2Z!m%Yd9220?bCsb2_Z*QsRgil@@$yX)+XABO-K$OK2BU zA~o?#gCtnXp6-q~mmq%}7i)RA99ca7xf#ycw_5xJf%o6aEt){PBMw28*4Ka&ZM$37 zJ*XdVLN@$e*WX3$+DYQ;d)z-PbXo@>u!1@jt|6AU9e&tvu12hjVg+LJnSt0tQ5|(F z^%0cyxw;c>{!ACXj<2$I1rF4vQ0Db#iFpUhK?m z2iPg!$X2V3$nst#dqdxx>oOF{Vu3{_RqHb`X2g#A#>zU!qJ94slUptLk*?n3;TdAn zD`Dgzj|E&)@f0Wt48u=aKEU)TH=xcv!_C#bx|`z9#Kf`^CD-gL0qWhnxIIG#rl2&R zz;jqSxar=Fl(7bm?Yygh=r+hF` zrfQ#NFt22fC!Ncd+kzwn%4Az@5l#lNc2 z;P1^=?q-XNj=1S=cu}b)Zu|QIG@?8HZmJI3ITu>INl+<0AF2^d>50>^70`NP5)+$6 zdy~tha#?D8rY(AYbFi?t#9GOI3BJNn$PTXEjS?W9I zTQBzh2mlL)_EPv`RVcq03`$Fl7`sADzwh}0IuUur9rkNha7^#;hJn=PRxB~C9Q(?r z3=pbrKuN~UzD7{;Z!Np;mpeBRmW{6P!P?^ac79-AT4Sg!j1v{PyOlANx2<;g1 zJ^7~K-ERuoWar-EXtHeojWxw=!gwcVTa=~GY~uWZA72HLbwSE#OpRn<Y=$oDWoli+r1Zx{EKYq!sGH=JQTS z`l*m@fEN)&*~YTt1bqOz0XR#%W*;oDQ+k6H->Kj3+eg35H@tDn%qP1;Z2g_d#Z#2Q z!!~?^swJkqx{;cRx$3MP$=7L6%=%|MsF&XrTuWHS8+dW&>w^8>r^)EeeSJtR5O_3W zSq9l3bf~i&lus0y_0wIk*EZipwHE``vd918oC(?6B>V{<9w?Ss>H@_Y!6OyH(P`;=gceYZ-X+zCD>1VyfU&t#fuee8`Htnf9mu##0Qw zeo3yebRY%Z;0EgpG~~q}N}8RvI3#nQ{aNw%xbG&$LBElO?dDMCDR4COqVJBgKEKKC z5O%W%;b?^rH>vvMzpcu4zGK8eund$ReQzy#bHca1GCI7o*OSqWlJac1nS0+0bF?;n zxoVy?L+aYFMP$~N%c$5h2>O&p7>0ouyH|N9<_*KEnh%d3hydHax7{}+4j z`PF0^^$X)z7)8Z`qEsC~q^n3Lpdun5y>|rx>Cz!I6+r<3MF`SD?hPTLi^sU`U4AL8`LnPZ%%p?)vlaC91Kk48HzNy@Iw>H?z@$Gu-n2n zRPFqcGuN)4&W$8cbsgry;VZXp-qdiFp%{CPxMyGF*T3|c?>HXm!Ybi%A9n5a_>kLw zlnGZG_U0iMdi5AC#B36|qyGIWlGguKO5l>Oymc9tiOyQb9po9&(hGL75QGdfXy2UT z19i&uj}MKg7o4?9ZZeS%oLLd(1k)6AnN%a^`+7z8Qs^WTFWD99LR?q~QaZXXW8KaY z&Lpf0=t{eA!{aaa1oVs5O={gbXFhPa_Ze6lwueVz(#1>zOejz#1P;dE{L>J%lux|B z%E;fb3lmI!QA^$M_O~U8uKzxy-M=65#eJC3)2JKZAao6qI|G7hqhGL=4~noFVUZ<7 z=9?}V(CEjK1FBB3X-2tl=z`*V!3!3$!+iru01nLyV-pjw7x@Ac!Zw48zxCIzo_%`h zoP3IFAs4^Y80;R!IF8nl24S@-cH7F{zF_RrUM(!ZP=Bp=)_;A{8WuqX9sE*2QcsK- zvCxd#F#($P&u4&?)|NOTXXfk<(#y-s)nm2z0~UrXFH3DtehfnpcFY2LBb8B;y9D?T zl{6i{f!?fy6=V9Um~!9Q*|~D!Xki;nUvr%y=LN*#lvPxERm2EsVq?B#Kk%}Sdq+mS z`$sEZK7rS4tw&4kqNGA~uhx5rt_n}Sag{Kk`iy#1NcHRgF1v<<@@c5f6VnhUrbaI< z{>Zw@4x?x4C(y$c^8;oRo6BL)rHmNSUTLDMBTL!&u3xHt598rqp#l zQr7YK*|M@S_sx#fot1pdUq$2CIAM2uhmXVVh6ey7$-a(bmy6aJEDy~33d;~1(B;ef z{`*+0i~fBqQ_N6Dt{66$2k92*Yh*NAS+e#4R8k%Qs*|yL16ZeV(#74ymQMq(@?>_kbOIZmG4s{D#M;Q|_R3Z7+fC3nRR5nMYdR*pF2~J%wLfpTPkau4G{1T*JFp0sCUIBAN5$L&y=6H5NeVjyM zr9TyLh<1W!b%qLfgkO>XLgRJN-Yb~3hCmol>c_)l3;Jzz35?7!Lwg>GComEE4;O#g zSQZ<79(c0xhj1laXDZ0j$=D598Jnn`O;Y|fmH5fa52O~d6j4s{%7zgJnd>bB}b7qW`oHcVj> zlj*%x={GDo+)S;T4!f_}V+DC)3^`}hBV|iiokpsi2l}->!AS15Jr!%vwBV687C^u% zJ$(50mc-XnB(XQ={~IKrVAHg8^qU1(Tn-Bj?ON|QV|-l^zw7;-|GHx1BONa|V}~6suX_7k&G|Ms zhL$m*r8gXYzPC%DRF1fv{JuH5Nf?fRNl|cl1mUw*z93)kyX`XEtOvWlJ?dRDmAHzg zytdaBWHhMfO@rfsK60523Tpa;@IGR4K&pi6v|)Qqv9+3s^Y#>%|DrkophEwFSufI{ zE^zAP8}{BpQJYSsL;)@?dAf`I|7mpN(yz z``U~~>lR>mIxsiiQ~w~mUp=YNI>3{imkHk@9=;PzD%4NJ7BH`&Q=oqnKLB;vX76=KbHiArLxSl6j#8Eg-AX-# z9P3RIPbd@+ewgB@m6O^KMf)&r%s=s|Sq44yJ@xR_LW8mg$?fr$mm@<$I{7I3ve35+ zAJLJ(TPFuNO36H3`fZN)?q~Hhyr-eKGtF%0L^cLtW9Pq(En{Lp1N1ef^M(;(ztav- zH{pCh;_Dkfga;dw=&y~&Pl{^NPqrV=|I9}B36c5?*n9?YLORenhw3|TJ=uS-_}`0j z{_LIfk-EKGcDNpx5!w=DWsmem)1PPed*rh*U-Ay{&qu<9q*SO3K`Fe}aUyn=mG&k6 zZ(UTgRcjAwKRfMsQU7VJOPQbgYsKGkH+)Gv*qS)kst*PH_TC4DzltXA>zO*&NP1Ro z95aQ{1~6Rw+Z>`7hzolb+|VDw^>r5@w~`aUQZrNl_V7i3ryJc6;)sj*pw6istiV~6?5JGm?4ap)-v-wh!dP2 z6h0Co(YoeoH4qWWDr^WYZFw~J)vI@faBFD`i=ApR``SD_JV8Cn5s$jd-x0hTubg7@ zHTpmj*VxS9R6+ViEtFKP9=B^OK~EqKwk!Zi|0#?DN&1KM=1HISS4ZjAVGPo5q9Rlu z8s9L^dN-aWiQW1a-=&VJ9Dm>y(NIHdXZY*aKa7;!_yp{P=8Od3f`ChO$TbEJvIUR| zc`}W;RM%z;43M)^u?~?U_5D_)>)uY%MgsOTNB^ha4}7H;jTcW`7? zy0hvtp-D^YkN{16ftt*YI%IR8ET}ro3~sa(+eX6wXaTOfMPM2Z3|ATTomQxQ@sknp zeS)&k(H@!46U)!GI3l0TMOSH8*uI9I=Uje~)HQ;eQ$p=n{V?tVtHE~bw?U@tX#p9j1O@z8PP0OkiMETXsgiQMpZUy(`v zYMlpNb;K!L5$t@g0NaMl_9?_CwI3$B^K(inDmq9cQXNe`pk?b3Tb;hJ4G3^#_kvt7 z!`3Gl>}|h?UZC<&qK-ou3&WK*6ax0SMLr~#Zb>SMbKT8G59w!%$f`IDmG{BfH<#*9 zVRkHExXY?U3fPukUUpx3hoF3=V-l{M6pJDaroS0Oi|W9pvdZRIL8B~#GAo-eUxS(* zZ&9bxT22oQoWEahx{s%~G~2K%JK%=baLW%q%z-uM!?gc$jctD=;77|tvhK9+p!uJ_J1I@S6u(gKV3X<`uZH?j%TJMUYJ%sRs7(A zVEhiv$nB*l89$GrC4m46`rNycYGmIqu|E#%F7r5IlL9Su`S90(4% zs!>sWDn0mTE^d3QZtltXa|BVZw^j`l|5PGzXF4C#Q@JpRTBc&{;JnECv3lec5L4d9 z)EarG_{<&R+clc_i!5)S#TxrM=LX?v>DhWZb{F|{x86m0`*v}fc(3;kK^VSzGHhe- zu2gy1t%CfcNd3V;Tys=Lke4^_;rJ+YN-WR4xTn^58|LQhsDsmA>_m?`_b%|$+zmV? zITfu%RoOE#p%%6#=uKpwso!~GP~GDS5Yiayk+v+YENBW~I2vxjHIrr8P+b^$z=3K_Mk#n=w zfH00}CP~3?2^{N(T6c2MciBDlJXeL#n-FLtvYtBr>~%K(g%$!#oFn}|yaPl{Z#|ZN-$m^G;FxoMB7_yO428y+wPPD{ANpU1 zoOi!l#aXCdbL*i_T27bnt=r3;3cW>g3gN6`rphS6iqSR$hPb%6o$+RNktcudCyf>* zIW|n`f^xegnlFOiNiDgk-K4#n^pQ}!_FCWv>|t9US77JKRiH;~_jGd=alp{-IqDbL zP9D;6s^88!7^xBdEdl30d$yaP5lQDWTlq!quY*DQSmZU;OBf)3^qUA?t149R>a+X9 zt^wzX3Rj{TYIzket0s1mNxMLz@zDSNDCav54_$3>rJtFAyG;WZ%N+&`=e=SjsSb`--G9c2Zi#QtT&6U=+Sc1Jzap0Nc|UvhP9#&dn(MLdlx6?60a_1e7tSbRhH-Ma!Rqw zOv=-CAW$wQF7EQ5mc&fM^|`sBin=-2KwxjbLc;tYtsj%_2ajJKnD=rFx~C;GHD1AG zc&%z!fQLxDVo5OFhpn!L)z8tehD;+v!e@OkT}#!5;kf{JON(SiuGScTmqp;ReWeIf*ruB_l##3I(53CSv(aBCoMp3^ zDD-tvA}R_AjY5$QEaY;C)XUM=IG)XUeLVWe`uw0WEal7s&l{h|GkTgk1{^PfC)O7{ zHFA%3z{BH<@m8;v@e^uUW!wkj+e~MO1#6vA5A@Z4EY#R`k=vzQ@oQV(&gi}_?JB-2 z2RHlUBv(g91m)Mqq1aNP9Gdt-dH^@`O9>7n(W9C*8 zFKSoR$-#aVj6C;`z-wa~hAQkSw^=<$vD}-lT!?A-2f3=bdj&yd-c7_X|{wp}8-~AlGtqi}Z`k0!*@_qy0h) z*|N3N9MVn`6BCG`wcshXg=00BfWe*Ic3oQ>?LQ~OO@7!{MK^8N=tPQ%j|b;2AE~EF z1@3nFLc=PFjcOS6XWHw6=LW6O($0o7G+(K6EdIvHQFzGHuPI8=@4|8@p)rdthmwEFGL7L*OMF*^+`F^oR%E=0}-SqGZ@ z!;)8A!L4{a{2-IA_8JdQ?i;Ywa`IR!jJ}sz>?+=UQ%XlU(uxx7OmM2tI-S)1VK1v; z-|=N%;VxH?rF>!-t!ZA7;^-;@T|Yq?tRrt-pWBO^APQOGvDL+gV*}AG>>$Z{W^Z^;v9H$B~RT=c3O1SZpUpzHd`4RrHYa zC>!)cu+y{ON*IhI&;N21C2#x75*8q;jj!a_U7NlF)6BuL03Dn^ab|0IB3{h1vVn47 zB6 zP(nng|2hZ!JOrn8A7wPnkR5eNuoq3>%vB>C#LMg} z6dL|ixk+=!t4zn^@C)^svGnXYv1j^=#Hwe5O01IZMV~LG-Ub>kbaPI=)QQ}nWPeJ1 zIZ-tmpzyS8^j@~i{uW0oerIhKYZC+$P1wp)A4i2^j-^%iEm$>u6chn9o5$l9WfZ z&n|oYX2f)RT;a{l(R96oRn6SgLQX%*eid?8!0ysWooDhnJ3(4r!J=9=6k8~0$DIy>(=T1AjRX@m?)NbC?NA{pp{>0pTr6}~72r|XnA|ILzML1t(9 zOftvSlHx@C&br!?N>`sMM-v5yAb5$Jqy8$ngkRxKJ>y5H7H+Qolm+_Uz zzr9H6$8`IU>n*(t;3o);#F#1y+~YJVLuSGzmrMa8QJb!BYHs*Z&u71|o}`K6?6%Dj z3)%Jijc@2@gNVt;pZ!I+EUVU!5=fA46|wD69~NCu@(vC-+1LSW$kXFDa9e+b_t&&$ zr!HkINk*)k*r;K1E2{8Zk4;wNEqgS)JYtO9?_)+agUQ~^T%A4CuiVBCq0pUmpgy-j z=es^-?cx*E1M-g*k~a;F_BHBPwrGwpxW+C`ns4B0=QoM(>8YI?Bt62f0J$(epYpXVIj-Sk1(adB<0 zL*vDJUL@sg=e2G8 zwU>jbuH<~c*KIpeUjCUl|I~B9ou69)6l~>B_K^ZcmG=c>`BE0H^%n`$eF%`{A?jDU zxI}pSqoQ2mk;%OZrb7{#L216gC7WIV*^vU2CkpQgWB9RmDUm^Klo>FMqJA5QRJyK$!^VrcVK%2BK7Rd zy1JP1jjGs`>_+Y%4>|5KE#ZEfPYdU?YXWQ6HV4Cg-Zlyw0R}^{T z^z=4QUOA}{A_(SsNsltKvRaBSOM(OYqJXiwRU~)aXb~I2C)c5FBTt7<5uT8q?zDy_ z%dd{o%&>|la*sd0J(eE+rQD|bL8}XJzK6$xpOobq^)JqKl%(7CDQVuj_sRvnQ=IpG zSY*{3#TCXoiQEJr(_zpdXtO$UicQPI!y^u#KSN5n&Eu}=_JCa0b6sFz(mGukxYWKK zce{$`>$-*#=P$gUV#Dj` z>gvYf`BcOkFr}eA#KLKJL`*YCYi)7^>TRc7uq!Q;q%P5YSXaP+$c~D3z5zPZoeFv~ znJ&r=Hugy*sV0+-k&Iz|RO77>a?6F*{euP$#ntI{jR`(xAC#IbHUVU$Oe=m5qj*Rp z^hd1?^3T6&nq9G#hiUGBQ~Cj9+DVw$>0-3A+q0FUj-6)72uW65+EsRjN4T>l)m&Ep z_+Z3ErM)LZQR@_|mulVI5|LyObDwim! zfW~H#oT?3A5$whz?LP}?sf>1%2JFsK;O1=z+PbybnXAQ!SQ$8vo{Hr5%@LAGp48hl z4Om5}F{1=c(y|ZMtEY%6@wa>FgbuR55jSN>_UkhFUW(Ku$FuFS1VekHFTRCX_n83$ zJu}xrh@#N@v!n!-+j8}qO7cOv|BiDWF|xi}lQdV+PY`q-hE+lx%uYD+s&&9#iPq+b zd)-vYV{~$wuZh!7porjZ%Y%2gl<{~s?P+N>&r$DujLJ{PDpKf&^xKnZVKMLD|8`B{ zdtjP5TIVtQQLV|Yeco(eGAq>H;yS}A_dkF3gkC-ZA5v-a_Lyo{e=&8Ak2y^v;ixvonoe*Nn*Hef2I|Je_DIYjHnYyN4}AFQSb zHs1HH50RYsHYSfaQlV;xsu6vAY&M!L8_8`~w!3puP*L7=IQC@SqgXTNOzZ7cJok2Q z{zfgyvFG>IAWY|o1P+RNbIf-A%ftBYg@A_EGU;uS(Aqfd%h7L`6H)b!FO;{j%B`eC z*JHMmI{jX#0E%A%nsrmVrorM!OY#In&rn!)%jd+dCtCmh7%AIDOjhA{-6fjc(61Wx z&$jl)qepAWV|9T$yWe7U3kx`2i`wfm0@Av1%WNKm2y@BIMbx0p()5&Zs z>GZ8Ids;}?xPScg{d%XYM;m)}R)vO4(v#-6WT~}3$}!JfZb^eE2!q>6Gj^!9?Ga%T zpOMBXz2NLGD&)h|K2Ve0Pqh4};m%3y);YxLeAt}J&aBK~)L+?|eZ5!Mxf zuNpa~B$Csm!T_1&444GW=I+Y|Kgp4A)vaCFkaAxYs5)96nU^LXrpvTBuRJ%n`p*1N zG^fKxp7N{!503%9VX3s}lDAICmq#ymPBG0i+@zn0kRl(qVV2|K8I<(xBcOE^6@MZ( zwkh2@=|uuJeFfjY|CGarVaasHV>2>135O+h={c>2{>D3tC#hohH|$WFF0sav z_jq`+V`>)w2DItPu|u>vRv9^Aw`E!JZ30sUUpjL%;w`=RYd?P-cem3ceOsPDTas_c zMDM=O2$z4g02@ZOD)t4lJu7_iqxCgwA-soZ{-!&hKS7aa%(b+;l}cs3II9EN6qzc}q>X1yU} zBo@)|{g&GeF)=-eqLg%*d|vVd1-Gu)$n%euX^DCK3>X+WM>3zpMid{>2gx#d3^4>b zMwRx1+V)N>z#0?9H!4xRZ2S7ueiCa@Epn`8~bi_yr_+>xAerFVCpR) zPsey2;b&2jx(00;W_Yn$>*aMPX1QF8W4set z>;UpMI_aauws&_{+Zw(^O>gVIE4B8SE$$}}%d)Se=-0YAhv1J-xp$Ns2!}WP+!^%R z+j0h|b!KT??z`B84^q2K5W}OUtjL1 zb;+1r#_b`<%mpkL@^}OaOF+K8V4zA!G_|_SYsQqBY4ht7t@grX+dJq-!+oX|TenYS z-HEW+F16fQ=r=%5!JfrYH`iH?7mf|vy2`&L{B~{&m{rdAFqx?GWM4pWL(BoriEy!F z6}*O#kkc;hgO^vzi?!`O3^dJSnbMXcQ|$`x=;OkvYj$3t_8A^f`Xe z7ami3eudX}b6>1>wH@~`N)s@U7cYsnP58_J11ZWYI-TMC2jt10W+)%ZDzUBe?OBcr zug-e{#^Ppn{e=ReEM;)cnQoeAw2PNj5lh-lRQ1SZ?S0bh72?WW5MZLHsoST~_UWdH zs}&_rWi|-G5fv5Xeh?&g+kW6VSjQBj%=2}+m(J?VWHO=!HgBRs9gM1GKz+W>-w%Qz zr-uEP*4tHP*0Vb7>*xJ?`A=@x`HlY$a~s=cM52I=g(ed?)tkBcg~ammra9TiDKNgI zjMg1=Jiy$rB8-7qpi+uuXX_&#(MreI-cN@|Oq88E=(9Z;f~r6k zn9ix7i$;-KCvzb=_{s6bFr`8xH6W{2`7x$tdEeagOY!EnfexYSw zKT_`P?Ty@~py_QeJ$E7}Mm@*0!Dn5;y z>Eriy&4x+`H~)^3A|K>WSv7WLDwmskPmP=eis1|t!4tyPdj%i#j5E7cH$rP?(v(|H zJ`k)fE;jv>wH9tzk+yf}zG{1kc|~a0P(6bXNIcXWDh+YI%TCXP27(~hr=B}=#l2b*~W5jPDs(b&BcDLxyL z-C9=4Q5OXYKCLi+sjrL`G{`u_efXK;+>JigXaA!G=*nE9skO*fm0@>+&6rt_4)VSc zK}^+HT3-$eXIh$>YZC~Rj53Roe4O#Px%Cm5U-moEmX_{Znoa zV=9g$zKzsyI1u;!VJKXqt69p;a{9YWz2C~R!rVZ~N5je%`WRAAZh8r2r>bGkJnCA& zex~)xZ)jNNHipUC&8k6SZ5!m_dhs+4kP`MI}aequ1x0eMJL!d&@<$2_a8J6 z7##kWo&5#I89Tr2DGmX5>43xyxsdTPvFz^L!?YW*xYQ^7LPBcbSt`H}jw-tx1O*Dn z9W+M<5Ug)ZEUeAMMVjffE}&z`jc5UbLsSBbY8DJv70jL^A!b9M+8}XKNQs+z++tr zSpTYwnfWzlt@E%hOfqKTlf;B|>u!~Q;IUfs$?L6>FbXAc8DoBRF-K{qTdB1A@Zs@_ z-@_#R|5RH_+$>qDGr7Jo-Ztwtm&={3zS9(rZl=n&A%*TP#b=+@B%txxsMPc!?AD(E z{_#~Z&Z*l15VGiNZAWOXL_?B<2!M#pfTO+f{K?g*Z0tGny-}JnhNYUbEv-UGy5;A& zRi6!`zQ*^4gk-Am>qgIRP$IL_&IfL<()w^7pR5o)DTl=`P8hVe|LlCd%pP6sUk+RA zmG7h| zF?niwdTyAB6FR-`?;yl+a(V7 zcG!I_Ojn4soobn~lo1*k+g&9xMlcl*FG$v@;WVpkE(J?^@}3-n&CP~a5juf>iPWyN z=~R&AJ?a!(ElyY;Id9jaKJ@d}73hu6%f|iQHYhYyv>nXT330F)tzF8}gikTWkjrHj zGq~Wfzwq)6KlzJUKvHJVp^X=w;w(yq35L^1K+?OZpKX|2-HMTTxTkZrdAW%hG;zbJ zjPzQtcUpR316^HLs_gVo)7W0574X~b2cZ&SJ*JWCLyp%sG_z}Kh7EbtOgu34SrWdw`u75#@%FA^6}h8R^Stk1*Y~sQwB9-8_Jc~W zZv;IBZmq4+3H#2pqp1FRgR;*LXkVAXdWa@U-@&NWr;QsMnOWtIAw(Noap%n;PV1w?b>g~t6^85X!q3Zs92HVg3i zeKow^CAxjy4;5_cl8e5y>lPHOG1XaQLObf!Er4qFM<1k{5pSq}ks;!KC5~Ut6Etw@ z+UkNOvdYh^QeGjqg8vMeF6xYNf~LWw&V9AUG!kAngoNioi5B1_UH+I(aTB%8{d#ED zP(Qi!iryCNlzNVMM*`Wx(pzlT&yHMOFI8}0n1WktzKqfb=qS}|06E^+hFz;ttM)B} z1hLFkos4&V-bAyUy2S$$PZjQtJWF!})@Q9ZHfYKgWWUnq&yBeZv!XTc$Cx0~Utk|1 zR;8`CW%5-SW_#@+cchly>`@hn>)EueE`NM{tuH4P#-3bucCy!^| zF(UzPX^85F48yPS*H!ZWDXa6@oa76$i3h+`74H&wY~1M9G*Anc2YPG!u@LQeHa4;c zES-6Mh01JfgrWSAAWny|NuRW|DEq-$m`Sr(0={|7jmTH+&3dR+$9(vZnvF)@Gw^?8 z${j>;f1LO5u~#U2_~|!t*^IemglgyWA`V^iJ)*{^gWIxz0G_FoTI{iijI4OXQe(X- z=(qhnBV}G}fVg+3>5#+HkW~UOXfqd%Fix5HH!gS>IjSdzsv8f}P2($k{oQyq?`7Vh z#oS^dsi8)OiX97yCGbaH^ofXOZ}$nySYd7qHpx14_=Mdv;^gGacVbgaUDGc77;bPF z<_4YBW}$`3_9XZzV;WYX*s3X}R0P?u)-A+x-}P8x{@p-T?3#u=TeF^-zhlkK!9pK; zY8h3we%B(1)%dLQRMRE_>l@I54A}hmG_F9BVfT8ThGBdYVmHkZHzA0h%!IN4;?u5g zA<6m=_?sX*(Wq*1hd7Y!-aop@d+l15@xo!6D?OiHpV62CScppJv`cJfVquh{Hk#Hy zd_YLtGfJYzT$ZJ1k0ZXEY*dHc#yvHyv$iAEC2-KS>pWP&lCr{8`buZg&IET?u63nP z;AN2i4?T>(U+YSd?7`nN+X`4)k7gegwu_EM4Yv2=NCOKVBC2+2fW*$#ufFj@vY=6h zdi47f&ifPNwER!BU-tAMQBx*$9!GjAWjzedR-xUEDb8{NxVg)36Y=}<&G#TdcE(Fz z?oj{ztmgCyh+AsB81Hky9wB78qR^A1 z@BQ?=%)UtBYmG-H^+<}Nk{YHsbv{+R9qx8JVtW$0hPOWOp3|6E{)v{%0>c_jV4Y*Z zm(%?qxJ{S;l3jmlprsj((jbsx@wXlX`t@E)Lsj6Dgi z7@|)$r-}dfhx^hK*_wxcc4@CUf6B@g8{5L5kvkF+sv8Fj6FOh7u_!q)Jijm-&O*9Q z*qpwkP+%#6_xWf3%zUF!cDu>#X(xI^$74ls$FTb?q5Cjq+=}sQvqu2c10!N>yRboO zn^iZ=rg{E>J50OZEMmr_SZQ9Ag4}KH(ZP=LI!X2pKof8X8ineNG5h2Tie1G|IHcvs z5mS>h2|OQ_hqdo$YLNh1Z0yZ;3TTaeq+S2GzVD}^B5EqoA0_=l$JgC1Wo7HU+OaiX z^3?+PlK>Tr`KZ-^wu@<-a7r(ntrsAVVJ%RKHa~_lDw^!eK9MP8&8!8H{ua_<~DI2==vWH#D^V#r* z!-WPRa){=Bg=_O^1Z4zQVbQ#C!b$C=dg7{?Ra*yKzB4?`9c6k#$%owFO^l9;`eU$B z#O{}O&)orITJiP#o$O2z$h@wI_Rd%;yCP9j$#nY{&N)6dmN**%wx@d_^dGbr<@(l~ z@3$La2>g`g@EFGpT_2Tq`Y|F(%H5-zBgEtST(hfqncl=f+%Z1__363KbZ7w37ZV-u zv1BvO+GcTN@Q@Rqesc*A!URaBl(1k^dv9rD_)UNCx&;2xXpdmNS<*+GV&n6T3^Hdw z3UqiLZj_Q@efk_=jCk2y?entx)dRJ#0<1f9s?~i;r~lcvDGr3#IWPoca0l-1nh>kn zHABatcUFhq*?M<_AW-I??B`(yk69VS6v;RM^AqJ!Z@25OUVbs zcjx4Nm2Pdo8Wv=W%^;6FwVUL36Ux(c6z z?OwAr*2#T0F*}%~TDRp#SEdCTe!RA*IdtqW5M_3;jHiAnnU`Hg{{9k>^F+?h;01D> z*~>O~hmQ#pNJRS?YGwImaw%Vg`G+jB5z^c;dbso-h%TXmX=C2Ir>KSQ?y2O=j>J_^ zuooI=UHVk%MCc?Q@x$VI6V>}>-E?Q}H>TEBG76c_Y*)dE4!xOxEV&Q+#@cAO(s4c7 zO5Atry~iRyi%4f?>nw^`Vc*-LY2iN`CGTIsok;b!y`*KU^yU79*wstEYIXyl#kT9W z&RS**Hne6%UmIw?d62%zFY+~WZ-sAM9hv?aNJC`@fRv(I=cBV`!fVqN=$w89o3m^B zOJvk7Zs%M6HNQ#lsq0y_iO-VRe_C(qvv7g*`m6PtF2SD|ou35U=?Tb`jJc+Epfp-b zj2+5hW5*~5oA5Rk19Tw!)J-yJXD45X_o*2bCVyb!mo!z9n8*Tv6>v#~y}|3Giq%L~ z)EHMl9p&n}3~BzvV8HF;({>Aj=NNRt3NMNxUga^!a!;%%z%EMtP2{N_XssX+#T?&Z zozRx$IO>DCeDatvcf*f4$8Ox2a_=w{>Ulv5Vj*O$KjBR<#f zlwv4iYsf}|{xHg}zb`fL>R!S1#?D{q=qR0vC|e-^aNIlm?-PxOOY31Seovklc}WDd zHVQp8h}%yiHzfV(ue5$dQ4D7iEq!#v_a|5E9DrpWTc>bR2n?dQb4LO?c|kA7AZTuh#i zpHb9YofepUEWMVzCHm;7f7#T#*K)d`2~iKjzy>0Wf)fc z5`~M41*==9x?V@h{QYb<*;m@sZ#O9&vap5+3%u!o)$M%w?(iW8AY0UPkrw(dPppi3 z24PPE)QON&Rq5{OH`9AWCSGMUvCr)md$RWixtS#PcXHsB0gSuHhbZQ7rlWm6$G1a+ zKZ2D#rYCAC+8{&5_1?YZRGhq1Fef)RZ8<%8r!6Y_V-j?f4FbkD)L`D0rBa2J4#RWa z(qL+;8r!hOReo_l<9E-!J(4(WI~6*Go&uGg(X}K*zS@)R@QLO~J+H_w>ZZf3^(`U2 z`DSLh*;8abuBqGjr*DCfH^jCWPI%8oeV26JtNs@W1gmIFG@-T9GG7 zSP+v-r#gP6B#{L{neUG2O6Z>|jksMhJkM2NV0=BoVxYKH+V#xCK4u=f7=#ns-1!?7h@}VTZ<;q9ekFo+xWWln@y5+yWo4!OD+ytH zDcJH4gav+uz{j*cCtQ2iqRDq335-dZA+uN!=DnZWqOrb_^Jb9=R2)3t)4J<|1DFcW zwnvJnCm)vx5ro2zy%o>CkY?JXu7Av!@NNz(EVGVWcWtc`%a#p2y+2m5OOH#ga~w6q zF71gcZX+rWcIR5rSCpf`yoxEqBA>^;CSBQiy^`po_TwTuJ4RS_;~Xl((X=9}zrb`# zFLM9R>lJY#KAA7Jm5WE#cdn0vGEnPDp1s^#!Q+>1o%9!Vl0_9JAX<;Qrwn_}B|W-k5}cOnPeTKX!EWS&!AzzuwGpLV{$s!C{Sb5FIBG@r#x$0 zWRh3Pfg~eUKp%RuRQHPpEC~L>HTNo6nVIvMMCfpTBPk_}$NwslV!og1RoIWI8jGHp z6Jeif&GR@2CALRaiP#lZJd|>qF;)~fPQ`)C_!$?@3Mev%8i#>?g11uD zCiIxOe3f3*VcOF(aoNp=!M;v|^|=FYKO{IdeD7LqWh@GuIp5+69%SiOAL2XV)x$H; z?&d3g%tALq6*d{)Jw4@Y1yE?A(TM=Ug&sdgLP_zvCPR$kWo)5|)CANQSI{%N%I4{$6g4fN=8tb6hRX@C+S~FQbw(6ro!yLOA(ol%P(FA z_LOKnzH5KOek|ItMxqN?F|r4=E%|l**Z&3=g0~EEht`Mv4Lz%7QUCou8=LUMX#8Ex z5^}0kCHeXj6%hQe!|68!G2L`~(!#dWmp$(bl?!t6*O+YvKI3HXO#I2q2LSIvUqq-& z@x#I|ua2{{cBNWmr))Nz`fj)2Qp5iw2&RT)#~Qid!ap((u#^tFf$J(@n&Gu{$bT*) zE5EvbMtZ|Ze-yrHq19t>_|DW%4zD0GCU;n@?+6FX!~l1!G0-A zOp3|e9P?`}ON2g14NxRRpCHh0d> zhSrrGD%2|KEAub#OrsV3_IpdT7%Logwvw*Gnhm2$2As_)fJm;qh+wc9%)e3&)tdif zM7e!$p1w+Tnx>j^?|F-4O)U&t=(zdjq6u)u#nv?{2_BNG1!cBpYNNq=g~XMml|J;~&~u&EMItr?j64JBu(RP+$%|78T()#qf| zFW*oHli(&lY-X6vX3tK#mru7aQX=>9nxW6M39K(vLR@~m{grxwdbh`dD)QaoAdaKQ zK+jTW$l!k(A9udqhSanT!LcGO_>d=`z$$}ifW)F~GGQlA<99|%#3G5BW^ zrhK=9?LdJ@KP{y}>|?S;->+nW*2XuH#fh6;kot6gb8kwf_0*JEK-?3asbe%}10yTn zYHU{(YutRKb)q{S(`moGk_pRqu12l+M7-M`4&0fXSdL#_jcjRcT`lOpE}(Mw*vYPK z#*?QL6is~%8hqn+l26uvNYQMuMy=4OqHk?h)&}5wE=2&tauncgCj_KOdP-o++jO1} zzoHmYX})CtTX)l)c=rxxSYw3OAjyFAhTH&}nKJj!cK1G6sU+kp;L(zGWQn|l_`EuD zy$bEE)6v!Ypu#QLTXu%;cY!@Qg^Wu|Q{nb0$%JVa@(9YmC={P*CpH@aFzdH;AXQ6R z#39*8{bZI3+d)IEZ2$aiSE8XQsHMAmYLpovtwaIzR3D%kfDCSZmpsgyx_(fz6*X>I zq*Z8GFqe^$V^SBP#COhWei(=ES}n*a9Il)JRrT6ls$JRO8c~X@Q8wKMCq9{P_2KyI z2OvtRoiA;5|MEMGKcK*$GRm+pX5#x#-%9+gZ9eMhW|f-iuUC2as3*yDU!E#c#jmH2 zOTN&_!EZxlar+XqjblV^NH*rP#u-+pn724=pPQR7##&_(%WyjRUps~J^>&LW^V{2b zF_6{jQ$hsTptj|x0T!8*3y9$wf8D5~%Km{=#j`O@Teg8p$d2?=eSq-&HkAiyRXdyP zDIi<7(?Zsw_ziMI@^x)2c8=jy?n0BRnpFGjcTJ#M(`BsX=G@JCPcoaI^mwBZ;xtdd zxA4u)a1eXjwnSrmi+0-+FeC!L;ddP8W?GnFXCh>1^f?&$7O|h$-5_`Ous3vPHq!Z= zGV}eJnP-GS%OtGjR@w{BA5S!{s}yAQh&x7q*|z350NLjt`?0udRW6*LK+TMT$7w1IDJnl&|)+yj1M-Eyw@nm`au>}iwTq=mAA`s>k_?fhxk9^68~bz z>)#o6YS0B`$?eC#YtYTq@^(sWtbp0E-k_$Yrlk#$wKcc=-84)YASWl>Ix=J!E$dVS z*i}9>=00pBpa(!wO+0=W4os+J>urzu^zUf)c4Br;oN!jYLD|LHXEWc?&7jmy=@c8y zqy7yV-Px^WfHd!L8S_Rp2V@4 z4kMAv&ELMwL@5W`E&Wa%f;P9*wKV!na?Z{=iIMph*17Q*{JiNdRVAF1eKNezbV7XN zliwaf^U=rE7;M+_lVnGnSS)bu0mnlzTrxzliF_R*FQdyq_uorOqi9@gJr8fUA3b zl>-1MG0{FQi@^+A%jG8c-h1*b+Haa?YMPC2qfDJu;h;pjf2Om_i>l}t^CPyMbCR?l zt(5Q1+D}Q96Z#O%9zEvKY=T@OZ^q=CT(I2RqVK6yF;e#a2%NAs9&J7Ixalr9rgZP! zOSA3I)tdMGecfv4d9(H};c(eX>bwUYSM3cfRe7yFbV_f1du1G$Aj5FQGhoP?eY97RH z0`Z$zuxfPaEt{0bBN)ca93BzQ%w_FZ0&2B>Q0LS-WpU}5y}f{PILX3~} zR+-D2l?wm$nAqEvE3qE%r_ z$;?pXVm%4oa8vo)&!(EDKj|gbV%q-Y*m&Qk;%ALq;;glJ_RtsowYJ0}# zjA=W$VL)#TULV5ddkF=QcRIc>;u>@);im> zcQo6SS*D9c*5BC7f7v@^{gs1g!Z~Pvz^^LPNQ81S*Qs!@Sf*!}6VB$B51_hqE10ph z>{@07{y+AK20rX#wew?vj#_6iE?5QW~UFltwy5x;s_65s;8ZK$J$Lq>)DY zOoaWPb9ZjeCtQ3Kn6vA9K+DAZ}r zJyy~*OWkT0>{>aV(C36F^4eqoT~x^Ft;t%$fc9|r$zoI&n3#Y{_-dr*NyF&=UFhZ# zd@)hgp!jE8fo%NclT#$jU_a0vv;1ZlA!4)~b^&2BksW>0uY>Sd&GSZb*Lf-(&(pA# zfr9e>*Y#jDATr1SSw*W0h_INVcQmgP0~Bw$D?q?hw|_+Pqa@=`*BNAn3ZZI{k2)uc z@tU36Cd2KcsLQ#|>Hb9V9j85~mC=l>{?E0aFQPYx_Fde7>eoWBjLx=x5rx&9Fzx*j z6@!jMLM?i>qQu#`xtORZ)iu)@HxIXjzsns^s0f$VaR8qsGG$7nO1aaC1AR(L7n2u4 zZoa!}3Xq%nx&i=jt*a}^Zd%NL1Pob6kxFF3)9>i_(Z@T5>Rz^XTEyp^ez|Mf6aYR4%^T{#xE ziE+<^k=A?o9j~CC2~?Py(M^%rd%8}pkIMC@G*f=7k$Ch#OYU}|UYHw%9Z^kZ4@BM0 z!yt;z`)RtTcDzp}cR%gjZpT-$qpc1Kka?W;m3kJXs8hE@T8yK8F|)mS`m)FEC*&sG zcbi?oCEQ5ukPiJMxAVJi5GLy1e0%CSKTkR|N>4uci;B>EX+XbFy=guu2SmDgfwF}M zCJ~?!<<6Qrsi2FpVVaAiY4VtsgunI&h=z|p1*v@IQLvgSdnS6uuQueFc>DGU0m4l@ z3Wvy6Wdio)l(!mLWl7k#*PH_^odqib>c0;?{!#l#Jtx^YvG9x9&>&4hcW39oySwNy zF)?amedxfTzcN}|4%9CnvgeHwtgA0L{-&#KhB6U%nD38bELe~cs_TFp>=R(~QOh!U zM|!IsdYdX<_UnGsscu*GtQ7{*zs%QrtIUnBKiP*bm;v>k$6h$*!Oq+xX!EK&SSkQ5 zz(SLcv|sp1ySuuEn?o@!1<3N$o$*?Afh6Wfh6Mc&7?^ml=VDCJGYE}B6()OfFl3iX z!yJ4O0S?-K&065k@`J{HwVvS@Q@NEeaGvGccBhPl@8TOjq3zS8@5PJn0U8rk>))$% zkYS3T5Z1iCU`jW?i!!JYf8REK#5`ZGRB{jr)ZSlp>X@K;5xA5I@bGA0f+0(W8@Q?{ zG;7^zjT>zIvhqS_`fJyhQ1r`%jOe{CwIIZ9+SX3mdr+`3=A+)JaYDRJR^CklZJSD$q6iiw{ZF@==|>6)YOuc9mE ziGS}P!#f-pS;0#5SF!-I_DP4&2&u1MbG*r^5PYR7mi~f!*_c=b4j7p9A1}WeDY3c{ zl~*{W_5XY-m}V{*WC$XCXV)$VsPk7kYpBuSCpf1t{!=6SAz4N63XX)qdnIR}tQKh{ zMGn{7>WY8)H8q00G#adnul*-Src96kO{k42h+$)k$xz<2 zd3yQfC!E%Fl%c@f6xqo`Ty*)KSK*s&5}XhO!3Ug1mpTOqYJNTIAJ*t7W#Lq!lLW7H zx$>zy%cu$A+8yeb{trPif-(3Mk>AAScd<7*OQ=cUL);2cGymwyU>aA;y801a6qYm( zTu6tJ@8$2JsI$?Jsb$l6g*)alRwvcVUcJpumvb)@ZZW=XeR9myl?cn{mM`;fRJ;)c z(dI{deq&zgaBcpwuPrzwy^E5bb@OHP<@d4Kh)OB$!#gNaS9)a1W66pwi)IfH$fPE% z2_;A_Kc{RiKV-Ds%pie4W~@D_f2mF(c9$wCSmfq_N;{9jiujdy#{8tB^r8&S^(BUR z=Pi@VMI^QaB2jTkijjkX2!e6~JKIeENk;_Y8mSDz-3;dZ-)dwDGDrk{a7yvZ&OPf! zOIM52ho)(xyuK{STTT*zY(d*PPW~Rnv{}UsN{_0rISnrJsyh)OZ zrm2(GFOBbAU4?%4x^oYdo1D3^+eu@l5Pa{&4KWUx#PwOn=|6F{xOym{MrL2HZC|ew zGllOf@LDWO9+m_feH7l+eSgPToBYbRe-r&0&&gwD+0?qLiyQ25tl#0LjtWINgU$)D z?QO-*1^aEP%iqS9f};xPe0P=poPRCM3yRp)J*-1k-5a)@=^U5)KunTbf!i~cLy$I; z6eNS#a?P3kw4sizISZ`a3L?F{A(UnD?}iqlCl)gCsJp{}MazUp+GC3102O+E#@6<` zt*?~s6eGwX|cXnU_1H5ChIKE(8@xWebw0_-uKq)~#=+Hs0zR#$TB;ey*upZ8kb0$xT=Q zWwGW1T$m_0s`g22wK}=5)bY@% zjo_19{`#FfQ}zOPha9_2%6m$P%f>9-mM%}`2?z%+IM*B3eazq%z__UE#AH&2^69*r zSa@eNA28_8>bdKKdGV}UK0bx|Ofk3Xyon2+sI+l;4beTzXO z`j*c~);}^$f#h9p6h*3=$G<1+C2Rcqz=*B$f&4=*g#<+OTrKOJ`QZOUi>$6&m*8@( zh>e!QnCazzBOpY=DP8?HHa;-UUB0~1|L+nf|DXN?K=1z(J`~$0F!uWn3|?yqlnuu) zB+7{2VGzGFlI6PF%CUWZX^gRhdQU>LDbYF6$sLpIlX79%n%C`c<5FUPf}tCcza^gp z-$KCGLvIK3)qq?8U<;W1KmpCN z>g4kn{IccE?#pj27;_tSzSZFyTNfO27-y|cppZ?ne*G}Z9+smKnuKZ68edXdz@<8$ zm@Uye{n1a?%~jc8=~gFk+@X>}2uo)|Nm=(-@b9C``cQVYzVcoCsp_ZL;GZ3%2(!2e zg;TSeWY>6n+Bq-;NI8AKUjDXzTM03jrSq6kKUStr(MixPZ%RtoO>D;+xPR z4lnHA7|gTL_c9XWWWtOZhF9`+VBLJ(DVACJPA)qa#yYVDQJqXsYr zR6kGo>cf5x@Za6_lKzb5V_M(Jrm{%QK?w5#CK9e@ z%6}gas{pewVPNEtWG}eGRL`4lke`ImMC>nqCEJCagE7%%8L0bDf9%Ade9ZV|o2*;o zzwaVQvP+b4QxIMM9OJ_^wtj1j%-PQ2%JutG36S0zTYqvO1t>v9An+h`O+zyKv@E_nYD5WIesOpryphuH&+2-Sqa;)@pwA6Nd8Gy+);X*f|( zlG1-~zQGnu#1WIBN}6iVeslFEajS_kmY|&7a2AHs)%htC=OdG)0DuUc`tN~wb&K;6 zxWik4`sH?USNJpr)+#Ylq!G`Ir3?=8%lOM9DtC3}XQE$oj4n|*xLghhGoLBn2h+g` zQhLscEAn1`uI0^?V!^1HI1@2qP1fZz^0JjMAs_>Mm!jWkGWVY&YzgTzk=^wPcey!$ z^VPZ>B8STZAf$B`QBz!CKMV=J7yqL@HkOY_wk1nX6W`aqe0ht+TxeQ@Et97LjXOLM977^h{qilbm?%BtfEJ)H*x&%yUb^>Vv<6$V){Z`(@KgzC>lUm>y=)DywN$%C>F!md!% z6DK2W96tm>A7z@WXhV(cDirY7FJ8M+gG0#k66D<>AO5xTn3h2j6+`9Ji>mSn~4 zoG(vC60NK#P#l4b3S%qx^7CRwlog?*$vr6gbN@SJaY&KExV|LYoN)CSUydb9V$MJa zZSt-lOr*DcdE}e#SN|ub!HJswFYbB%3bCMtsl3b)eZon8lP-|cCtd%8c-u?bTMZz@M&L46PX(#DA2Y21 zAOd01m(2U9Bb@C0TJBRc-L%3C=q!Vb=dBl`B^isP3-j}4pzopy3KpQ%MUyu~T)DnH zlov5xZSfvLVg@)EUs4A26Rl5sid~R;-Zu@0I_QJpe{N(DP{`ZeeJz_p-Ko0R4wK&G z0z$nb(WdIHL1YRB0fB-^D}Fm_B}h03y3LmWgHUnp&hHn)AN0B#8iHS_Q_?9VWLE$5 z$a_!))F1bCL}u-QsErcZ;KaMSx;*X!qp-yIr&l4j*`HrkD97f+V~z7OIus}Q)j%w3WA>4Lc6*4*bb2tewCLehl)+rrTSCj zT&)3O7s_xuzxzkt7oVxapX?)iK7&Q?KAp8Eyq>^|7jF_s{ zs-PNArK?H{Rj3%%8AnQUE?& z)hvI^o`#gE`UA7c^8S@KSfUtzYxO+NYLPJb^Cpk?)u96Xc=ZR?lEBR7(G%W`PaX}t zijRhx+QWYgWDs_lpnviiwP`xd^%Ope2eKxD$aMjm0m}Q^5dlAH9Tx5HdoEIVE-l2J zXH`!Z#3u#9z7Uh@6tc^_$o!O*hr?}9MCAp>{n+H>4^(fESD{^$*L*e)R>w2rdyHnV z6`1W5;`MOlV z{`!uN@WoHX_9aCtirmoi2z|yOia;__98g>Ps>qP~-%G9omsC>l^XJb9VJ9cbXJW7Z zVvz(#(JPq?(#903GzbFQfX_E_@)aRj%{veD8lUK$KU*5jxB(-%=z0`s!jD#5Mhe~- zH=UxXtET5|^r zJqQT(2Wwq~TfM2gctH93)rn;p(o?9wQ|Y)dzMjOwEFpRED(tw)6M4(d(eZPvLefCB zo+s&jXZfL-d|$m*e~o$*UKUo?@~I7IeX8+17tw9-2n$rg2~?65YxY5WuCITM#DXN6 zVJ3LCsHmg@o4vl(M)P+);V&<0%#3(S<)JHMx4^2q<7VY8Q1UoEdiYO{mHR( zdQyy5^&;caLkBj};o-M5YVD zwHY-^C~vcC26iZ=Qqs~&=FKe+W(gr--Jz{xV`aruFVg+8JY;HndgS!U_52niBkm{x zqfamab2@B-{MA)-35gkXaXme~-b8^LhV5sW%EJHdnxsLz7v1Bm`>qEDFl}gWWnp5C zG|^JUpwdF1tE-#8vdoxh#Ldas3?-k<^aTlF*M0eQJH}Zlv-}4W_qKOh6MwuflNXVZ zkujV;I~_edV7rNo-18%^y850bj|Gy=A3+B7BGTR6-M6u^{#Fy!%=k%V&KslQ(jFeK z>_2>%taB$>y=RFX8Z56Q3+j*9-rn9dFV8(<-D~)T3bdu~!e`MlBWRWvY-tc}$Za+`d8 zV0JrANGce=*>`Jh)4e~HgM;JkGgEW(Aeht5^wy(E3G4XQay^P((Kj_U^|_9j8AJOS z*R785kn_!brRS7hcR`*6H+kcm3VcYostI_TWBe|Z!)A08BV@sh>B8<2c~Pkx3< z@8c6aUTwe79S@o`W?Y@k&DWY(b$p&$jsJe7UHCXt67>X%=4RUhyu1WL&Szl>;;rxH` zrBq?@)ha8T+xv7KA`c!s82BLd=%m3=$j!~oXqfoU9RnciTN>PPt(~R%XIQ$?=&5MG zJ-%l>DYnR_QwkKMgL^-J{@k<}<%r07oH8B9j;Ejrp^w2PwkO8cfja+T@)+EGj<#tE zsLJ=Ki3X3BI>^N4P~zg^+Wzh(mQN7GR4aTc1+;J_AfG5po2EuCV`<4^(w`9W_AR#K z$~VN*BP`_?v~zHjfjlKWP_aZEhEZZXU@|U*EGKK?y^dbuA;hT0sT#W*&`hG7Uwq=? z{zP1BLl1#S#4>;BrY8*X_j8UV4f=M<)1It9 zE6`={=PimR^FB8xNB`SAlZDUV`0$}SI7G6l znXZrXUMQN$Pe6+*r$>t$VkUtZ^{1fQriqOp#mr$Q^UG+7UDkN` zdlus&rH_fcgVi<^;;!IP+e1&KmNjzaQ*WA@nu;F}TTR$*&oky6_n~`uU`j=$Hk-b2 zm^uhbr^L9!qdc&olXuI<=}>EhV%Yj9Q@m8sw934 z%y^valwzzMy{yJX{R_()>cR@w1g2Zc6D}64yvwUKa<*p<;pQ&d{##L z;lqcU>k#^=7mEJdOPP)=&EnY-v$F<>R=)*z13kf1AzHx>_)@zwo`!!s`~%`F4pd5n z$vP*kg^m>f1)xqxV}^w$7?jZ(@czW5Fnw(=QkFKJ!wwg!?KfAYPk6L9->53WFL4-e z(~28#2?!7ydJ+c!gO1sI2c=A zY)r-rUNj$IxYW1+XE`0_qv_YK|Ncr4EnM?zhwf35im&sB%(`af0I=?hAD<#)aagru)E*5W0bQC8pIYqeSBG*g zDGCY-Gt}>DM%rDzeVi`Afz6+*prnMgvxxZl%NMB(BH&15t?P%yN3as`zoCYp0a_lY%xC(8l$ms z-dmjSPYK14%>hu!T+f-5Gj|szzHp57&VO!K2nh%nbnII(s8AnskuUpWk_GFEo=}=K zxhdcqLl+3Czkn)QtrKhF+wVxt%C(wUhty~&& zP-X}2zQ07kt@rapphB(DWKAY#QdpUkm>4YJus8!okx3w2Fn{~#0^Gqi#;J&7SHA^9 zjJ?j&gIUs<0KR;jb(k8iAruuA`3SZlY%Z(Tbcb)Th0K>Wbjq4qh0vE1bAtd|GW+_B z_nYH`EEwP!+Yq(*jUk`HMSOHrriV;JL&LcrXD2|Oc6rmuFBUWk1%=I^Wam`@6#+3zDC0K8QOiCC|kZ_5pXYXnxW#?s(Qs|1>CPK00M%f)ni7@6s+bnGQ?nB$7LAJLjoto%tce&+Y??jwW0CHim~%y1cg z=;$)~HI%}QK~F6ZC!B`xl?b+={C zJx-&;?{YHYB;8|v>d`Dsn~>Q}d#m6lv}dX`Y72-T1G}v4{E|uxDb4erpGfHyhDJtY zU{}sSd;y_FC^;`0D6&X>_CdVE+LsZ&ig)KuFaUPLuOFUqtq%_m#|yZFy7e;6s41*7 zA1<7_r>|+CJ2}S8RX%h@4pT}xcm%h)q-5a8rR`?g{g71A-Ihc(X2iWhObm>HOeqH- zy(R)5*5MZtH&7ye<4M8eXS>LK5fq{ZOC>Y>&L=gq^bh{6xM)PW^dLvEgl{=2dPcZS z5V9o;JIT$Q-8nqWh)hfSwj~K}A=wMu-0g}2t{{oRA0I6U2kT1yOgD98cSWh$V?Z=l zVKt;Va~c{JHrU{LkH_XGMwTb}8wivNY00JXcaBaD7ttzSjNt-pbF{h5SQ%m>uN70& znmhMi&@M@g$k}9b^RY3E!(d!p7h8E^Z`pJ48Pn*hFHtevreD*|cW$G^-&5Z$ zp90S>A|kT6wS_aKM;-ZVbA|>m7}^6Vx!2hLOzHv>gcyR)w`Qd>Q76yWCy;|AGra@x z<7(xvA<)w2F-%PZUB<8F<$_HQhu>c%Y)fXd+MDjiFsrvu3OL+!(!T)n`m?m3UY}~- z?Fa$~m_H~wS6pdvGitG`b$t8|^V!J_0Dc`HU$2H6CA>X*6q?3?6M#kT1ye{B3VM1J zs(JFwfYRQ|(w3B!waj-#-K2TuRJtoINJF!AOevLlV(OP(Ja07UEFp12JPEEa1)N8Q zLtK&BK)T59-b73+te3U>AUxI5Z`dBJXeRsbF=eB{)-vaWEX9XsmAGK4u|GVLmHk}Y z#5yGQq#Ngv*dkq!YL)!6W)ziIqqo^U>~c0CUPN*$G0e}6@3P!4(VvrE`&llN(;?*e zm*Y3PhSyV8tywSQ$orZ-413Ji` zm|GfbuN?XM`aa)F@*EYc!PBrxK(6l$@9@bEmFg3wsN&j#176gQ+s;h>Ti3uqW5D-j?pr+(;~e7W5K4YU5paWD-f z+QO4_bqOq*hH>Q7`>wGaDvazfvBlBNyECtz{mSC$NBoreKP_KEh>m;sD@h#&XYXoM zxIC^vporXn1Zg0^ z>I~OvYae$1`N&4rzV$=aO~ zR)Y|G;~uo()#c?3gD=4v<*x}|pKjiVJY*1TydHPAOH8tM;Wwohdg5B=A4biO4-X6= z!1lIvbd+3>i&4&&jby3DymhPnZxCKg_$u`9x@^yvemm}HYiIhT^!RZZ<+YE!D58(k zzJ%Ov85vO@I9u7Xz#!$($Xd`P7xln6*Kf5I-lSl8R)GRLlxy|l$B&#FaivRJ4JB;l zh4XuR59Q=qvL8m3x=%b!$gT&}4b1h|XlTX`BG}@7%EtXr#qobeYaXML?&YGh7>z$u zTFFYzIaTlUd%oW355uz={`VxbZbrBI*wFIJ9{QP5gIunU00*x=WMew~p=HrbC9aoJ^5I6`PYa>*;mOHQah_7$Zx(-Ka= z+&k!~C{UG5qZ4rZ%aJRe6i%;{+F5~&m?Eh>@bK@^k-^G**XHgA>d}$G!D|-k#q9^8 zyAL+U%I#B8|5=tu{tH9dIYT4E(dNmJnVHE$7Tf}pKKd3G%tI!uk7d+#qv(|UD=VF1 zS5s0_N@x2;qc_gAzIFCvsnRLkmNz*#+%XL$5xuqeHEl%MXchum-#)FXbfrH(xz_#t z{g{xZ5+9=%K7C&_ z)Mbj`a(Yym-q+qvH=&Y}ts8s$HtbDah;?qRLj5A*S-GhNCDY->eb9W7RS_UlwKqhN zp)g{498Ol_z8Jn#r?)jDa=CP7<|Ar9@4A z_s%CxI{XR4VX`%Rmx$9o+H7hW(sgEopK4p&FCl);9184&I>$pUHoZockt$Twi&WTW z7)08f@50k=w3q4|T=+=H-exgBoUePs_57eoINTrM`IlhPOB@0Hf}Eq%dN*(wf3H+p z#(p9B%Nu&^)`Gy=2_iWNrk-0Phg)T=%$)%|hZ|9lYw!q~WQ*h4bNE=xju|Ge#$ zb!u#<{2DSMg3H#4-*Cqb1d#H66A=-S?%tPJIofpY_00~v12W_+nwL~)5LZ1&2Pgt= zQ9P})`DewBsyHvK801?y&A0It0x}57ONh{$g(8hkMt4<=wO zEIZRlPC>N74Y~#5aYs+c;aK+tWHFNOyZ+l4L%L`|9Id8ksK| zL4G%W37CuBkK_kHkF=D9epU5J*SnmXR_tYmD&k4ATib<9nrCy9h(D&{ApK8Z#r~`; zyE|O`-#(eX4OWYxpH%cLBE7G(6Q#lR;F}oFG&z`cKxGs_QcC#Yc(2-cw9cv?Df6*z z#)DbFnPjMiRwFPSanr%1-zOu(vhu^DICjIofjIwSpz6}n=H#*RZ7#`5C=fKJ_d%%x zb7iF8X?kPB+SV2u{QT0EVM<^}ZT#N|Cw9HYZm2_m5BG%^19o5h$4u?*3RJudzAD|4}tY*x3b@~A6~N0yGpgEc{-T1ajbw?^5S_w6<)gSyXez8{_uVxsraC%= zM%?e2PfAwA?&my;bEGDJ^ytx`a}-M|lJe81d+nDA>geX1JU9rC(9y-UjGkm8QFl#) z9mBzQd_180!AvETl=Hz29CxAE(|zW`r+fGndQBc=Z%$8nu~jzI3bdaM+$O_&14G7) zlW|o#X^Ffq(v{MF`s{<9oSF6P>UyY}iz4j`a6x}N`ym622I%@0+@_+Ua@mpQZ#HVE zb8?t^Nz>%-Qw1rao2e+@f?Ny?3?wJW$jBVX9tpa-x?W`W$Fs7s)SRytd=+4eX<>Mj z8iBOwUtWB8yuo_7rw*g<=;O#(cLG7m&73mx#AYo%Z7>6pUdQi8iU+ID5ol>?%_s{e zVci6C8F!DDoYC(6E)y?t9RG52@! zEWs2ZPsM?!pIq!J%m%fWMW&{vB^F4g!M z!1NfhH~$b`BdfgF(7j^wsP@bV646)NPi_p(dqTkV`FwvJuOcZa$?!{>XF8N~?gTQO zgWevi2l;)?0df+O5CBKNUhzd0o0q5gV+MH3E+?l)<>9Z$kQDdV=y~9ra?(9Nb8E&j zM8D0}vM%)U=7jUccN~Q~_nvBnt~metB|f+hMM_8}Zf3OJeCUqwcacKh>a|taVtW|L z-`(Y?^ahWH*8tfc3&w_ySDCY#Maj~l+`9Gj;rYLfw7U+GdE+Y`LG;xeI$B!F%{Ej_ z$sMcs`=)GQpxDhWf@HFZs^H<7yI<4_9wUYjvie3wM#>)p7~JZqu|pAYy1wwLT*=vhBP8Box9jnXV4JiPq~lf;QB)nV}~`Zzc|4!f3{ zesi54v_{xA_iqnZHA1oh%6TcPXaAP_(nQ-$o(1&2L_RepbAi|2WnErB#i^J^LB&a7 ziFiW8!-L-xO2RIicunt}Prxm5G1yc**w4=NArA_JaV_KHnk5?})3N%iRqL0P9VQQ#(F0d-V0GH)pK31r8)()lak9~XEZV1K=uyWZI(bk^xMBI zH;H?bgw%^vVgYi+bG^cCKiv*lI)d^1_xy6*Yo5pZ`iFm-LW&&h?3#Zokdy-7BAD&0 zC+GXO_G?j<@-E6UeT6Z9H|qaf!U?EMEtm^8Ha3E5z9la&KLDBQWKojPhWeLTFN<~U zBL-L@Re7e-ND2imCfR}OpUX}AIbQx0u08s8aWgu9HRr2BIl;ZPU7^NqPP*z?5gt2* zs0V(<0feu-k}DXiKE^$9b6ayAKF(mYEVY|%0YL97#j>%nS(|D=zewLWf#X4m7u8#w z6>vV`SGMEu*8 z4BYn-TJ(7Y+j_P6Urknb=8IiZ2uSCI8gl#EGwz%oaLFS@dL5NeVOfW=>FYhTnY0#t zb8}QeQ^F_3x@541yg{7X%oFTc{z!U8i=A-IOG1EcTvh-rzl^fHn|vk3Qq_-S&(a7o=~bls-&B0a3_JVA%>#jkaD^E#Z`;#K{Yef0vJ^@&j;{%Fc!|Pfuo4>A!cwlrKV^KUe zGD5ki>#7yv7plJpwTSn|2_M2EB08`dUWd>vv;khY))*Rm{}r_|2elCF5|KtH95TG9 zIXf=T+qqEk6uiUtB3oksO?mG$Nd;0&rRH-;;tA1?glxKPuz#@~x3hQeKt8Z#q=OLJ zKQ5rdbEu`({fRGadfqo)DM+jognQR^en5P5BIJDFHZgG!jZ8Q-Sez5rql)KGDr;*6 zpwKNoRp&HVr^d`LAYd}41Vubsh_h;E|6!rWmC^G?@B|5F4IIvrl#_za2_&;6AU=K5 zTb7YA6X&Z|`2y{L05Y9`U>~cQY4*TwuGsZricd&jtT@f?QpF}A35cZec;L&I)?C+*sg9!3mvcAd+apc=jIU3k_G;~7NSoY_v z_G^FbAT7w>lc)A#INuw*C;|fH;@>7FGHH%emqSAaW3t(c@S1v z$y?{N8f-mPHw!KcGR+UPwMn7xN8iK*>CvMe7EzlasgAbikO-tp`)B(YMl^ihIBG&` zg&JS!GeBR`;pAaZ^o-e+*-j$F_OibJ`WNJRUffsI)=oA{xc)e8J{mt+#9g|=#L5~f zC9@skZ%Xb0336SgOvHv63)ceyFk;SYlLg9ps=10%Wt}MA`mO%Wt*tuCM7)g8&#s@q zRIEU_{5>wNcg$n;uKncD7LvQObrS;61M>S@Yh&e>)!ZB$Vi^zoeyy#ALZZ5Lc$lwa zey2yhc%WX1f>hx3lbM>!ED09`ZjR%na~-7y3rs*83AN0Q2#PHCfbh|3o2FoD8Yx7? z6knUE*BUiuoEL8STO-uRN-Penc`U!9G@JGpR@ijwg7EqH%e6q@aHr(wCj#wcrsV@k zW$Z*Ai`<<*&j4`9Cvu1n093pPEg2`L577xrtmH*W~e1qZ5Ha@a9HeXg#z*0 z=;&-^3h1!q$HDh4nySk(%=;=ZtTv2TZrbPj=FOXQcLFQ9#N~MS%L=arB5znZ9$d3d{ma&3J3|(Y8iwgFcmxD~GooQ)4M>s#Eas_<~B=;)Brs6}RAW*J3M94gNaNWSr0OyDcAB$Y1?PF54?O`{8A6{~Fb#Gta%-lMrl9E#N{wBmv z7p*?}`ubGvRx~2+EkmaL*tqt1$5^Dw41+ROt@&lVi;Q)8den=sf3+IfXUV>s=sIb>Z&8=rd>|sYdUeB!ID0UHHvm<=%b5S- z-!Cp8`v1HN5Fy?BKdF(q_y526|8LI!o0a32k$Z!Z`kl<)9bT2b z_ek1J%-7Hz(1{2byujybe{#eD0jO_|E|Q1eeo?hPw=}qpfZ}?3N2tnX&{i^daPRMB zsJVRu0(05-wRN$d2lQ!_XY1c(uBL-PKN^zLu*URb%f2$<{K%GeyzMd$-WPz zSLM>j1kmg@+rDQZtEf2aD4UG{Ji!`T69})xpcmlVV^v`9$ImX39ue{EgN6cR9)*H8EXk;-t55i%LpLe7(J|d9nX_ zvl&6L`FG1OS(rHRy*gXZ57YABtjeEUQ2h+MSg5GTNrunwj#RDiV_BtlkK92(!)NdU zpOYyarfJK%MFs`w>{aMY-C8kb02aew8kt*6DJ)+@4CA#l(jP{dZUa zE~{!Ae~xP(k))-ii4J!(64u?8KD`1(2nfrF>{GO^+y4DCrbL zZg^!y;jP@;Y;C@A%tNGh1|Sl}#zxQO_(QG3$Nzc(hNTX-3G`ugltZIjCEDG)rzeS@ zi|z2DnHG>>@eEq+?(M0xeI*B%qw?OFOxSG`0s4KqI5QTXRSF8vq>F7EldP`*uvvx>*Cfs6Z%SEWN{F(3gEj2KZp%^lYhq^safndqY`e$a0+)+ky zrP-MD?~pTy1|T`S>n5c69m;;?i)?S%^y*y5ukDyva8QHV$yc@|(dQg5Mz+2bhYGy>_@D%=LKBB1Hwr5ID^?If(9b zAJBh<9Oe-g5r&W}vZY4#Q;YDy>S?hGGsg32B6#X%Q@Qsi@5>pk%%jRbz{81D1ci0awS%xOK#2r)5%S3+&= z^Ii3^vIP#iZbx}iQKYS{t(9Am+XZVt4(@&ze%jZR_AbSmEh%ehVz$6Z0l%$RM(V1>_IGwL*scTc*$&Q8x>Zt1oQyohxd(-BT0qa zj$)(F%Qo8;-u4mHTXo#n$l00`^Gs;71*lh~-RKL2HA>+Vnhzf>l?$UuUVJa2*^$&) z9bU)YKjJ+T@OU!UVfOP=4iql{sO0%5{%St04-5_UEe%4Ii*bbPG<&!D2imD3$K^62 zJ~!G}7TveCT7V5cLQmj=D>M(8O%&bujXZD7W4`*-N(~>Us}=ZPj{ZQxW%jT2Zq z2t&_a2D^m5rDd{l!ke|pT6gs3=De9zEv$zRAM$&$5kdP!TU19x*<>EjkS-lcP~fv@ zV1JI2w5uk+U%K5tEmb}J$*!TrZtQl|mo?zV>;W*YQNFDdmMWvGyl9bP{p-0WKEvi7 zviHkBKdGN@uzYga(l)6#?C=7`OoK_^F0QWA)aiqkFX)Tq3g6!!6PcKpERBE6lb;an zh%i{_7QKllFXFk6@9o_&kZq2>OTmE+5gY=7Oqo;VCOA3?oj`L>=?A(GMV%z`mbx<>-w;> zzweio74K_z^@-YadHPuK$ej#L=rlfuWiEZCU4M@MhY(JT0U{K)FXzF6|dv6K{5TBOX+U= zmkz`6?+<<2Z0jHg4(%(~Y^Hr5PW1M%4m3*8hf%clo>&N^LHDV_m$V+luEo%Bvir38 z?CXmo{5|X7uPXp%M%#e$64gRe2Pq~d<^{Qb&hZ6V%5I38w&jNky~kLps$;K{x){6e z1pCUKo}IZOZ%o$S)#2mfdeEoo#6yJR&b%?*6af5&Jr%Exzxx#w1o=~Eo~(UcPjbP# z?VqPaVYnD>1zoco(h;QoAGP>q7kUP?4=9L8F{>I27<((R;N*Csju(-joi3w zOhN>90TH+JC;96R2OCXW{i0)Wh6oj_!qGV!Bjd#xYfCHl>z#jVD{i02_iR|MzmSwsT4?xU`7kNP~R8&;1D6HY4xu}KS zZ)2t9o*Y`oV3lYR^;Wfn954+V+aAvaV@}2S3wKW_d+#fSnM2}oZ?A*>yV2P^g9B}@y4;N zWPaXg?R?t$FYn_Gm3!a}qnY(^a^z~8ySh+wb4@rnc*GvK3AeP0&NiPOUo3VJ&$AE8 zO?-Z6&0>Fg{yf}5wF`_;dRtUp$?Bt7*)a3uJL=Qh!+(>R04C6G{Hzb_A!P4#XMy%N z4K4Rm9}*J6fVMVYxRgTMnU;apxIv1bu7`nro1OO%mX=quN))J;%U%iwNv@A4z6bJj@L!*C^{R zmo-8k)9Y52uf*7*HcpKq3C1s*1Oy4B_EvcHO-+&SyWe*^*}N9VuG4GR76pLnQ=yv7 zGMBNwvGK(OOq+BE<%uePkzTzIG8TT4RJFoP?ZfSo ziZXxjg0pk8*kojWt}p-0uKeg>s-0fYH&jJII@0r;Qb&2PO(c`JDZLoP@9|pOUJ=^CMbAckWRDcxFWrjlcl#& zq>5u0X=gD5URrxj||^S{G=BpOwg=0!)* z0m6%shrEbhn@TemRjySc;wE+kF{3B6Q1@G^T6z8Pz02z^`B_))dH>1jmk7U3YRhex zXQ_3Hw8!x773uZt7$S(>F)DU-bNhOpCLb3c9iKq~-fA6YZ5Aw`)xRZW;+{%|fiZ&E z8zhg>QumNaz2Lsy-e2olN_B2qEdn`orcAn%1mL;7)hky7!dt@s?xI3gr+M1*PiGa9 zw)CUevs)qO@2Xs#|G)qe$v@n(yAps#z${14)O8^p`FHb-jL%vlz+utHL0H-kEr!Fq z+i@9W7f4E7M-*#kwMt*4@c3Jd6dCOI7I3YG5Wf79`K8IY*7M`Ilk)qj658g8d-|Ic z+ga)CPP(h1-7&?18~0zgv}Vc2MyNw4`pj}v$A!P}45x@Wi&O{H=vkx@Wjvj#)=*;K z_j=F?v~F59Gu{}De?L4jqH}H<8^v$=+33OZoH{n)y1LBlesMb zUdGAbu0x_-YH#|spD=k&DNpqEwqOHhOou-ftv>&+zkl*(ZTVP7f zObhEvtd?xcQyOiwLce|^g3+B+2RE@Gw;(1gY{_~2@6SKqa*z|N%@}ol)*6yHTTWBg zeI!y<#XG4rz(hN_=REnQR0?;g!zvwGuVJ$y&8O-`n_JR!{o2M z7gKR?FrT|6RkxKmem{+2QX2%Fie*=7$UZ*;`^$Hj9CsiN@dXF_a~$FKuZ@q#%vAHS zkuZsa*>vieok(@?$Y_M@zX`XRjjfrrx}JY8z~k!C)%`Iad|&6|xX8D8ZUpT{H>#wM z1X(Mt$KRyJM!TaUi`$E3mcMcJY}gMYv8gwH>fK%lAzT<&8gV<&VO(w!eMAcx$Xa^V zZuNX$3gp8_qFODY{)Ru-i0#Ap)Dd5Om7tD%-j^t9EZ0?OJ#nq7N~&yq;#)Tw$oxfL zz;=VZLeaO;@$r4SD=Hu2%X_y^U4!oi{F!P9o6n|Qwr@9b(S$F^Aj&<21-yaixm7GU-^4SJY~Azab$a>Wm&oL9Go3gv?0Ly3kYR zS#g)1er`R9Lm0qeMg}`J8NuDrj;U4{ds9^Ys{!&6;(tVL7?G1fVM`JwSRjRf81Zan zbu|k_V7TxWmdZZW48K9bl1i!~Gs4w?^dsbMS;<9Qya3LillLn^dG7mR9~OL_(`1bw zzlt?^fiFVx426%IyY)M9`HbeITJHT5Lw;-j$fmN%g|Q^ zZijMQJvJ>r=W8Mg3K${pOXKnf@Z8+bhWZ+}WoiHvZ)*O!BNkiGXfdN#-mW$(R(>~Sg% z$vE~Q{eHXM?zeqqXM79P(C`P+5nG?$GMkZtpxuuf)&emd92%MAkdC1pY_Y1l6iag;|IFoFGJd_xz zNv|AgY&`kv7|K=|eF{=Yl70W~U8TI%NGa+%1~Y*;l?_TsK`Bn6-Q`P{^mydJ=A>?M z@fwbcNh%ORB+8$HY;0_51E8L>>A#3QMrbZ|Z63v_8IXg=6Lfre8IhwH+TY-Qbc5ft zDWn;Txx~_S57-Bw*jYI$r8durhEHD^>?5vbd9=3A)6&9ELqKxe^_w@tYJL=M9}Xg8 zsem2udg|K)fSgSM3a%guZ~i+sSfR*$?}e!Osz-0sG9n{Kt*~y$8n}(ijA|Y>1upH~ zy+>D^$@9EMYZ}=E1kCG^hGI{0O&}>l>LW-nzho~fE!~{uOgR5{zdT0bW#zV@qVN)- zxn6kL(c*Pj`J}fhP<5I@0QUUH&f6~Koh<_cl|p2f5aPx~ezTSk5Gf}c8suc%n)=Y@ zW{L_kDz4l3J$eY;a^*giJn-CmLCb%>-(7xHCsO}a0g=%l??h7fXL?~^2&{{54rE)=*|~R2 zOwh}N&6@_wZ_xd~(CEd>jfRiHxnF%8QE}*HN3$7b)-68CMz)jy06j)`8 zMLo!P8yianHgg`+Ydw1p(izv9>bItv&NZLEdI|#S+(5yTd!77_-uB)Nbsb<=cXMJy zYHEB!T3g?G9v!3`zi=+?X~G^qw9)$6tpKO?OL+eLmV|S)=)+Wy0B4@a-#e^b9G=l- z?qHCulh6B=SUIHuT%&V~`lfpsyL)?&Hl^f-7C|HX@} zStcf?Q-MdluCA`1iw!dAx(xb|ip}>~)yPreOhs@3n8`jSI464F_r|YW+o>nI4_yU^i zSpxBgPI27fm1(~_R#$%@GOejQ?UKiARnn1vhK4Rp2OQrv)lgT5m(W0GGojJp&ZHe{ z9&s0w7+?@bB*^?aNE;g3X{pE&CKDWR!ye<-*?*jscA0tik*K|ZF=Oyrm-xi5qO4@G zljr73!jxM~jwjtJJM?$}B1R$3)38XuHb@n0hCI(_Up>*z7E1@?vm7chZ_)`!s?-=( z*_)ij!hA1&t1mG;<-Bp+Q79Z_MuEoVlD-zKnCa$-7d2<{E;_^jtH9AQXW*<} zQ$a&%X|H<&lLzx_Kwk^px4$`{RB@!5lF^c$FCi7rTMNGR(t=$wFJ*^ut);%wv^5e( zx|4M(ODBJWdSH=H@4AzKah(i+`b=F6Hq&o?l~8Hxam7@>YmyFx#Osk)#pl3i=PoG_9XnW8o~qRr zcIm|9kR~Hw+7+QtI-Plsv>o&zp9+;&Qcfz?*TRz99F3DG!gch z-ae;eqMJd^QdCA*rUbe=bgs8FkDT*L1iErsRIoq-f;oL_8+ks0xGF>iFg_>n#i z3Jm&7b=|)>6kC_2ePC@B7?uh7CG)x|uuFp0ywRBgO`T(P7jRgTlz^g<5d)|XE&NNZ z3{oFxOw=eSR79P|PNPTzjB3FI=7@xQihV}4`Zs)R8Xv^OKjeNj1B=$sSQ%+d?G>L6 z2o#7nLB3kO3ieQi{`RfT(&mds(3i*O;~I8f#%>mbD<8_44Xs`eko zWVHV63a>o`x@#npENuiGi7P%Zczgaq!L#I~QdJS)1=_hmJ+RjY(4`=j!Xxbt(@mxc zlXZ@x%D63wmoFs=Tiy5S^=pAoK?aJewW)3NJD`rRPDtP-v1%rBpO0UrJUCX0btng$ zu#s0wevjMs_IS0QV!|YpFGDt{WMKHz`Sa(C%*sD_9<}3r+_{6Uv5a%qn3UE9LI?O5 za(S;X$cXlkK!WYNe$%FG`%(L$ZUhKqxVe%@f;M}azIgFv9AZ>>q?~Xsc6KX$av^*j z{C#E5Y*1;&ms;*Iwu?6_ik}`{%@`jmcWun zL`VNT+?EG!wsK*Qu<<{Ca?~fU{XIDN5^Np@Z0*TTbb8RDX4PIsS)Mn|JAaaMVD76UFLIDTs{t99;R4 zXK(q9Aook=X_JNc$1{Ee8E+YoBmW_#);`yIy)H@4D*9=>_HQ2D0w#Yf^X*}8_P-4# zmDxEXgcMSM@Dp5-)NMRR)GZLtN$!|_OcV9DFCqZ1{9%U+L@_`h>~2%K0U)#3v`RA= z@LtsaWosXn)aQ-ZTHe@T7inDR`*f^t?){bI+RzvjRKj*|L+p9^ucP9qUeIP?36U8A zYykB9`&~)z4Z&;7;RRiHHs!*{{fcmDu$WK_`!#Jd#R z96&(H&kqwd1r=`(3;dVv-dL0?jT4Eo7Z()#HEb28s-_MH`SaJ)+c}e#XlY%sJa32c zdtNm&gH@{|ui9Pw!RAAqp+uE=;1wIFFy;OsUOriyNR$>9K26^AY7POBSvbEub*8=2 zTxT>n>({YL6^m%exo>cJgx|E{!ivW*WyGERUSXxd~KX4A$(Uh5qz zfKlasEU=3Qu5DTXNz^%irw1U8?4!3a^uJ9Z-{ZUHscEbiS8KS1dsv6lcU)O?H$N`GN?$>9*-bIyMa)iRRq-JYghp7UtwoqYphwKr2mh65@ za-3DSp#M{{?HYQqi?|12A9f(5594xO^hI2jXlWd=ywN0oxR<^e<>7^WLjHSaK zfH=S_IeFe!yxDOTCLe?uuq3|5{n;5)JL6>G#dCOwdE74jV&M*>)1PlD1f03U>#nXY ztL^_F`3@~GD3;brIp+Iu$OO=dD3AA%_V>)|&RTUvb`-@b0&7Y?d2@Z#<$^qHDp5{n z(QjkAMr|on6;Wb#>w$k+uf-L>fKRXwhVzDS=YJFKrfxU0LXx{ncIR&;(|C9*e?NwU z9GD`{ogt8tH`VBI8KAt!`&kZxjXxtpUkDg*SD3|b0Q!3hS5Z>>jFh~{7NpA#a#M~x zeiUI*iQbj=qjR&fJV6VshE<`+~on4hFTix4R@kib}0XKGxQxD~1U*I!Y7QcnoE9WncxJwmV{ zQYwpMtsw#}j20Hg^!OeX=k_;bhZIF#s^++jzjo@z?TegmZogDDj2l?Rlt?Y(b5*_c z1yp@jbf-<(^&|*P|0)$np=0D(%n1kqxQZO^1cW=3e@uk5_=0(t< zgwZy5t%io~46Fajo5Q{dSR{b87i4D-h7udMe+OZs>R|-ae4F=;Cj8MdYqdg7cssYT zM4048&G0D;-LnHD>6b~zU6RLP92|)~k3rRE+FpY0d>4rTveYH#-o>lc&y>43M8Hfu z=Q?NXwF)$*#iQlt^2p!MEB8uxuX-E_8bOsA278Cxp)4Aasu0#X8cKu-7aET&GRJOx_}Tvdaslcc=F_*N%Jsx8X5LU7 z&?{`UVtbQ>t)JR8wgm6>=$Cs0{2*WxPOq#E`-I=G|HC`hGC-)Y7|QFeB3v`2)7U)< zwBy30`^>PY#wqb9M%*_tw#p2$f&V;*)o<}RV!n0xHv>nsjkHE43+vGex7sNOrH*q@ zNqOg{ZCo#sfF=hF|tO3`}omH zxqEd}?xo}IrRDRV6q{4+ragzRR@wB;{+CW{SzWP02cSsWOhLVFLFaSqQaYQw9MH-7 zhz@GaV_A@n=Sz^lC62Z^(~Hzu`fWy>;S*EH&vCiDPh70S%pbJ|hD39r*P@TR0| zcXkqmGcxfU%$%=i#)R?l!$kXWJ9H8O=NGh|#Bs6&Yz!VAA%Yn)k2^v|u4ZzSc=RI6 zjp;7ac~cbNH$+Mi=YuF%ho-gaw0N%A<<8lsPx{RG1+1a~PaL42W^g2S5)^&~0G!b> zy_C75<;;jK)~z-NOU#tP^A=~U>_JhH5EN_bbLF)R#|uy#9EckxJ>O2A?PRRn5?SbZ zl&ux!;4hk!CR@K%eU~wQ-#cwL)%^L$g_spym@t`p2L@-%w2l2D#)v%|j?WO6y&RC< z=1Jw9QtVB?*@6ypSu0cf(x`sI!o=<(a%AAV9WGlen}Q~DUVA$k$? z10(sD1&(z$>Y)b3QEuhsZpRn7l@%5FJEJ!*(O-W5==eyJB*D2Zwa7Zd-~#Px=4An+ zjX1(i(NM}AD%|s5$@V?o;^VbR3|uppr=wuqSz~(vmF;#n=a&61N9ewla&KgowslBf z!}*-n)*vN>KXVyCsujmH;roZm5#;HbgwAli{qYd_acg^zliBb>)4FrB!8nWC7SNjAmI~z< zr8gv7_r~MyM4%~9q{@3;k&^I=Ii#6L0J zCu+0D9*1)8QCDmt+B?~%aBk0@xjg^1>=xX~svFU^JgTs-iHnqD-g_ ze)!`HMQNvZ3+XK@|L6hA;^(`IZk_b3Oxlag83E2-cbS~+?Zcf4oTXP7Fw{N2OKR)u zyLJ)s2K!zuOGTKbS-7Q8KcR2ptv?Bs;iJLiedu7hvryrNsa|&$vR=PiWxrqYu$2;` z*R#?bO7r2@okUNBaFV2(&T7K2s5%+}Wl5PpbTQ$V!litr9{7xEcgsojR9fBoRU_o*yOW<&*y?I);s4?J9Ar>I$n?R9K@jQ( z*iTW79@wa`iWhawTU9EnejLSnKbL$7>!_PuOaUf#enG~@fy>6`j0qDhaLdJXuBgV& z;EV}lu{!iS>KUE2hu5|J*cQLPy%w$b`}f$D`m0gx65{|65btM$DtI=*#ig-9Y(3Ir z{oy{g{`&Rnuxan<@^3AcaI5V-kuM^75_d8YU9HxrT)-qWQ7We_@~9Ma>&cW~wexYN zCXLmw0dyk_e*I)j$X3J03I0V>h6+j?KBu_TwwJKq#$TCCPeoI&F6_$3QttS?e$x5C zs&Oal9(xW4YHtX_-h9{(^Tg~A}oKwtoi$P&kuQsuYdxC{2rFO_g#w4v?6+6RKX7`BFw-BxT!dv zR`tgQNTNa*HYlI)iBt9XuuDFYtU4xaJGSnB1^~KrH}JYZtTb(UyX_Ra@ZGO8tYU9F z+9#Dsx@hn-R`jm9$ryFpeKesw!Fii*|B4+N|q; zUVCp@WvFfbwYYK7x)t?AN^X%>PU}U4=Th&3cG0+4yGf_|QbWuG4k>m^?HCU?>@;>| zKP_sNK5Rb_Ml3U`JY(GQ<69Z^hj5Lj<4{!MEzxLq%Bi)pW<0^;Ai zSperVtMXXgPIYN>`-L>^+ceqzdAZ8b4!hNS)hiR5JZh?pep6i#xyWKTF56Ep(1%Ie z9eTDBR`H?lZF=kjooCZF_JQ-%BnGSBr`s+QU4!B8KiW?^Z2hMHrYTojooVY`I_4cX zOJEJZZ+0nhSTxFinwlETfZKs;?eg1uQa!?8 zqeac`sGHm1TEnTyno@%bIIJo2Pz(UI3m1C;~H);*d|EAR0eQnVN=RfJ#GFB4-4ndFS;h48*1RVUU4Dd#5f3 zbL@wtW*6-HP_V#4OEAy=w4eh7-x@8e-^jY<*v5}@RWE!O=I+qYsd$6(pzmmVC#NVv z59U7}+6Xr_RuMvt84%O5beq;uWrdn3y8!|ddk%7WfF`DVWjPrlcuZc2Ksi>jGO!Ap zbZ)i&HG^+t=~MO|54M1Y01zzx0w);ZQadDzz5!B31$thtNOmCdi{y>a)Ra`BywryNIzd!7U@WCC#-q&05Iqu=VAlAi3B zD4LnNrMlRvs7(1SI|a#MqbHkL5sU6_YsM&{EUz?NosXUqAyphFwfvA!yd(tM{(#9u0+)Rlfij5>j{zN~s{)o$@e}Xo?450o5dW1I zIx^$8RDqs}HrIgiksow`=l2`jZh3RKf0skj6jWn&>Jl?BQ?a zB%nQCq zv;QDQa;J!F;z~3{Bbog4n7qfS@)rTI8JPOPdv1BvcNvt0p-2_(HZ#pLK}OGl?p|1r z0H%xHZW77^VOr&{k4-Mre0G?ri0s80Qtdk4WmdWHGV2f-qNx-(hgjYWl=t?klrXdmH%{x@& zgF#9_5H7^b;C(mNi!xm&@s{}xG9Svn+aq(>*q=_L|b68`m&ALz(txc9kdGQ(* zk{HICVU5bLnBa|g8qhrxhDiz6afXPs$JC_=9VdRJXRu=sdgRbHR&%tw6)n-WofNi` z^1z*}K*MCW(i)c5_&72Vi5d0iy;Zk`*vbfrmhBa);e~vG-DMQDO3O`mF;HOJC5P)C z_lS{2S3+BPGY;`+pxOujd?z^@;^)>ur2T1=u^7Mtr~T-r!=pAnuLd?l!m6&I7B? zZyjU01syX1i11a}pOJ-`eodB3FEq)Xjnc}t>b+2B;1Yly4X9Wpn)*b^6Sn^|+1@(-H5IEz#bTY5iUAh;1}lk(Fo|xEetk zTi#utlgZMljX47T23nUuUF6n#KMEE-@n|tOypy7?bE&}SO#ivdTYQ8KlvNC-*_`&? zN;A=8bsdYM!*A9@E0MBaU4Il^uD&MoSKn>tZec<~Jm<$AfmTlMNiS@eDFxQdVXSPm zhJIg_I}`K)eip_NEh&6WdLzu&w>z$3y<*a8j)3i&zZ3D4?i^^UXL+#E=r-bDPDjD) z=_;DgcPn_Um>b>V0hKMAq#E?m>otH9BrHs2B7WP25MbVzMAxmgz>e@r|!#67`2n^leH?)u2xawl4D zsUbW<0XyYk0HpM0dtI~x(O9+E+@~)Uq zvf#@{KsBfAv@3*3Jg+pOQPqjO2sqU^L2RIBdDpGo3mTDYhQ-Y>c*BUtU6<#xfVNyE zFk0+DFT$lExxFAc*Ad_BY^^aIUNJ*uIz1BcK5(O@=QhcmA>H3D3YhwZka4h{}pyO^_|O9OUWwt!umr{d7_nbH6Z+0fooZmpoW__+WDn>wMsl8RYF1xVvs%%+o!TSOYzZ z823Q5KCL+fy(rL!Xw7i)bY=wZbo*90nK}+i$rY%lj;$xGf{t8pzh$CLP1krPD`ABM z_i4iu#^>`pp8y@`BU)4PEn%HmK`CdG$15#AQs~UWT!PT0gEMVyNMuPZv+1NTzlJ;^ zD1VVtb)HV1lo>1_bw4!0YS`yQM=E&jW2_jL*Gi4Hbxg{J-6c^Jx`lDrSH}th< z7QUY`ry=kAh>BqGu`)lox^c_EXEXlmX0S7vez@YpLCQAyjdij)LS;@wRKm%cU04M= z2uR5&j+j8FGP72x48Nt~*XAgeJ}V>3osRCRP47wlG|*~Rpyh91AXXYRwc>Y9FeU%L zij?fL6t7;7me|gRlD1&H&U2tQ!(TbDp5`UHlgwci<}f+pa-n=UT#Z&gpyAG7*69YGBJAVIq>sK3}j~I5J68g8bVdba%K_hEtG&3VLx5iqn z06V+)gj2nG8x{*xU|&bLRV#}NsKNj8d)y7D5!B`lRNA)V`DOVi6baK3PQS(&$tc0k zrI9vbD;SShMz2=K@zt`c#xy56#x4OzwQ~;Yptt<- zHi>_w-pm!q;%zi{$GeNvxGR~70_L>lhsUZPQ$T8VfU`74lSp^jd>gXkth&0^Ul-!bY+OE;+I?ZOSkhRDAdU*me_*VLsfVFWg&da3 zBcU>BGB_4cD8+gq8kBEUuLMBbM>^Sa}K&uC*@Xb`X#FeX~t#N%Q# z&4Yc2er`Q|67WgVwyBV9KOg>zmAD}=@7#b1*l`E!xO}(^t178v3FZ(Wl;OWt3>IG7 zBw*hhUDd_HJQ4t^V8rFH$s*_miOgGFtw-;|wXzFsGlF^fTmHtlP2?xGOl7-_d@(Sg zC36_Qb>y$pRD&CNt7a$PhEIQKfLMOmS~4aCLq{8<5392r_t!?<5VE7GbH-7d8?Rkr zK$C(mzfnp`GJ4PJeXM9@4;37BpECxp4&_%>lm&~KhQlpQ4wp$0J^TbUvbp5;mn{@7 zhwq(Q*^UeYDhl8HZ$5ztHGX1G7>|Q+0A|WpeS+BpY>giQ0nnuengSoq@zREQCpY5Q zbG0g7Gst)fxWl&hhBd8)$KJelFlMz4I@)#H6YA=8>q@^qslE=Y+Dj30m`^FK3tsq=WSk*(IJvy#(xGjE3>@u%xvQ$blfV|kT zs_+)=;1O7Dg&$sQmwiW-T~&40J&NmFjHhmWGK0qwhEca}f~zxxGrpUJ&l#B4PHfCD#xRk>*w*Wm$duo$^I8BD|G*h@vs6$7=Bq#vH zIW2Wv+AVeUsO|ZP_4#7%%y0@86T=c%%LDH}t29;9-|PmZD#ZSb)x(E1KMkA~qW|poM94IhT6) z{m$CXi1o?&qvec<_m?pd@CcQqbQ;+Qfa_bCcKs*%{Rcnwz*(BN=mYx4MYuF)r0Q;M9R<<5Qw;p8B>lSK630ZY20Z;rWLXI&;rbTiI<$?Va zc+l<7Ob#DC0DduYGza+S9(#Cr+zf{sHhZhfYr8llaqpmLSzU3Of-KV(_KrhJ(qyxB5aL0EZZuHvo%M;5* zlv%3@JpI@HcdX<-czDHoDIUenHgE`H@h#r%%gCdHyCD@qcJs6+_*}}|6VLOFe#xl> zK};FHXnlxgctE~1@_BVR%h>^r?6?yef0Iou`pAwdz)_#>x4uYhQb-cVKRV#R( z65#uLA8zzX@RLSu3Ztkyjac0x`X8aJu@_&A$K02%8qK;$QCHS9Rdny{Ui{#FO6;607lH zw4Sp#s)SOEN}*89UCg2=-)`;T-`mUbl6Wd7Dep)sUpG+2CB9a^Kz{iJ{m-WRrO$;C zDHpOF7VQ;iheW+-$oO3$RNSgV7aH|p_W5gy>SqU3ElY@toY(t8pvTuRKd zvp>K0BzHuK)TCjEr#Kk{n`$`MXJ@6V4?mAmE@nkMKD7>RJD>#TARKSY?9ujj*TINm zjhfua5Bk2snfvEk-iPXbaB+N&9X>VgCiVLh%-dUXc7MKT4^|qLkeIX;0amcoz!~j< zPuIzBdC8vo=bKR~o0;yZZ^BHe2?ch2=^f-(LGnc@|mosm);+{QohtHs>LCw#Ap>%EJ@k35AoKa)X;fm?`$MberCIX zYTT1>_rf<%hySGAGx9j)spMpK_m@tUmXK~b-Sh*hIb|oHWP(y7?inxQ!NWGqgveJw?A7kuCf715 zAYb>L0KR2;=h+zzFS@S9g&Ba^X%Cy8@OsE#p&1T2`WTXq@EP;uRwWO_V(-cDH)pQC zvBwZ*ZFz%}A&114XH@^jUCfgHN7j%J1}O!xTYy6H{F_er0}?5-pP)Tv0GXbkR|PEh z@0+}MRO6ab2u#|xU_O*=Rk~a$$sz_)q?pdU3Am}Gv>DQ5cuzT7i%^+>|W zw?nR!bKV^zY%E_OkN2C;H>4AlEBP4~uk-B~HaCC%I{|dD^z{E>HVc>omtCH!@KpOP zs=Udp- z{=|Kt3Ym`Sk3Qg`1v2Uc7S!S_AMK^V!EB5N^y~m5ush`9EZrJHPi8+-LAC1E=9-+# zXNW)bpGjot^#6oKoYJ8TTBu$Gv zEn28|h_@UeELnMmk&v3A#W3hg?|{;S{`wngRXzA!I@_#XEqvsiHTps zo(wmHE$(JSRa;QdyT3=)R0@=_RaRY(t#pT7DNi`cH#r>s2s~MSs=esq=@qt-Az`kR zlvFWpGGT>i^QaH=EbIG!QVmE+@15E}*OX)e8A*?5g~6g+c!<%$@9o$=_ob?0QivpD;7Sac_yITo=D zK3hx;l3r!PPiNH`9g+6Gn=Lt2ZveXBP>q{od8$sWV9=c;WR+Xo==Z-x^{V`Y0M-WH zl`@zALRKjc@?>luO)9{upDeEzw`%y{;2_mU<+u7^$7TZ z+Kf^Si0m^428NtQ>t~{3V*h}oZ=bPC0X!Pk-ya>OcSVZn>_B^2sp_1e^}n%SpoxH! zzw4E2(#0&53;&MJF6ug4y`oZx5d0?2`(rafb zCGz5Fq2lsx9rgF~+yoqO^E@Ea-wW=IukG!lI}5m8o_wVjn`#_j5N)1?lS#bx_I3yh z+#Pht9~of+r9vsRQGh(>Qxq~*Z?%Gblqby93NGnK*#MSqF~lS+Oa zB;*fg2zdb@x2gY!rzy<#e+T|=KK_p!PWD&G|IfH#n{?^|@zoT)$Ib~#v+83FrHV%u G|NVcmVm(g) literal 0 HcmV?d00001 diff --git a/docs/validation/portrait-20261020/probe-summary.json b/docs/validation/portrait-20261020/probe-summary.json new file mode 100644 index 00000000..c6537faf --- /dev/null +++ b/docs/validation/portrait-20261020/probe-summary.json @@ -0,0 +1,134 @@ +[ + { + "camera": "0", + "physical_of": null, + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Supported" + }, + { + "key": "Bokeh preview resolutions", + "value": "176x144, 320x240, 352x288, 640x360, 640x480, 720x480, 960x720, 1280x720, 1232x1008, 1440x1080, 1920x824, 1920x1080" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "640x480, 720x480, 960x720, 1280x720, 1088x1088, 1232x1008, 1440x1080, 1920x824, 1920x1080, 2336x1080, 2400x1080, 1920x1440, 2560x1440, 4000x1716, 4032x1728, 4000x1848, 3840x2160, 2992x2992, 4000x2252, 3648x2736, 4000x3000, 4080x3060" + }, + { + "key": "LIVE Portrait", + "value": "Photo only; size combination must still be checked" + } + ] + }, + { + "camera": "5", + "physical_of": "0", + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Unknown" + }, + { + "key": "Bokeh preview resolutions", + "value": "None reported" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "None reported" + }, + { + "key": "LIVE Portrait", + "value": "Physical camera: select a publicly listed camera ID in LIVE" + } + ] + }, + { + "camera": "6", + "physical_of": "0", + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Unknown" + }, + { + "key": "Bokeh preview resolutions", + "value": "None reported" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "None reported" + }, + { + "key": "LIVE Portrait", + "value": "Physical camera: select a publicly listed camera ID in LIVE" + } + ] + }, + { + "camera": "1", + "physical_of": null, + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Supported" + }, + { + "key": "Bokeh preview resolutions", + "value": "176x144, 320x240, 352x288, 640x360, 640x480, 720x480, 960x720, 1280x720, 1232x1008, 1440x1080, 1920x824, 1920x1080" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "640x480, 720x480, 960x720, 1280x720, 1088x1088, 1232x1008, 1440x1080, 1920x824, 1920x1080, 2336x1080, 2400x1080, 1920x1440, 2560x1440, 3648x1640, 3648x2048, 2736x2736, 3840x2160, 4000x2252, 3648x2736, 4000x3000" + }, + { + "key": "LIVE Portrait", + "value": "Photo only; size combination must still be checked" + } + ] + }, + { + "camera": "2", + "physical_of": null, + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Supported" + }, + { + "key": "Bokeh preview resolutions", + "value": "176x144, 320x240, 352x288, 640x360, 640x480, 720x480, 960x720, 1280x720, 1232x1008, 1440x1080, 1920x824, 1920x1080" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "640x480, 720x480, 960x720, 1280x720, 1088x1088, 1232x1008, 1440x1080, 1920x824, 1920x1080, 2336x1080, 2400x1080, 1920x1440, 2560x1440, 3840x2160, 4000x2252, 3648x2736, 4000x3000" + }, + { + "key": "LIVE Portrait", + "value": "Photo only; size combination must still be checked" + } + ] + }, + { + "camera": "3", + "physical_of": null, + "portrait": [ + { + "key": "Manufacturer BOKEH", + "value": "Supported" + }, + { + "key": "Bokeh preview resolutions", + "value": "176x144, 320x240, 352x288, 640x360, 640x480, 720x480, 960x720, 1280x720, 1232x1008, 1440x980, 1440x1080, 1920x824, 1920x1080" + }, + { + "key": "Bokeh JPEG resolutions", + "value": "640x480, 720x480, 960x720, 1280x720, 1088x1088, 1232x1008, 1440x980, 1440x1080, 1920x824, 1920x1080, 2336x1080, 2400x1080, 1920x1440, 2560x1440, 2208x2208, 3392x1908, 3392x2544" + }, + { + "key": "LIVE Portrait", + "value": "Photo only; size combination must still be checked" + } + ] + } +] diff --git a/guide/_bindings.yaml b/guide/_bindings.yaml index e879479b..d0bc05f8 100644 --- a/guide/_bindings.yaml +++ b/guide/_bindings.yaml @@ -125,6 +125,12 @@ sources: - app/src/main/java/dev/halcamera/camera/DepthSupport.kt - app/src/main/java/dev/halcamera/camera/DepthFrame.kt - app/src/main/java/dev/halcamera/ui/DepthMapView.kt + camera-engines/portrait-engine: + evidence: + - app/src/main/java/dev/halcamera/MainPortraitBridge.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt + - app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt + - app/src/main/java/dev/halcamera/camera/PortraitSupport.kt camera-engines/camera2-engine: evidence: - app/src/main/java/dev/halcamera/camera/Camera2Engine.kt @@ -203,6 +209,9 @@ sources: screens/expert-screen: evidence: - app/src/main/java/dev/halcamera/MainActivity.kt + screens/expert-screen/camera-picker: + evidence: + - app/src/main/java/dev/halcamera/MainCameraPicker.kt # MainActivity 하나만으로도 스캔 입력이 6만 자 한도에 가깝습니다. 최근 촬영물 조회는 화면 배치와 별개의 # 주제이므로 하위 요소로 내려, 둘 다 한도 안에서 스캔되게 합니다. screens/expert-screen/cli-adapter: @@ -369,6 +378,8 @@ sources: - app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt - app/src/main/java/dev/halcamera/camera/DepthCapabilities.kt - app/src/main/java/dev/halcamera/camera/DepthSupport.kt + - app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt + - app/src/main/java/dev/halcamera/camera/PortraitSupport.kt screens/cts-screen: evidence: - app/src/main/java/dev/halcamera/cts/CtsEntryActivity.kt @@ -596,6 +607,9 @@ sources: # data-flow 와 같은 규칙입니다: 요소 근거와 원고 인용의 합집합만 적습니다. evidence: - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/MainDepthBridge.kt + - app/src/main/java/dev/halcamera/MainPortraitBridge.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt - app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt - app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt @@ -656,6 +670,11 @@ sources: engine-lifecycle/camerax-lifecycle: evidence: - app/src/main/java/dev/halcamera/camera/CameraXEngine.kt + engine-lifecycle/portrait-lifecycle: + evidence: + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt + - app/src/main/java/dev/halcamera/MainPortraitBridge.kt + - app/src/main/java/dev/halcamera/MainDepthBridge.kt runner-sequence: evidence: - app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt @@ -706,11 +725,13 @@ sources: - app/src/main/java/dev/halcamera/ui/ExpandingZoomControl.kt - app/src/main/java/dev/halcamera/ui/FocusRing.kt - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/MainCameraPicker.kt elements: .: evidence: - app/src/main/java/dev/halcamera/ui/ExpandingZoomControl.kt - app/src/main/java/dev/halcamera/ui/FocusRing.kt + - app/src/main/java/dev/halcamera/MainCameraPicker.kt telemetry-facts: kind: fact diff --git a/guide/_content/_reference/engine/camera2.md b/guide/_content/_reference/engine/camera2.md index ecf4309c..6bea2e38 100644 --- a/guide/_content/_reference/engine/camera2.md +++ b/guide/_content/_reference/engine/camera2.md @@ -3,6 +3,7 @@ based_on: [overall-architecture] confidence: code sources: - app/src/main/java/dev/halcamera/camera/Camera2Engine.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/camera/LivePipSession.kt - app/src/main/java/dev/halcamera/camera/PipSessionQuery.kt - app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt @@ -66,6 +67,8 @@ Camera2 Live의 프리뷰·사진·녹화·녹화 중 사진 요청은 기존 색온도를 추정하지 않습니다. +제조사 Portrait는 일반 Camera2Engine의 스트림에 섞지 않습니다. API 31 이상에서 PortraitCameraEngine이 BOKEH 확장 전용 미리보기·JPEG 크기를 재검사하고 CameraExtensionSession을 엽니다. JPEG는 MediaLibrary로 저장하며, 미리보기 15초·JPEG 60초 시간 제한과 CameraDevice.onClosed 이후 close(done) 완료 순서를 적용합니다. + ### 손떨림 보정 diff --git a/guide/_content/_reference/engine/comparison.md b/guide/_content/_reference/engine/comparison.md index c6eb5ba1..a9f76039 100644 --- a/guide/_content/_reference/engine/comparison.md +++ b/guide/_content/_reference/engine/comparison.md @@ -15,6 +15,7 @@ sources: - app/src/main/java/dev/halcamera/camera/CameraXLiveRecorder.kt - app/src/main/java/dev/halcamera/camera/CameraXControls.kt - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt - app/src/main/java/dev/halcamera/camera/LivePipSession.kt - app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt @@ -27,6 +28,7 @@ verifications: [] | 항목 | Camera2 | CameraX | | --- | --- | --- | | Depth 보기 | DEPTH_OUTPUT과 DEPTH16 해상도를 공개한 카메라에서 별도 Depth 전용 세션을 엽니다. 맵 표시만 제공합니다. | Depth 해상도를 선택하면 Camera2로 전환합니다. | +| 제조사 Portrait | API 31 이상의 BOKEH 확장 세션으로 전용 미리보기와 JPEG를 받습니다. Depth 메뉴에서 선택하며 수동 제어·RAW·PIP·영상은 제공하지 않습니다. | Portrait를 선택하면 Camera2로 전환합니다. | | 수동 촬영 | ISO·노출 시간·초점과 WB를 프리뷰·사진·녹화에 적용합니다. 지원 여부와 실제 적용값을 표시합니다. | Manual 버튼을 미지원 상태로 비활성화합니다. | | YUV를 JPEG로 선택 | 요청한 YUV 이미지와 최종 CaptureResult의 센서 시각을 맞춥니다. | 촬영 뒤 받은 analysis 프레임 하나를 변환합니다. | | JPEG 출처 | YUV 앱 변환 또는 HAL JPEG 중 하나와 촬영 JSON을 저장합니다. | YUV 앱 변환 또는 ImageCapture JPEG 중 하나와 촬영 JSON을 저장합니다. | diff --git a/guide/_content/_reference/engine/contract.md b/guide/_content/_reference/engine/contract.md index 3fb63931..6433ba7e 100644 --- a/guide/_content/_reference/engine/contract.md +++ b/guide/_content/_reference/engine/contract.md @@ -7,6 +7,7 @@ sources: - app/src/main/java/dev/halcamera/camera/CameraXEngine.kt - app/src/main/java/dev/halcamera/camera/DepthCameraEngine.kt - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/ui/LiveControlBar.kt - app/src/main/java/dev/halcamera/ui/FocusRing.kt - app/src/main/java/dev/halcamera/camera/LiveControls.kt @@ -95,3 +96,5 @@ Live 제어와 터치 측광은 다음 이벤트를 추가로 남깁니다. | CameraX에서 EIS (Video)를 선택합니다. | VideoCapture가 연결된 녹화 중에 대조합니다. 녹화 전에는 실제 결과만 표시합니다. | 사진 결과는 Camera2의 요청 태그와 CameraX의 `captureIntent`로 제외합니다. 설정 화면은 구성 실패 오류만 표시하며 이전 세션 결과 목록을 제공하지 않습니다. + +제조사 Portrait는 별도 `CameraExtensionSession`을 사용합니다. 일반 `CaptureResult` 지표와 EIS 대조를 표시하지 않으며 수동 제어·줌·측광도 제공하지 않습니다. Depth 메뉴에서 선택하지만 출력은 OEM 컬러 미리보기와 JPEG이며, 센서 Depth 맵과 구분합니다. diff --git a/guide/_content/architecture/constraints.md b/guide/_content/architecture/constraints.md index 68b24cbe..763bb436 100644 --- a/guide/_content/architecture/constraints.md +++ b/guide/_content/architecture/constraints.md @@ -12,6 +12,7 @@ sources: - app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt - app/src/main/java/dev/halcamera/cli/CommandStore.kt - app/src/main/java/dev/halcamera/camera/CameraEngine.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt - app/src/main/java/dev/halcamera/camera/CameraEndpointResolver.kt - app/src/main/java/dev/halcamera/telemetry/IncidentExporter.kt @@ -42,6 +43,8 @@ verifications: [] Depth 보기는 컬러와 Depth를 같은 요청에 포함하지 않는 별도 Camera2 세션입니다. HAL의 동시 요청 허용 선언은 특정 출력 조합의 성공을 보장하지 않습니다. `DepthCameraEngine`은 촬영·녹화·수동 제어·줌·터치 측광을 제공하지 않으며 CLI 제어 변경도 거절합니다. Photo·Video 또는 CLI 촬영 준비로 전환하면 Depth를 해제합니다. +제조사 Portrait도 일반 촬영과 별도의 확장 세션을 사용합니다. Bokeh 확장 전용 해상도로 컬러 미리보기와 JPEG만 요청하며, 세션이 거절되면 다른 크기로 자동 대체하지 않습니다. 단일 촬영의 JPEG를 받기 전에 실패하거나 종료되면 세션을 해제하여 늦은 이미지를 다음 촬영에 연결하지 않습니다. 이미 받은 JPEG의 저장 작업은 종료 후에도 마칠 수 있습니다. + Multi 모드의 `MultiSession`은 `CameraEngine`과 별도입니다. Camera2는 선택한 독립 장치를 연 뒤 세션을 구성하며, CameraX는 광고된 동시 조합을 바인딩합니다. 모든 장치의 종료 통지를 확인해야 출력을 해제하고 다음 동시 세션을 열 수 있습니다. 한 명령의 여러 사진을 센서 동기 촬영으로 해석하지 않습니다. diff --git a/guide/_content/architecture/module-roles.md b/guide/_content/architecture/module-roles.md index 4a224f72..eacd8525 100644 --- a/guide/_content/architecture/module-roles.md +++ b/guide/_content/architecture/module-roles.md @@ -23,6 +23,7 @@ sources: - app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt - app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt - app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt - app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt @@ -95,6 +96,7 @@ verifications: [] camera/ - 엔진 계약, Camera2·CameraX 구현, 엔드포인트 열거를 제공합니다. `DepthCameraEngine`은 컬러 출력 없이 DEPTH16 맵만 받으며 `DepthFrame`이 순수 Kotlin으로 표시용 표본을 만듭니다. +- `PortraitCameraEngine`은 LIVE의 제조사 BOKEH 전용 세션입니다. MainPortraitBridge가 JPEG 크기를 선택하고 MainDepthBridge가 Depth Map과 Portrait의 진입점을 구분합니다. 이 경로는 벤치마크를 실행하거나 센서 Depth 맵을 저장하지 않습니다. - `close(done)` 완료 전에 다음 카메라를 열지 않습니다. - 엔진 계약(`MediaCapture`, `LiveTuning`, `TouchMetering`)과 두 엔진의 구현, 두 엔진의 차이는 [Engine Comparison](engine.md)에 있습니다. - 벤치마크 RECORD 단계의 recorder 상태 기계는 `BenchmarkRecorder`가 담당하고 `Camera2Engine`은 그 호출을 위임합니다. diff --git a/guide/_content/architecture/overview.md b/guide/_content/architecture/overview.md index a2372915..32be428c 100644 --- a/guide/_content/architecture/overview.md +++ b/guide/_content/architecture/overview.md @@ -32,7 +32,7 @@ verifications: [] | 화면 | 할 수 있는 일 | | --- | --- | -| Live · `MainActivity` | 앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며 지원 카메라의 Depth 맵을 봅니다. | +| Live · `MainActivity` | 앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며, 지원 카메라의 제조사 Portrait와 Depth 맵을 선택합니다. | | Multi · `ConcurrentCameraActivity` | 독립 카메라 장치별 사진·영상을 제공합니다. Live의 Multi · P와 Multi · V에서 엽니다. | | Lab · `WorkbenchActivity` | 기기 정보, 검사 도구, 저장된 결과와 설정을 엽니다. | | Benchmark · `BenchmarkActivity` | 정해진 조건(profile)으로 측정하고 결과를 저장합니다. | diff --git a/guide/_content/architecture/runtime-flow.md b/guide/_content/architecture/runtime-flow.md index b06d5103..e4540b4c 100644 --- a/guide/_content/architecture/runtime-flow.md +++ b/guide/_content/architecture/runtime-flow.md @@ -7,6 +7,7 @@ sources: - tools/halcam/halcam/cli.py - tools/halcam/halcam/download.py - app/src/main/java/dev/halcamera/MainActivity.kt + - app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt - app/src/main/java/dev/halcamera/GalleryActivity.kt - app/src/main/java/dev/halcamera/camera/MediaLibrary.kt - app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt @@ -41,6 +42,8 @@ Live 셔터 조작은 `MainActivity`에서 선택한 엔진의 촬영·녹화 Live의 Depth 보기는 `DepthCameraEngine → ImageReader → DepthFrame → DepthMapView`로 연결합니다. 컬러 촬영과 분리된 보기이며, Telemetry에는 버퍼의 시각·크기·형식과 capture 콜백만 기록합니다. 맵 픽셀을 벤치마크나 incident ZIP의 입력으로 전달하지 않습니다. 사용 순서는 [Depth 맵 보기](live.md#depth-맵을-보세요)에 있습니다. +같은 Depth 메뉴의 Portrait는 `PortraitCameraEngine → CameraExtensionSession → JPEG ImageReader → MediaLibrary`로 연결합니다. 제조사 Bokeh가 적용된 컬러 사진을 저장하며 별도의 센서 Depth 맵을 받지 않습니다. 확장 처리 이벤트는 일반 Camera2 프레임 지표와 구분하고, 사진 픽셀은 측정 파일에 넣지 않습니다. + 벤치마크는 별도 화면인 `BenchmarkActivity`가 준비를 마친 뒤 `BenchmarkRunner.start()`를 호출하여 시작합니다. `Telemetry.callback(...)`이 반환한 Camera2 콜백의 `onCaptureStarted`는 프레임워크 신호를 기록하며, Live 셔터와 벤치마크 시작을 연결하는 메서드가 아닙니다. diff --git a/guide/live.md b/guide/live.md index d6b3a5a7..87d6daaa 100644 --- a/guide/live.md +++ b/guide/live.md @@ -8,6 +8,7 @@ title: Live Photo로 한 장을 찍고, Video로 움직임을 담아 보세요. 처음에는 기본값이면 충분합니다. - **[촬영](#live에서-촬영하세요)** · 사진·연사·AEB·동영상을 촬영합니다. +- **[Portrait](#제조사-portrait로-배경을-흐리세요)** · Depth 메뉴에서 제조사 Bokeh 사진을 선택합니다. - **[수동 설정](#수동-촬영-조건을-고정하세요)** · ISO·노출 시간·초점을 고정합니다. - **[스트림 설정](#live-스트림을-설정하세요)** · 출력 크기·FPS·포맷을 바꿉니다. - **[PIP](#pip로-보이는-구도를-저장하세요) · [Multi](#여러-카메라를-함께-촬영하세요)** · 보조 화면을 합성하거나 여러 카메라로 촬영합니다. @@ -25,11 +26,27 @@ Photo로 한 장을 찍고, Video로 움직임을 담아 보세요. 처음에는 **모드나 엔진을 바꾸면 새 촬영으로 시작합니다.** PIP·스트림·줌·촬영 제어는 초기화됩니다. Callback의 고정 시간은 사용자 설정으로 유지합니다. +### 제조사 Portrait로 배경을 흐리세요 + +1. `Lab → Probe`에서 카메라별 `Portrait · Manufacturer Bokeh` 지원 여부와 전용 미리보기·JPEG 해상도를 확인합니다. +2. Live의 `Depth → Portrait (Bokeh)`를 선택합니다. +3. JPEG 해상도를 고릅니다. 각 항목에 함께 구성할 미리보기 해상도를 표시합니다. +4. 미리보기가 준비되면 가운데 셔터로 촬영하고, 저장 완료 뒤 갤러리에서 JPEG를 확인합니다. +5. 일반 촬영으로 돌아가려면 `Photo`나 `Video`를 누릅니다. `Depth → Off`로도 Photo로 돌아갑니다. + +**Portrait는 제조사가 처리한 컬러 미리보기와 JPEG를 받는 촬영 모드입니다.** Depth 메뉴에서 선택하지만 센서 Depth 맵을 받는 기능은 아닙니다. `DEPTH_OUTPUT`이 없는 카메라도 Bokeh 확장을 제공할 수 있습니다. 이 앱의 제조사 Portrait는 Android 12 / API 31 이상에서 Camera2 확장 세션을 사용합니다. + +선택하면 기존 카메라를 닫고 표시한 해상도로 세션을 엽니다. 나열된 크기라도 조합에 따라 제조사가 거절할 수 있으며, 다른 크기로 자동 대체하지 않습니다. 세션 구성 후 첫 미리보기 프레임은 15초, 촬영 요청 후 JPEG 수신은 60초까지 기다리고 실패 이유를 표시합니다. 실패 뒤에는 Depth 메뉴에서 해상도를 다시 고르거나 Photo로 돌아가세요. + +Portrait에서는 동영상·RAW·YUV 사진·연사·AEB·PIP·줌·터치 측광·수동 제어를 제공하지 않습니다. 배경 흐림의 모양과 강도는 제조사가 정합니다. JPEG와 `manufacturer_bokeh` 촬영 메타데이터는 일반 사진과 같은 저장 경로에 남고 Benchmark JSON이나 진단 ZIP에 이미지 픽셀을 넣지 않습니다. + +같은 모드로 Lab에서 돌아오거나 앱을 다시 표시하면 Portrait 해상도를 유지합니다. 카메라·엔진을 바꾸거나 일반 Live Streams 설정을 적용하면 Portrait를 종료합니다. 크기 표시는 일반 Live Streams 대신 Depth 선택 메뉴를 엽니다. 새 CLI 촬영 요청은 일반 Photo·Video 구성을 사용하며 Portrait를 이어받지 않습니다. + ### Depth 맵을 보세요 1. `Lab → Probe`에서 카메라의 `Depth` 섹션을 확인합니다. 2. Live로 돌아와 카메라를 선택합니다. -3. 하단의 `Depth`를 누르고 `DEPTH16` 해상도를 선택합니다. 지원하지 않거나 정보를 읽지 못한 카메라는 이유를 표시합니다. +3. 하단의 `Depth → Depth Map`에서 `DEPTH16` 해상도를 선택합니다. 지원하지 않거나 정보를 읽지 못한 카메라는 Depth 메뉴에 이유를 표시합니다. 4. 컬러 화면으로 돌아가려면 `Photo` 또는 `Video`를 누릅니다. `Depth → Off`로도 Photo로 돌아갈 수 있습니다. **Depth는 Camera2의 깊이 맵만 표시하는 보기 모드입니다.** 선택하면 기존 카메라를 닫은 뒤 Depth 전용 세션을 엽니다. 컬러와 Depth를 같은 요청에서 받을 수 없는 기기에서도 사용할 수 있으며, 컬러와 정렬된 합성 화면은 제공하지 않습니다. 사진·동영상 저장, 줌·터치 측광·수동 제어와 PIP는 사용할 수 없습니다. diff --git a/guide/probe.md b/guide/probe.md index bb9c4321..514fe8e2 100644 --- a/guide/probe.md +++ b/guide/probe.md @@ -30,12 +30,13 @@ title: Probe - **섹션:** 제목을 눌러 접거나 펼칩니다. 출력 형식별 크기는 STREAMS에서 확인합니다. - **DEPTH:** `DEPTH_OUTPUT` 지원 여부와 `DEPTH16` 해상도, 컬러와 Depth를 같은 요청에 포함할 수 있는지를 확인합니다. `Allowed by HAL`은 기기의 선언이며 특정 출력 조합의 동작을 보장하지 않습니다. `Unknown`은 해당 정보를 읽지 못한 상태입니다. 단독으로 열 수 없는 물리 카메라는 LIVE에서 직접 선택할 수 없습니다. - **필터:** 단어가 들어간 줄을 찾습니다. 결과를 누르면 해당 항목으로 이동합니다. +- **PORTRAIT · MANUFACTURER BOKEH:** 제조사 Bokeh 지원 여부와 확장 전용 미리보기·JPEG 해상도를 확인합니다. 일반 STREAMS 크기와 구분하며, 크기 조합의 성공 여부는 실제 촬영으로 확인해야 합니다. Android 12 미만이나 단독 선택할 수 없는 물리 카메라는 이유를 표시합니다. Bokeh 지원은 Depth 맵 공개를 뜻하지 않습니다. - **REQUEST · RESULT KEYS / SESSION KEYS:** 요청·결과에서 지원하는 key 이름입니다. 실제 촬영값은 아닙니다.
섹션 이름과 API별 표시 조건 -IDENTITY, CAPABILITIES, DEPTH, SENSOR, LENS, CONTROL, PROCESSING, REQUEST 뒤에 REQUEST · RESULT KEYS가 나옵니다. +IDENTITY, CAPABILITIES, DEPTH, PORTRAIT · MANUFACTURER BOKEH, SENSOR, LENS, CONTROL, PROCESSING, REQUEST 뒤에 REQUEST · RESULT KEYS가 나옵니다. SESSION KEYS는 API 28 이상, MANDATORY STREAM COMBINATIONS는 API 29 이상에서 표시합니다. diff --git a/tools/docgen/regression.test.mjs b/tools/docgen/regression.test.mjs index e92f96ab..fadd9a57 100644 --- a/tools/docgen/regression.test.mjs +++ b/tools/docgen/regression.test.mjs @@ -114,7 +114,7 @@ test('all configured elements fit the prompt budget and exclude descendant field assert.ok(input.files.length > 0); count++; } } - assert.equal(count, 112); // Includes the LIVE depth engine's own evidence. + assert.equal(count, 115); // Depth/Portrait engines, Portrait lifecycle and LIVE camera picker own their evidence. `)); }); diff --git a/tools/docgen/state/evidence.json b/tools/docgen/state/evidence.json index 35173d0e..99b8e128 100644 --- a/tools/docgen/state/evidence.json +++ b/tools/docgen/state/evidence.json @@ -3,7 +3,7 @@ "entries": { "omm:overall-architecture": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", @@ -288,7 +288,7 @@ }, "omm:data-flow": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "97b991ec49bfd746", @@ -339,7 +339,7 @@ }, "omm:state-transitions": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "47bddf1bbf31016c", @@ -383,7 +383,7 @@ }, "content:architecture.md/overview": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "19ab0340fcab873e", @@ -671,7 +671,7 @@ }, "content:architecture.md/runtime-flow": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "1bbf79a32baf27f3", @@ -1003,7 +1003,7 @@ } }, "observed": { - "state": "fresh" + "state": "stale" } }, "content:architecture.md/constraints": { @@ -1288,7 +1288,7 @@ } }, "observed": { - "state": "fresh" + "state": "stale" } }, "omm:ui-camera-label": { @@ -1309,7 +1309,7 @@ }, "omm:ui-tool-handoff": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "5733479109e046e8", @@ -1325,7 +1325,7 @@ }, "omm:ui-zoom": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "0c74536c0bae608f", @@ -1342,7 +1342,7 @@ }, "content:_reference/engine.md/contract": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", @@ -1627,7 +1627,7 @@ }, "content:_reference/engine.md/camera2": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", @@ -1912,7 +1912,7 @@ }, "content:_reference/engine.md/camerax": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", @@ -2197,7 +2197,7 @@ }, "content:_reference/engine.md/comparison": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", @@ -2482,7 +2482,7 @@ }, "content:_reference/troubleshooting.md/layer-isolation": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "9edb9935832a8bbc", @@ -2544,7 +2544,7 @@ }, "content:_reference/evidence.md/device-notes": { "observed": { - "state": "fresh" + "state": "stale" }, "accepted": { "codeHash": "c896f57e566251f5", From b5697baa2d81ea4a93fd54d2a309b90183261a0b Mon Sep 17 00:00:00 2001 From: TTolsun <112919054+TTolsun@users.noreply.github.com> Date: Tue, 20 Oct 2026 02:19:39 +0900 Subject: [PATCH 2/2] Refresh Portrait documentation and review evidence --- docs/.site-manifest.json | 6 +- docs/architecture.html | 40 +-- docs/live.html | 15 +- docs/probe.html | 3 +- docs/validation/portrait-20261020/README.md | 2 + guide/_reference/engine.md | 29 +- guide/_reference/evidence.md | 6 +- guide/_reference/troubleshooting.md | 8 +- guide/architecture.md | 41 +-- tools/docgen/state/evidence.json | 325 ++++++++++++-------- 10 files changed, 279 insertions(+), 196 deletions(-) diff --git a/docs/.site-manifest.json b/docs/.site-manifest.json index 97ff5d45..92e4193d 100644 --- a/docs/.site-manifest.json +++ b/docs/.site-manifest.json @@ -4,7 +4,7 @@ ".nojekyll": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "_inputs/decisions.html": "aadc3cad5fb3b8e37af148aa62ae79f9be0ba19a076fd2837f85c471b1629ded", "_inputs/device-verification.yaml": "1852f48d52f75733b4db973418fc7fad1f0f9d340a8b4b555cf9d49aa7016215", - "architecture.html": "c25e2ce64ddb1b47c6c15aabc52c7742a2aed3fb830f72bbbf353d0450624361", + "architecture.html": "2e724bfe40ab9f43def45e11f6a079574f798dbf974875ebcf591d1dfcc0c1ab", "assets/docflow-design.css": "1cc4f34d8df94abdcf70ab2e9c51e456d8ef7f52283a2ef3adb986a6bd38d44c", "assets/media/automation/bridge.png": "bdbd7cbdc28010caa9b8e320e2d311efd35bb2f66cbb9b5cb322af638b7ccbff", "assets/media/automation/opening-sensor.mp4": "8e26f5eeeb0b92cd241b2235aab7ffd122cbf2ac94b66c37fafb440da4ae1178", @@ -72,8 +72,8 @@ "getting-started.html": "75b356487a9be6930c095686fcdc47229ecdd53b73b77f971a770f1e0f387e0f", "glossary.html": "a26775e3f8a0d6af19b7531b2dc86ea7630a9c0511bb34a308e3a630522462f1", "index.html": "34466a88605267322b92082ec1592c72a48a9fd2e3cdee59e66cea770d79372a", - "live.html": "5a5c7a1bb6ba91857d68ccbbce07e28894c6c6194191c227a91241460686f119", - "probe.html": "95c89f7937f412abe452c3a8a3134b1f129908d8bccebb78671d1c49fd0302a1", + "live.html": "7b43bcd9f7eaaf71491a9555d58e54fb037f785481720ac92512b264cc39e971", + "probe.html": "1a6eca6e50a2a21ede1c88bd122a000ca4be349733e4866ab6870b676f76447a", "troubleshooting.html": "819baee906880fbaab14d0a649623326227868e748966ddbfe2d0272a50e53cb" } } diff --git a/docs/architecture.html b/docs/architecture.html index 22138c8e..3fa2ac2a 100644 --- a/docs/architecture.html +++ b/docs/architecture.html @@ -79,7 +79,7 @@

One system.
Clear responsibilities.

측정·판 Live · MainActivity -앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며 지원 카메라의 Depth 맵을 봅니다. +앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며, 지원 카메라의 제조사 Portrait와 Depth 맵을 선택합니다. Multi · ConcurrentCameraActivity @@ -113,7 +113,7 @@

코드를 처음 읽는 순서

근거와 검토 정보
  • 근거 파일: app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, tools/halcam/halcam/cli.py, app/src/main/java/dev/halcamera/MainActivity.kt, app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt, app/src/main/java/dev/halcamera/WorkbenchActivity.kt, app/src/main/java/dev/halcamera/camera/CameraEngine.kt, app/src/main/java/dev/halcamera/telemetry/Telemetry.kt, app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt, app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt, app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt
  • 근거 수준: 코드 확인
  • -
  • 검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review
  • +
  • 검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review

전체 구조도

화살표는 코드를 사용하는 방향입니다. 이벤트와 파일이 이동하는 순서는 데이터 흐름에서 확인하세요.

@@ -210,6 +210,8 @@

코드를 처음 읽는 순서

camera/
  • 엔진 계약, Camera2·CameraX 구현, 엔드포인트 열거를 제공합니다. DepthCameraEngine은 컬러 출력 없이 DEPTH16 맵만 받으며 DepthFrame이 순수 Kotlin으로 표시용 표본을 만듭니다.

  • +
  • PortraitCameraEngine은 LIVE의 제조사 BOKEH 전용 세션입니다. MainPortraitBridge가 JPEG 크기를 선택하고 MainDepthBridge가 Depth Map과 Portrait의 진입점을 구분합니다. 이 경로는 벤치마크를 실행하거나 센서 Depth 맵을 저장하지 않습니다.

    +
  • close(done) 완료 전에 다음 카메라를 열지 않습니다.

  • 엔진 계약(MediaCapture, LiveTuning, TouchMetering)과 두 엔진의 구현, 두 엔진의 차이는 Engine Comparison에 있습니다.

    @@ -290,9 +292,9 @@

    코드를 처음 읽는 순서

    ui/RecentMediaButton은 받은 썸네일을 원형으로 그리며, 항목이 동영상이면 가운데에 재생 표시를 겹쳐 접근성 설명뿐 아니라 화면으로도 종류를 알 수 있게 합니다.

    근거와 검토 정보
      -
    • 근거 파일: app/src/main/java/dev/halcamera/camera/MultiSession.kt, app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt, app/src/main/java/dev/halcamera/camera/MultiRecording.kt, app/src/main/java/dev/halcamera/camera/SplitDragGesture.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, app/src/main/java/dev/halcamera/cli/LiveController.kt, app/src/main/java/dev/halcamera/cli/BenchmarkController.kt, app/src/main/java/dev/halcamera/cli/CliLibrary.kt, app/src/main/java/dev/halcamera/MainCliBridge.kt, app/src/main/java/dev/halcamera/DualCliBridge.kt, app/src/main/java/dev/halcamera/camera/CameraEngine.kt, app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt, app/src/main/java/dev/halcamera/benchmark/platform/EnvironmentProbe.kt, app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt, app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunIndex.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkCsv.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt, app/src/main/java/dev/halcamera/MainActivity.kt, app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt, app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt, app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt, app/src/main/java/dev/halcamera/ui/RecentMediaButton.kt, app/src/main/java/dev/halcamera/ui/Look.kt, app/src/main/java/dev/halcamera/cts/recording/BasicRecordingRules.kt, app/src/main/java/dev/halcamera/cts/CtsEntryActivity.kt, app/src/main/java/dev/halcamera/cts/vendored/VendoredCaseActivity.kt, app/src/main/java/dev/halcamera/cts/vendored/VendoredCtsListActivity.kt, app/src/main/java/dev/halcamera/cts/CtsCaseActivity.kt, app/src/main/java/dev/halcamera/cts/CtsCaseListActivity.kt, app/src/main/java/dev/halcamera/cts/suite/CtsChecklistActivity.kt, app/src/main/java/dev/halcamera/cts/suite/CtsSuiteRunActivity.kt, app/src/main/java/dev/halcamera/cts/suite/SuitePlan.kt, app/src/main/java/dev/halcamera/cts/suite/SuiteReport.kt, app/src/main/java/dev/halcamera/cts/CtsCatalog.kt, app/src/main/java/dev/halcamera/cts/CtsRunner.kt, app/src/main/java/dev/halcamera/cts/CameraCaseRunner.kt, app/src/main/java/dev/halcamera/cts/Camera2Ops.kt, app/src/main/java/dev/halcamera/cts/onoff/FastOnOffRules.kt, app/src/main/java/dev/halcamera/cts/switching/SwitchingRules.kt, app/src/main/java/dev/halcamera/cts/sizes/AllSizeOnOffRules.kt, app/src/main/java/dev/halcamera/cts/combination/StillPreviewCombinationRules.kt, app/src/main/java/dev/halcamera/cts/snapshot/VideoSnapshotRules.kt, app/src/main/java/dev/halcamera/CameraProbeActivity.kt, app/src/main/java/dev/halcamera/camera/CameraProbe.kt, app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt
    • +
    • 근거 파일: app/src/main/java/dev/halcamera/camera/MultiSession.kt, app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt, app/src/main/java/dev/halcamera/camera/MultiRecording.kt, app/src/main/java/dev/halcamera/camera/SplitDragGesture.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, app/src/main/java/dev/halcamera/cli/LiveController.kt, app/src/main/java/dev/halcamera/cli/BenchmarkController.kt, app/src/main/java/dev/halcamera/cli/CliLibrary.kt, app/src/main/java/dev/halcamera/MainCliBridge.kt, app/src/main/java/dev/halcamera/DualCliBridge.kt, app/src/main/java/dev/halcamera/camera/CameraEngine.kt, app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt, app/src/main/java/dev/halcamera/benchmark/platform/EnvironmentProbe.kt, app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt, app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunIndex.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkCsv.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt, app/src/main/java/dev/halcamera/MainActivity.kt, app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt, app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt, app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt, app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt, app/src/main/java/dev/halcamera/ui/RecentMediaButton.kt, app/src/main/java/dev/halcamera/ui/Look.kt, app/src/main/java/dev/halcamera/cts/recording/BasicRecordingRules.kt, app/src/main/java/dev/halcamera/cts/CtsEntryActivity.kt, app/src/main/java/dev/halcamera/cts/vendored/VendoredCaseActivity.kt, app/src/main/java/dev/halcamera/cts/vendored/VendoredCtsListActivity.kt, app/src/main/java/dev/halcamera/cts/CtsCaseActivity.kt, app/src/main/java/dev/halcamera/cts/CtsCaseListActivity.kt, app/src/main/java/dev/halcamera/cts/suite/CtsChecklistActivity.kt, app/src/main/java/dev/halcamera/cts/suite/CtsSuiteRunActivity.kt, app/src/main/java/dev/halcamera/cts/suite/SuitePlan.kt, app/src/main/java/dev/halcamera/cts/suite/SuiteReport.kt, app/src/main/java/dev/halcamera/cts/CtsCatalog.kt, app/src/main/java/dev/halcamera/cts/CtsRunner.kt, app/src/main/java/dev/halcamera/cts/CameraCaseRunner.kt, app/src/main/java/dev/halcamera/cts/Camera2Ops.kt, app/src/main/java/dev/halcamera/cts/onoff/FastOnOffRules.kt, app/src/main/java/dev/halcamera/cts/switching/SwitchingRules.kt, app/src/main/java/dev/halcamera/cts/sizes/AllSizeOnOffRules.kt, app/src/main/java/dev/halcamera/cts/combination/StillPreviewCombinationRules.kt, app/src/main/java/dev/halcamera/cts/snapshot/VideoSnapshotRules.kt, app/src/main/java/dev/halcamera/CameraProbeActivity.kt, app/src/main/java/dev/halcamera/camera/CameraProbe.kt, app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt
    • 근거 수준: 코드 확인
    • -
    • 검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review
    • +
    • 검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review

    CLI 책임을 따라가세요

    CliCommands는 명령별 필수 인자·허용 옵션·기본 제한·실행 대상과 Live에서 실행되는 방식(flow)·녹화 여부를 한곳에서 정의하고 hello.command_specs로 제공합니다.

    @@ -310,6 +312,7 @@

    주요 실행 흐름

    배치·간격·애니메이션·접근성 문구 같은 앱의 조작 규칙은 APP-UI.md가 관리합니다.

    Live 셔터 조작은 MainActivity에서 선택한 엔진의 촬영·녹화 동작으로 이어집니다.

    Live의 Depth 보기는 DepthCameraEngine → ImageReader → DepthFrame → DepthMapView로 연결합니다. 컬러 촬영과 분리된 보기이며, Telemetry에는 버퍼의 시각·크기·형식과 capture 콜백만 기록합니다. 맵 픽셀을 벤치마크나 incident ZIP의 입력으로 전달하지 않습니다. 사용 순서는 Depth 맵 보기에 있습니다.

    +

    같은 Depth 메뉴의 Portrait는 PortraitCameraEngine → CameraExtensionSession → JPEG ImageReader → MediaLibrary로 연결합니다. 제조사 Bokeh가 적용된 컬러 사진을 저장하며 별도의 센서 Depth 맵을 받지 않습니다. 확장 처리 이벤트는 일반 Camera2 프레임 지표와 구분하고, 사진 픽셀은 측정 파일에 넣지 않습니다.

    벤치마크는 별도 화면인 BenchmarkActivity가 준비를 마친 뒤 BenchmarkRunner.start()를 호출하여 시작합니다.

    Telemetry.callback(...)이 반환한 Camera2 콜백의 onCaptureStarted는 프레임워크 신호를 기록하며, Live 셔터와 벤치마크 시작을 연결하는 메서드가 아닙니다.

    실행에서 저장까지

    @@ -436,9 +439,9 @@

    CLI 요청과 결과 수집

    이전 CameraX 그래프가 닫히기 전에 MainActivity가 다시 카메라를 열지 않도록 합니다.

    근거와 검토 정보
      -
    • 근거 파일: app/src/main/java/dev/halcamera/cli/CliProvider.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, tools/halcam/halcam/cli.py, tools/halcam/halcam/download.py, app/src/main/java/dev/halcamera/MainActivity.kt, app/src/main/java/dev/halcamera/GalleryActivity.kt, app/src/main/java/dev/halcamera/camera/MediaLibrary.kt, app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt, app/src/main/java/dev/halcamera/telemetry/Telemetry.kt, app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt, app/src/main/java/dev/halcamera/metrics/MetricExtractor.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunRetention.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt, app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt, app/src/main/java/dev/halcamera/benchmark/platform/LaunchDiagnostics.kt, app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt
    • +
    • 근거 파일: app/src/main/java/dev/halcamera/cli/CliProvider.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, tools/halcam/halcam/cli.py, tools/halcam/halcam/download.py, app/src/main/java/dev/halcamera/MainActivity.kt, app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt, app/src/main/java/dev/halcamera/GalleryActivity.kt, app/src/main/java/dev/halcamera/camera/MediaLibrary.kt, app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt, app/src/main/java/dev/halcamera/telemetry/Telemetry.kt, app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt, app/src/main/java/dev/halcamera/metrics/MetricExtractor.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunRetention.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt, app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt, app/src/main/java/dev/halcamera/benchmark/platform/LaunchDiagnostics.kt, app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt
    • 근거 수준: 코드 확인
    • -
    • 검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review
    • +
    • 검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review

    이벤트와 결과가 전달되는 경로

    graph TB
    @@ -576,7 +579,7 @@ 

    카메라 이름을 적는 방법

    줌 컨트롤의 상태

현재 배율을 누르면 지원 배율이 펼쳐집니다. 처음에는 현재 배율 하나만 보입니다.

Live 프리뷰에서 두 손가락을 벌리거나 모으면 지원 범위 안에서 연속으로 줌을 바꿉니다. 가장 가까운 프리셋의 원에 현재 배율을 소수 첫째 자리까지 표시하며, 펼친 상태에서 그 원을 누르면 해당 프리셋 배율로 돌아갑니다. 화면의 카메라 선택 정보를 갱신해도 중간 배율은 유지합니다.

-

핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다.

+

핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기·제조사 Portrait, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다.

@@ -632,6 +635,7 @@

실행과 측정의 제약

Depth 보기는 컬러와 Depth를 같은 요청에 포함하지 않는 별도 Camera2 세션입니다. HAL의 동시 요청 허용 선언은 특정 출력 조합의 성공을 보장하지 않습니다. DepthCameraEngine은 촬영·녹화·수동 제어·줌·터치 측광을 제공하지 않으며 CLI 제어 변경도 거절합니다. Photo·Video 또는 CLI 촬영 준비로 전환하면 Depth를 해제합니다.

+

제조사 Portrait도 일반 촬영과 별도의 확장 세션을 사용합니다. Bokeh 확장 전용 해상도로 컬러 미리보기와 JPEG만 요청하며, 세션이 거절되면 다른 크기로 자동 대체하지 않습니다. 단일 촬영의 JPEG를 받기 전에 실패하거나 종료되면 세션을 해제하여 늦은 이미지를 다음 촬영에 연결하지 않습니다. 이미 받은 JPEG의 저장 작업은 종료 후에도 마칠 수 있습니다.

Multi 모드의 MultiSession은 CameraEngine과 별도입니다. Camera2는 선택한 독립 장치를 연 뒤 세션을 구성하며, CameraX는 광고된 동시 조합을 바인딩합니다.

모든 장치의 종료 통지를 확인해야 출력을 해제하고 다음 동시 세션을 열 수 있습니다. 한 명령의 여러 사진을 센서 동기 촬영으로 해석하지 않습니다.

Multi V의 MicrophoneCapture는 AudioRecord의 MONOTONIC 하드웨어 시각과 PCM 프레임 위치로 오디오 원점을 구합니다.

@@ -670,9 +674,9 @@

CLI의 접근과 완료 경계

Live 카메라 종료 후 벤치마크 화면으로 이동하고 기존 측정·판정 규칙을 유지합니다.

근거와 검토 정보
    -
  • 근거 파일: app/src/main/java/dev/halcamera/camera/MultiSession.kt, app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt, app/src/main/java/dev/halcamera/camera/MultiRecording.kt, app/src/main/java/dev/halcamera/camera/MicrophoneCapture.kt, app/src/main/java/dev/halcamera/camera/TimestampedVideoRecording.kt, app/src/main/java/dev/halcamera/camera/DeviceCompositor.kt, app/src/main/java/dev/halcamera/cli/CliProvider.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, app/src/main/java/dev/halcamera/cli/CommandStore.kt, app/src/main/java/dev/halcamera/camera/CameraEngine.kt, app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt, app/src/main/java/dev/halcamera/camera/CameraEndpointResolver.kt, app/src/main/java/dev/halcamera/telemetry/IncidentExporter.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RegressionRules.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkStore.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkIndex.kt, app/src/main/java/dev/halcamera/benchmark/domain/AtomicFiles.kt
  • +
  • 근거 파일: app/src/main/java/dev/halcamera/camera/MultiSession.kt, app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt, app/src/main/java/dev/halcamera/camera/MultiRecording.kt, app/src/main/java/dev/halcamera/camera/MicrophoneCapture.kt, app/src/main/java/dev/halcamera/camera/TimestampedVideoRecording.kt, app/src/main/java/dev/halcamera/camera/DeviceCompositor.kt, app/src/main/java/dev/halcamera/cli/CliProvider.kt, app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt, app/src/main/java/dev/halcamera/cli/CommandStore.kt, app/src/main/java/dev/halcamera/camera/CameraEngine.kt, app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt, app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt, app/src/main/java/dev/halcamera/camera/CameraEndpointResolver.kt, app/src/main/java/dev/halcamera/telemetry/IncidentExporter.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt, app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt, app/src/main/java/dev/halcamera/benchmark/domain/RegressionRules.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt, app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkStore.kt, app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkIndex.kt, app/src/main/java/dev/halcamera/benchmark/domain/AtomicFiles.kt
  • 근거 수준: 코드 확인
  • -
  • 검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review
  • +
  • 검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review

변경 후 검증

Android 의존성이 없는 러너와 평가 로직은 JVM 단위 테스트로 확인할 수 있습니다. 저장소 루트에서 실행하세요.

@@ -712,17 +716,17 @@

미완성 기능과 추가 검증

- + - + - + @@ -732,32 +736,32 @@

미완성 기능과 추가 검증

- + - + - + - + - + - +
구조 원본 data-flow 최신검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
구조 원본 overall-architecture 최신검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
구조 원본 state-transitions 최신검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
구조 원본 ui-camera-label 구조 원본 ui-tool-handoff 최신검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
구조 원본 ui-zoom 최신검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
원고 overview 최신검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
원고 module-roles 최신검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
원고 runtime-flow 최신검토 2026-10-19 @ 14ca1ae2 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review
원고 constraints 최신검토 2026-10-19 @ b0648a05 · codex-user-authorized-depth-review검토 2026-10-19 @ 2fb9f2aa · codex-user-authorized-portrait-review

표의 최신은 기록된 근거와 원고가 검토 이후 바뀌지 않았다는 뜻입니다. 모든 기기에서 동작을 검증했다는 뜻은 아닙니다.

diff --git a/docs/live.html b/docs/live.html index 3cb4d5f2..58769dcf 100644 --- a/docs/live.html +++ b/docs/live.html @@ -34,6 +34,7 @@

Set. Capture. Inspect.

같은 장면도, 촬영 조건을

Photo로 한 장을 찍고, Video로 움직임을 담아 보세요. 처음에는 기본값이면 충분합니다.

  • 촬영 · 사진·연사·AEB·동영상을 촬영합니다.
  • +
  • Portrait · Depth 메뉴에서 제조사 Bokeh 사진을 선택합니다.
  • 수동 설정 · ISO·노출 시간·초점을 고정합니다.
  • 스트림 설정 · 출력 크기·FPS·포맷을 바꿉니다.
  • PIP · Multi · 보조 화면을 합성하거나 여러 카메라로 촬영합니다.
  • @@ -48,11 +49,23 @@

    Live에서 촬영하세요

    기본 사진은 카메라가 만든 JPEG 한 장입니다. DCIM/HALCamera에 저장하며, 촬영 메타데이터 JSON도 남깁니다.

    JPEG 목록에서 YUV를 고르면 앱이 변환한 JPEG를 저장합니다. Camera2에서 RAW를 켜면 DNG도 저장합니다.

    모드나 엔진을 바꾸면 새 촬영으로 시작합니다. PIP·스트림·줌·촬영 제어는 초기화됩니다. Callback의 고정 시간은 사용자 설정으로 유지합니다.

    +

    제조사 Portrait로 배경을 흐리세요

    +
      +
    1. Lab → Probe에서 카메라별 Portrait · Manufacturer Bokeh 지원 여부와 전용 미리보기·JPEG 해상도를 확인합니다.
    2. +
    3. Live의 Depth → Portrait (Bokeh)를 선택합니다.
    4. +
    5. JPEG 해상도를 고릅니다. 각 항목에 함께 구성할 미리보기 해상도를 표시합니다.
    6. +
    7. 미리보기가 준비되면 가운데 셔터로 촬영하고, 저장 완료 뒤 갤러리에서 JPEG를 확인합니다.
    8. +
    9. 일반 촬영으로 돌아가려면 Photo나 Video를 누릅니다. Depth → Off로도 Photo로 돌아갑니다.
    10. +
    +

    Portrait는 제조사가 처리한 컬러 미리보기와 JPEG를 받는 촬영 모드입니다. Depth 메뉴에서 선택하지만 센서 Depth 맵을 받는 기능은 아닙니다. DEPTH_OUTPUT이 없는 카메라도 Bokeh 확장을 제공할 수 있습니다. 이 앱의 제조사 Portrait는 Android 12 / API 31 이상에서 Camera2 확장 세션을 사용합니다.

    +

    선택하면 기존 카메라를 닫고 표시한 해상도로 세션을 엽니다. 나열된 크기라도 조합에 따라 제조사가 거절할 수 있으며, 다른 크기로 자동 대체하지 않습니다. 세션 구성 후 첫 미리보기 프레임은 15초, 촬영 요청 후 JPEG 수신은 60초까지 기다리고 실패 이유를 표시합니다. 실패 뒤에는 Depth 메뉴에서 해상도를 다시 고르거나 Photo로 돌아가세요.

    +

    Portrait에서는 동영상·RAW·YUV 사진·연사·AEB·PIP·줌·터치 측광·수동 제어를 제공하지 않습니다. 배경 흐림의 모양과 강도는 제조사가 정합니다. JPEG와 manufacturer_bokeh 촬영 메타데이터는 일반 사진과 같은 저장 경로에 남고 Benchmark JSON이나 진단 ZIP에 이미지 픽셀을 넣지 않습니다.

    +

    같은 모드로 Lab에서 돌아오거나 앱을 다시 표시하면 Portrait 해상도를 유지합니다. 카메라·엔진을 바꾸거나 일반 Live Streams 설정을 적용하면 Portrait를 종료합니다. 크기 표시는 일반 Live Streams 대신 Depth 선택 메뉴를 엽니다. 새 CLI 촬영 요청은 일반 Photo·Video 구성을 사용하며 Portrait를 이어받지 않습니다.

    Depth 맵을 보세요

    1. Lab → Probe에서 카메라의 Depth 섹션을 확인합니다.
    2. Live로 돌아와 카메라를 선택합니다.
    3. -
    4. 하단의 Depth를 누르고 DEPTH16 해상도를 선택합니다. 지원하지 않거나 정보를 읽지 못한 카메라는 이유를 표시합니다.
    5. +
    6. 하단의 Depth → Depth Map에서 DEPTH16 해상도를 선택합니다. 지원하지 않거나 정보를 읽지 못한 카메라는 Depth 메뉴에 이유를 표시합니다.
    7. 컬러 화면으로 돌아가려면 Photo 또는 Video를 누릅니다. Depth → Off로도 Photo로 돌아갈 수 있습니다.

    Depth는 Camera2의 깊이 맵만 표시하는 보기 모드입니다. 선택하면 기존 카메라를 닫은 뒤 Depth 전용 세션을 엽니다. 컬러와 Depth를 같은 요청에서 받을 수 없는 기기에서도 사용할 수 있으며, 컬러와 정렬된 합성 화면은 제공하지 않습니다. 사진·동영상 저장, 줌·터치 측광·수동 제어와 PIP는 사용할 수 없습니다.

    diff --git a/docs/probe.html b/docs/probe.html index cb34f37c..e8ddf7b2 100644 --- a/docs/probe.html +++ b/docs/probe.html @@ -49,10 +49,11 @@

    앱에서 Probe를 여세요

  • 섹션: 제목을 눌러 접거나 펼칩니다. 출력 형식별 크기는 STREAMS에서 확인합니다.
  • DEPTH: DEPTH_OUTPUT 지원 여부와 DEPTH16 해상도, 컬러와 Depth를 같은 요청에 포함할 수 있는지를 확인합니다. Allowed by HAL은 기기의 선언이며 특정 출력 조합의 동작을 보장하지 않습니다. Unknown은 해당 정보를 읽지 못한 상태입니다. 단독으로 열 수 없는 물리 카메라는 LIVE에서 직접 선택할 수 없습니다.
  • 필터: 단어가 들어간 줄을 찾습니다. 결과를 누르면 해당 항목으로 이동합니다.
  • +
  • PORTRAIT · MANUFACTURER BOKEH: 제조사 Bokeh 지원 여부와 확장 전용 미리보기·JPEG 해상도를 확인합니다. 일반 STREAMS 크기와 구분하며, 크기 조합의 성공 여부는 실제 촬영으로 확인해야 합니다. Android 12 미만이나 단독 선택할 수 없는 물리 카메라는 이유를 표시합니다. Bokeh 지원은 Depth 맵 공개를 뜻하지 않습니다.
  • REQUEST · RESULT KEYS / SESSION KEYS: 요청·결과에서 지원하는 key 이름입니다. 실제 촬영값은 아닙니다.
-섹션 이름과 API별 표시 조건

IDENTITY, CAPABILITIES, DEPTH, SENSOR, LENS, CONTROL, PROCESSING, REQUEST 뒤에 REQUEST · RESULT KEYS가 나옵니다.

+섹션 이름과 API별 표시 조건

IDENTITY, CAPABILITIES, DEPTH, PORTRAIT · MANUFACTURER BOKEH, SENSOR, LENS, CONTROL, PROCESSING, REQUEST 뒤에 REQUEST · RESULT KEYS가 나옵니다.

SESSION KEYS는 API 28 이상, MANDATORY STREAM COMBINATIONS는 API 29 이상에서 표시합니다.

STREAMS는 PRIVATE·JPEG 같은 출력 형식별로 나뉩니다. 이어서 HIGH SPEED VIDEO, REPROCESSING INPUTS, ALL CHARACTERISTICS가 나옵니다.

enum 값은 가능한 경우 숫자 대신 상수 이름을 표시합니다.

diff --git a/docs/validation/portrait-20261020/README.md b/docs/validation/portrait-20261020/README.md index a27fd0cd..e29281e8 100644 --- a/docs/validation/portrait-20261020/README.md +++ b/docs/validation/portrait-20261020/README.md @@ -39,6 +39,8 @@ PROBE 요청 `dd81ce3e-9c78-4537-a7f6-f8034c9a06b7`는 오류 없이 완료됐 앱 JVM 테스트 911개, `lintDebug`(오류·경고 없음), `assembleDebug`, `assembleDebugAndroidTest`가 통과했습니다. 문서 회귀 검사 37개가 통과했습니다. +코드와 원고를 대조한 뒤 최신성 15개 항목의 검토 기록을 `codex-user-authorized-portrait-review`로 갱신했습니다. 기존 최신 항목의 검토자는 유지했습니다. `docflow check --build` 6단계에서 최신성·coverage·생성 일치·사이트 빌드를 통과했습니다. + 지원 선언과 Unknown·읽기 오류 구분, 확장 전용 크기 선택, close(done) 순서, 늦은 JPEG 차단, 한 번뿐인 촬영 완료, 실패 후 Photo 복귀, 저장 중 전환 방지, CLI 초기화, 일반 Live Streams 및 Benchmark 경계를 코드에 대조했습니다. 문서에는 Depth 메뉴 진입 경로, 확장 전용 JPEG 저장과 제어 제한, 수명주기·데이터 흐름을 반영했습니다. 이 기록은 사용자 요청에 따른 Codex의 코드 대조이며 별도 사람의 독립 리뷰를 뜻하지 않습니다. 사용 방법은 [Live 가이드](../../../guide/live.md#제조사-portrait로-배경을-흐리세요)를 참고하세요. diff --git a/guide/_reference/engine.md b/guide/_reference/engine.md index ea334c84..41137a14 100644 --- a/guide/_reference/engine.md +++ b/guide/_reference/engine.md @@ -24,6 +24,7 @@ nav_order: 5 | 항목 | Camera2 | CameraX | | --- | --- | --- | | Depth 보기 | DEPTH_OUTPUT과 DEPTH16 해상도를 공개한 카메라에서 별도 Depth 전용 세션을 엽니다. 맵 표시만 제공합니다. | Depth 해상도를 선택하면 Camera2로 전환합니다. | +| 제조사 Portrait | API 31 이상의 BOKEH 확장 세션으로 전용 미리보기와 JPEG를 받습니다. Depth 메뉴에서 선택하며 수동 제어·RAW·PIP·영상은 제공하지 않습니다. | Portrait를 선택하면 Camera2로 전환합니다. | | 수동 촬영 | ISO·노출 시간·초점과 WB를 프리뷰·사진·녹화에 적용합니다. 지원 여부와 실제 적용값을 표시합니다. | Manual 버튼을 미지원 상태로 비활성화합니다. | | YUV를 JPEG로 선택 | 요청한 YUV 이미지와 최종 CaptureResult의 센서 시각을 맞춥니다. | 촬영 뒤 받은 analysis 프레임 하나를 변환합니다. | | JPEG 출처 | YUV 앱 변환 또는 HAL JPEG 중 하나와 촬영 JSON을 저장합니다. | YUV 앱 변환 또는 ImageCapture JPEG 중 하나와 촬영 JSON을 저장합니다. | @@ -58,9 +59,9 @@ PIP와 Multi는 Android 11 이상에서 제공합니다. 저장물과 설정 방
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/Camera2StillCapture.kt`, `app/src/main/java/dev/halcamera/camera/Camera2LiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeterRequests.kt`, `app/src/main/java/dev/halcamera/camera/CameraXEngine.kt`, `app/src/main/java/dev/halcamera/camera/CameraXPipSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXStillCapture.kt`, `app/src/main/java/dev/halcamera/camera/CameraXLiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/CameraXControls.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/LivePipSession.kt`, `app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/Camera2StillCapture.kt`, `app/src/main/java/dev/halcamera/camera/Camera2LiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeterRequests.kt`, `app/src/main/java/dev/halcamera/camera/CameraXEngine.kt`, `app/src/main/java/dev/halcamera/camera/CameraXPipSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXStillCapture.kt`, `app/src/main/java/dev/halcamera/camera/CameraXLiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/CameraXControls.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/LivePipSession.kt`, `app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -214,12 +215,14 @@ Live 제어와 터치 측광은 다음 이벤트를 추가로 남깁니다. 사진 결과는 Camera2의 요청 태그와 CameraX의 `captureIntent`로 제외합니다. 설정 화면은 구성 실패 오류만 표시하며 이전 세션 결과 목록을 제공하지 않습니다. +제조사 Portrait는 별도 `CameraExtensionSession`을 사용합니다. 일반 `CaptureResult` 지표와 EIS 대조를 표시하지 않으며 수동 제어·줌·측광도 제공하지 않습니다. Depth 메뉴에서 선택하지만 출력은 OEM 컬러 미리보기와 JPEG이며, 센서 Depth 맵과 구분합니다. +
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/CameraXEngine.kt`, `app/src/main/java/dev/halcamera/camera/DepthCameraEngine.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/ui/LiveControlBar.kt`, `app/src/main/java/dev/halcamera/ui/FocusRing.kt`, `app/src/main/java/dev/halcamera/camera/LiveControls.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/StartCardPresenter.kt`, `app/src/main/java/dev/halcamera/cli/LiveController.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/CameraXEngine.kt`, `app/src/main/java/dev/halcamera/camera/DepthCameraEngine.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/ui/LiveControlBar.kt`, `app/src/main/java/dev/halcamera/ui/FocusRing.kt`, `app/src/main/java/dev/halcamera/camera/LiveControls.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/StartCardPresenter.kt`, `app/src/main/java/dev/halcamera/cli/LiveController.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -265,6 +268,8 @@ Camera2 Live의 프리뷰·사진·녹화·녹화 중 사진 요청은 기존 색온도를 추정하지 않습니다. +제조사 Portrait는 일반 Camera2Engine의 스트림에 섞지 않습니다. API 31 이상에서 PortraitCameraEngine이 BOKEH 확장 전용 미리보기·JPEG 크기를 재검사하고 CameraExtensionSession을 엽니다. JPEG는 MediaLibrary로 저장하며, 미리보기 15초·JPEG 60초 시간 제한과 CameraDevice.onClosed 이후 close(done) 완료 순서를 적용합니다. +
### 손떨림 보정 @@ -601,9 +606,9 @@ Camera2에서 짧게 터치한 경우입니다. 긴 누르기는 별도의 AE
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/LivePipSession.kt`, `app/src/main/java/dev/halcamera/camera/PipSessionQuery.kt`, `app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt`, `app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt`, `app/src/main/java/dev/halcamera/camera/LiveStreamSettings.kt`, `app/src/main/java/dev/halcamera/camera/LiveStabilization.kt`, `app/src/main/java/dev/halcamera/camera/LiveStreamCapabilities.kt`, `app/src/main/java/dev/halcamera/camera/LiveSessionCheck.kt`, `app/src/main/java/dev/halcamera/camera/Camera2StillCapture.kt`, `app/src/main/java/dev/halcamera/camera/Camera2LiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/Camera2VideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/VideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt`, `app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt`, `app/src/main/java/dev/halcamera/camera/RecordingBufferRelay.kt`, `app/src/main/java/dev/halcamera/camera/StreamConfiguration.kt`, `app/src/main/java/dev/halcamera/camera/StillPair.kt`, `app/src/main/java/dev/halcamera/camera/YuvPacking.kt`, `app/src/main/java/dev/halcamera/camera/RawFrame.kt`, `app/src/main/java/dev/halcamera/camera/DngOutput.kt`, `app/src/main/java/dev/halcamera/camera/StillEncoding.kt`, `app/src/main/java/dev/halcamera/camera/MediaLibrary.kt`, `app/src/main/java/dev/halcamera/camera/LiveControls.kt`, `app/src/main/java/dev/halcamera/camera/LiveControlRequests.kt`, `app/src/main/java/dev/halcamera/camera/ManualControls.kt`, `app/src/main/java/dev/halcamera/camera/ManualControlRequests.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeter.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeterRequests.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/LivePipSession.kt`, `app/src/main/java/dev/halcamera/camera/PipSessionQuery.kt`, `app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt`, `app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt`, `app/src/main/java/dev/halcamera/camera/LiveStreamSettings.kt`, `app/src/main/java/dev/halcamera/camera/LiveStabilization.kt`, `app/src/main/java/dev/halcamera/camera/LiveStreamCapabilities.kt`, `app/src/main/java/dev/halcamera/camera/LiveSessionCheck.kt`, `app/src/main/java/dev/halcamera/camera/Camera2StillCapture.kt`, `app/src/main/java/dev/halcamera/camera/Camera2LiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/Camera2VideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/VideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt`, `app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt`, `app/src/main/java/dev/halcamera/camera/RecordingBufferRelay.kt`, `app/src/main/java/dev/halcamera/camera/StreamConfiguration.kt`, `app/src/main/java/dev/halcamera/camera/StillPair.kt`, `app/src/main/java/dev/halcamera/camera/YuvPacking.kt`, `app/src/main/java/dev/halcamera/camera/RawFrame.kt`, `app/src/main/java/dev/halcamera/camera/DngOutput.kt`, `app/src/main/java/dev/halcamera/camera/StillEncoding.kt`, `app/src/main/java/dev/halcamera/camera/MediaLibrary.kt`, `app/src/main/java/dev/halcamera/camera/LiveControls.kt`, `app/src/main/java/dev/halcamera/camera/LiveControlRequests.kt`, `app/src/main/java/dev/halcamera/camera/ManualControls.kt`, `app/src/main/java/dev/halcamera/camera/ManualControlRequests.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeter.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeterRequests.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -822,7 +827,7 @@ AE 재잠금은 Camera2와 같은 [AeRelock 상태도](#노출은-언제-다시- - 근거 파일: `app/src/main/java/dev/halcamera/camera/CameraXEngine.kt`, `app/src/main/java/dev/halcamera/camera/CameraXPipSession.kt`, `app/src/main/java/dev/halcamera/camera/PipSessionQuery.kt`, `app/src/main/java/dev/halcamera/camera/CameraXStillCapture.kt`, `app/src/main/java/dev/halcamera/camera/CameraXLiveRecorder.kt`, `app/src/main/java/dev/halcamera/camera/CameraXVideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/VideoSnapshot.kt`, `app/src/main/java/dev/halcamera/camera/CameraXControls.kt`, `app/src/main/java/dev/halcamera/camera/StillEncoding.kt`, `app/src/main/java/dev/halcamera/camera/YuvPacking.kt`, `app/src/main/java/dev/halcamera/camera/MediaLibrary.kt`, `app/src/main/java/dev/halcamera/camera/StreamConfiguration.kt`, `app/src/main/java/dev/halcamera/camera/LiveControls.kt`, `app/src/main/java/dev/halcamera/camera/TouchMeter.kt`, `app/build.gradle.kts` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review @@ -842,11 +847,11 @@ AE 재잠금은 Camera2와 같은 [AeRelock 상태도](#노출은-언제-다시- | 항목 | 최신성 | 검토 | | --- | --- | --- | -| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `contract` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `camera2` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `camerax` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `comparison` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | +| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `contract` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `camera2` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `camerax` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `comparison` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | diff --git a/guide/_reference/evidence.md b/guide/_reference/evidence.md index 8c5f7f9b..4ee9868d 100644 --- a/guide/_reference/evidence.md +++ b/guide/_reference/evidence.md @@ -80,7 +80,7 @@ Galaxy S25+·Android 16에서 2026년 9월 17~19일, versionCode 106~108로 수 - 근거 파일: `app/src/main/java/dev/halcamera/camera/CameraXControls.kt`, `app/src/main/java/dev/halcamera/camera/CameraXStillCapture.kt`, `app/src/main/java/dev/halcamera/camera/CameraXLiveRecorder.kt` - 기기 검증: `V-002` - 근거 수준: 기기 검증 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review @@ -98,8 +98,8 @@ Galaxy S25+·Android 16에서 2026년 9월 17~19일, versionCode 106~108로 수 | 항목 | 최신성 | 검토 | | --- | --- | --- | -| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `device-notes` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | +| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `device-notes` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | diff --git a/guide/_reference/troubleshooting.md b/guide/_reference/troubleshooting.md index 0cb500ca..c5ffd7f7 100644 --- a/guide/_reference/troubleshooting.md +++ b/guide/_reference/troubleshooting.md @@ -140,7 +140,7 @@ PC의 대기 시간이 끝나도 앱 작업은 계속될 수 있습니다. 요 - 근거 파일: `app/src/main/java/dev/halcamera/cli/CommandStore.kt`, `tools/halcam/halcam/cli.py`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/CameraXStillCapture.kt`, `app/src/main/java/dev/halcamera/camera/Camera2Engine.kt`, `app/src/main/java/dev/halcamera/camera/ManualControlRequests.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/metrics/MetricExtractor.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review @@ -172,9 +172,9 @@ PC의 대기 시간이 끝나도 앱 작업은 계속될 수 있습니다. 요 | 항목 | 최신성 | 검토 | | --- | --- | --- | -| 구조 원본 `data-flow` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 구조 원본 `state-transitions` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 원고 `layer-isolation` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | +| 구조 원본 `data-flow` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 구조 원본 `state-transitions` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `layer-isolation` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | diff --git a/guide/architecture.md b/guide/architecture.md index 2154b888..02e190ae 100644 --- a/guide/architecture.md +++ b/guide/architecture.md @@ -32,7 +32,7 @@ nav_order: 4 | 화면 | 할 수 있는 일 | | --- | --- | -| Live · `MainActivity` | 앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며 지원 카메라의 Depth 맵을 봅니다. | +| Live · `MainActivity` | 앱을 열면 나오는 화면입니다. 프리뷰를 보고 사진·동영상을 촬영하며, 지원 카메라의 제조사 Portrait와 Depth 맵을 선택합니다. | | Multi · `ConcurrentCameraActivity` | 독립 카메라 장치별 사진·영상을 제공합니다. Live의 Multi · P와 Multi · V에서 엽니다. | | Lab · `WorkbenchActivity` | 기기 정보, 검사 도구, 저장된 결과와 설정을 엽니다. | | Benchmark · `BenchmarkActivity` | 정해진 조건(profile)으로 측정하고 결과를 저장합니다. | @@ -57,7 +57,7 @@ PC에서 같은 기능을 실행하려면 [CLI](cli.md)를 사용합니다. `Cli - 근거 파일: `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `tools/halcam/halcam/cli.py`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt`, `app/src/main/java/dev/halcamera/WorkbenchActivity.kt`, `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review @@ -136,6 +136,7 @@ flowchart TB camera/ - 엔진 계약, Camera2·CameraX 구현, 엔드포인트 열거를 제공합니다. `DepthCameraEngine`은 컬러 출력 없이 DEPTH16 맵만 받으며 `DepthFrame`이 순수 Kotlin으로 표시용 표본을 만듭니다. +- `PortraitCameraEngine`은 LIVE의 제조사 BOKEH 전용 세션입니다. MainPortraitBridge가 JPEG 크기를 선택하고 MainDepthBridge가 Depth Map과 Portrait의 진입점을 구분합니다. 이 경로는 벤치마크를 실행하거나 센서 Depth 맵을 저장하지 않습니다. - `close(done)` 완료 전에 다음 카메라를 열지 않습니다. - 엔진 계약(`MediaCapture`, `LiveTuning`, `TouchMetering`)과 두 엔진의 구현, 두 엔진의 차이는 [Engine Comparison](engine.md)에 있습니다. - 벤치마크 RECORD 단계의 recorder 상태 기계는 `BenchmarkRecorder`가 담당하고 `Camera2Engine`은 그 호출을 위임합니다. @@ -250,9 +251,9 @@ Camera2의 RAW (DNG)는 `RawFrame`이 RAW 샘플을 복사하고 `DngOutput`이
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/SplitDragGesture.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `app/src/main/java/dev/halcamera/cli/LiveController.kt`, `app/src/main/java/dev/halcamera/cli/BenchmarkController.kt`, `app/src/main/java/dev/halcamera/cli/CliLibrary.kt`, `app/src/main/java/dev/halcamera/MainCliBridge.kt`, `app/src/main/java/dev/halcamera/DualCliBridge.kt`, `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/EnvironmentProbe.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunIndex.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkCsv.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt`, `app/src/main/java/dev/halcamera/ui/RecentMediaButton.kt`, `app/src/main/java/dev/halcamera/ui/Look.kt`, `app/src/main/java/dev/halcamera/cts/recording/BasicRecordingRules.kt`, `app/src/main/java/dev/halcamera/cts/CtsEntryActivity.kt`, `app/src/main/java/dev/halcamera/cts/vendored/VendoredCaseActivity.kt`, `app/src/main/java/dev/halcamera/cts/vendored/VendoredCtsListActivity.kt`, `app/src/main/java/dev/halcamera/cts/CtsCaseActivity.kt`, `app/src/main/java/dev/halcamera/cts/CtsCaseListActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/CtsChecklistActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/CtsSuiteRunActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/SuitePlan.kt`, `app/src/main/java/dev/halcamera/cts/suite/SuiteReport.kt`, `app/src/main/java/dev/halcamera/cts/CtsCatalog.kt`, `app/src/main/java/dev/halcamera/cts/CtsRunner.kt`, `app/src/main/java/dev/halcamera/cts/CameraCaseRunner.kt`, `app/src/main/java/dev/halcamera/cts/Camera2Ops.kt`, `app/src/main/java/dev/halcamera/cts/onoff/FastOnOffRules.kt`, `app/src/main/java/dev/halcamera/cts/switching/SwitchingRules.kt`, `app/src/main/java/dev/halcamera/cts/sizes/AllSizeOnOffRules.kt`, `app/src/main/java/dev/halcamera/cts/combination/StillPreviewCombinationRules.kt`, `app/src/main/java/dev/halcamera/cts/snapshot/VideoSnapshotRules.kt`, `app/src/main/java/dev/halcamera/CameraProbeActivity.kt`, `app/src/main/java/dev/halcamera/camera/CameraProbe.kt`, `app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/SplitDragGesture.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `app/src/main/java/dev/halcamera/cli/LiveController.kt`, `app/src/main/java/dev/halcamera/cli/BenchmarkController.kt`, `app/src/main/java/dev/halcamera/cli/CliLibrary.kt`, `app/src/main/java/dev/halcamera/MainCliBridge.kt`, `app/src/main/java/dev/halcamera/DualCliBridge.kt`, `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/BenchmarkRecorder.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/EnvironmentProbe.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunIndex.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkCsv.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/ConcurrentCameraActivity.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt`, `app/src/main/java/dev/halcamera/ui/RecentMediaButton.kt`, `app/src/main/java/dev/halcamera/ui/Look.kt`, `app/src/main/java/dev/halcamera/cts/recording/BasicRecordingRules.kt`, `app/src/main/java/dev/halcamera/cts/CtsEntryActivity.kt`, `app/src/main/java/dev/halcamera/cts/vendored/VendoredCaseActivity.kt`, `app/src/main/java/dev/halcamera/cts/vendored/VendoredCtsListActivity.kt`, `app/src/main/java/dev/halcamera/cts/CtsCaseActivity.kt`, `app/src/main/java/dev/halcamera/cts/CtsCaseListActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/CtsChecklistActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/CtsSuiteRunActivity.kt`, `app/src/main/java/dev/halcamera/cts/suite/SuitePlan.kt`, `app/src/main/java/dev/halcamera/cts/suite/SuiteReport.kt`, `app/src/main/java/dev/halcamera/cts/CtsCatalog.kt`, `app/src/main/java/dev/halcamera/cts/CtsRunner.kt`, `app/src/main/java/dev/halcamera/cts/CameraCaseRunner.kt`, `app/src/main/java/dev/halcamera/cts/Camera2Ops.kt`, `app/src/main/java/dev/halcamera/cts/onoff/FastOnOffRules.kt`, `app/src/main/java/dev/halcamera/cts/switching/SwitchingRules.kt`, `app/src/main/java/dev/halcamera/cts/sizes/AllSizeOnOffRules.kt`, `app/src/main/java/dev/halcamera/cts/combination/StillPreviewCombinationRules.kt`, `app/src/main/java/dev/halcamera/cts/snapshot/VideoSnapshotRules.kt`, `app/src/main/java/dev/halcamera/CameraProbeActivity.kt`, `app/src/main/java/dev/halcamera/camera/CameraProbe.kt`, `app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -292,6 +293,8 @@ Live 셔터 조작은 `MainActivity`에서 선택한 엔진의 촬영·녹화 Live의 Depth 보기는 `DepthCameraEngine → ImageReader → DepthFrame → DepthMapView`로 연결합니다. 컬러 촬영과 분리된 보기이며, Telemetry에는 버퍼의 시각·크기·형식과 capture 콜백만 기록합니다. 맵 픽셀을 벤치마크나 incident ZIP의 입력으로 전달하지 않습니다. 사용 순서는 [Depth 맵 보기](live.md#depth-맵을-보세요)에 있습니다. +같은 Depth 메뉴의 Portrait는 `PortraitCameraEngine → CameraExtensionSession → JPEG ImageReader → MediaLibrary`로 연결합니다. 제조사 Bokeh가 적용된 컬러 사진을 저장하며 별도의 센서 Depth 맵을 받지 않습니다. 확장 처리 이벤트는 일반 Camera2 프레임 지표와 구분하고, 사진 픽셀은 측정 파일에 넣지 않습니다. + 벤치마크는 별도 화면인 `BenchmarkActivity`가 준비를 마친 뒤 `BenchmarkRunner.start()`를 호출하여 시작합니다. `Telemetry.callback(...)`이 반환한 Camera2 콜백의 `onCaptureStarted`는 프레임워크 신호를 기록하며, Live 셔터와 벤치마크 시작을 연결하는 메서드가 아닙니다. @@ -471,9 +474,9 @@ CliLaunchActivity는 Dual·Multi에서 Live로 돌아갈 때 CliNavigationHost
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/cli/CliProvider.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `tools/halcam/halcam/cli.py`, `tools/halcam/halcam/download.py`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/GalleryActivity.kt`, `app/src/main/java/dev/halcamera/camera/MediaLibrary.kt`, `app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/metrics/MetricExtractor.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunRetention.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/LaunchDiagnostics.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/cli/CliProvider.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `tools/halcam/halcam/cli.py`, `tools/halcam/halcam/download.py`, `app/src/main/java/dev/halcamera/MainActivity.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/GalleryActivity.kt`, `app/src/main/java/dev/halcamera/camera/MediaLibrary.kt`, `app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt`, `app/src/main/java/dev/halcamera/telemetry/Telemetry.kt`, `app/src/main/java/dev/halcamera/telemetry/FlightRecorder.kt`, `app/src/main/java/dev/halcamera/metrics/MetricExtractor.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunAssembler.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunRetention.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt`, `app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/LaunchDiagnostics.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RegressionDetector.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -643,7 +646,7 @@ sequenceDiagram Live 프리뷰에서 두 손가락을 벌리거나 모으면 지원 범위 안에서 연속으로 줌을 바꿉니다. 가장 가까운 프리셋의 원에 현재 배율을 소수 첫째 자리까지 표시하며, 펼친 상태에서 그 원을 누르면 해당 프리셋 배율로 돌아갑니다. 화면의 카메라 선택 정보를 갱신해도 중간 배율은 유지합니다. -핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. +핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기·제조사 Portrait, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다. | 조건 | 동작 | | --- | --- | @@ -687,6 +690,8 @@ Photo·Video 프리뷰와 녹화 중에 두 손가락을 벌리거나 모아 연 Depth 보기는 컬러와 Depth를 같은 요청에 포함하지 않는 별도 Camera2 세션입니다. HAL의 동시 요청 허용 선언은 특정 출력 조합의 성공을 보장하지 않습니다. `DepthCameraEngine`은 촬영·녹화·수동 제어·줌·터치 측광을 제공하지 않으며 CLI 제어 변경도 거절합니다. Photo·Video 또는 CLI 촬영 준비로 전환하면 Depth를 해제합니다. +제조사 Portrait도 일반 촬영과 별도의 확장 세션을 사용합니다. Bokeh 확장 전용 해상도로 컬러 미리보기와 JPEG만 요청하며, 세션이 거절되면 다른 크기로 자동 대체하지 않습니다. 단일 촬영의 JPEG를 받기 전에 실패하거나 종료되면 세션을 해제하여 늦은 이미지를 다음 촬영에 연결하지 않습니다. 이미 받은 JPEG의 저장 작업은 종료 후에도 마칠 수 있습니다. + Multi 모드의 `MultiSession`은 `CameraEngine`과 별도입니다. Camera2는 선택한 독립 장치를 연 뒤 세션을 구성하며, CameraX는 광고된 동시 조합을 바인딩합니다. 모든 장치의 종료 통지를 확인해야 출력을 해제하고 다음 동시 세션을 열 수 있습니다. 한 명령의 여러 사진을 센서 동기 촬영으로 해석하지 않습니다. @@ -744,9 +749,9 @@ Live 카메라 종료 후 벤치마크 화면으로 이동하고 기존 측정·
근거와 검토 정보 -- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/MicrophoneCapture.kt`, `app/src/main/java/dev/halcamera/camera/TimestampedVideoRecording.kt`, `app/src/main/java/dev/halcamera/camera/DeviceCompositor.kt`, `app/src/main/java/dev/halcamera/cli/CliProvider.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `app/src/main/java/dev/halcamera/cli/CommandStore.kt`, `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraEndpointResolver.kt`, `app/src/main/java/dev/halcamera/telemetry/IncidentExporter.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RegressionRules.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkStore.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkIndex.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/AtomicFiles.kt` +- 근거 파일: `app/src/main/java/dev/halcamera/camera/MultiSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraXMultiSession.kt`, `app/src/main/java/dev/halcamera/camera/MultiRecording.kt`, `app/src/main/java/dev/halcamera/camera/MicrophoneCapture.kt`, `app/src/main/java/dev/halcamera/camera/TimestampedVideoRecording.kt`, `app/src/main/java/dev/halcamera/camera/DeviceCompositor.kt`, `app/src/main/java/dev/halcamera/cli/CliProvider.kt`, `app/src/main/java/dev/halcamera/cli/CommandCoordinator.kt`, `app/src/main/java/dev/halcamera/cli/CommandStore.kt`, `app/src/main/java/dev/halcamera/camera/CameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt`, `app/src/main/java/dev/halcamera/camera/ConcurrentSession.kt`, `app/src/main/java/dev/halcamera/camera/CameraEndpointResolver.kt`, `app/src/main/java/dev/halcamera/telemetry/IncidentExporter.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkRunner.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/RegressionRules.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkReport.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkReportCodec.kt`, `app/src/main/java/dev/halcamera/benchmark/platform/BenchmarkStore.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkIndex.kt`, `app/src/main/java/dev/halcamera/benchmark/domain/AtomicFiles.kt` - 근거 수준: 코드 확인 -- 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review +- 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review
@@ -798,16 +803,16 @@ Android 의존성이 없는 러너와 평가 로직은 JVM 단위 테스트로 | 항목 | 최신성 | 검토 | | --- | --- | --- | -| 구조 원본 `data-flow` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 구조 원본 `state-transitions` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | +| 구조 원본 `data-flow` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 구조 원본 `overall-architecture` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 구조 원본 `state-transitions` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | | 구조 원본 `ui-camera-label` | 최신 | 검토 2026-10-10 @ `93385443` · Codex (mode reset, labels and numeric ID selection review) | -| 구조 원본 `ui-tool-handoff` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 구조 원본 `ui-zoom` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 원고 `overview` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `module-roles` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | -| 원고 `runtime-flow` | 최신 | 검토 2026-10-19 @ `14ca1ae2` · codex-user-authorized-depth-review | -| 원고 `constraints` | 최신 | 검토 2026-10-19 @ `b0648a05` · codex-user-authorized-depth-review | +| 구조 원본 `ui-tool-handoff` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 구조 원본 `ui-zoom` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `overview` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `module-roles` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `runtime-flow` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | +| 원고 `constraints` | 최신 | 검토 2026-10-19 @ `2fb9f2aa` · codex-user-authorized-portrait-review | diff --git a/tools/docgen/state/evidence.json b/tools/docgen/state/evidence.json index 99b8e128..9a039687 100644 --- a/tools/docgen/state/evidence.json +++ b/tools/docgen/state/evidence.json @@ -3,14 +3,14 @@ "entries": { "omm:overall-architecture": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "0f722523cc241bb1", + "codeHash": "057f692f5c7ba25d", + "modelHash": "a911638bf6e3cbc2", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -20,9 +20,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -76,7 +78,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -150,6 +152,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -255,13 +260,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -288,17 +293,17 @@ }, "omm:data-flow": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "97b991ec49bfd746", - "modelHash": "9dbb60c0c18065a2", + "codeHash": "b415ef0c3c1996d6", + "modelHash": "7c9aaf4a651758f8", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", "app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt": "fc28cf52692a271225524bfa045dc2e232d0ba45", "app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt": "3ce60c16472f2ed3e100034c62feee32f13236d3", @@ -339,16 +344,18 @@ }, "omm:state-transitions": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "47bddf1bbf31016c", - "modelHash": "258630c74fc0a4f4", + "codeHash": "f98fe1d594f993e7", + "modelHash": "d4ee6d79890b29f2", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", "app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt": "fc28cf52692a271225524bfa045dc2e232d0ba45", "app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt": "3ce60c16472f2ed3e100034c62feee32f13236d3", @@ -358,6 +365,7 @@ "app/src/main/java/dev/halcamera/benchmark/domain/RunValidity.kt": "df32b7ff015c81cb44407884ea02deda965752df", "app/src/main/java/dev/halcamera/camera/Camera2Engine.kt": "a07b50648bd1812a3ae55e1b31494e963feb060c", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", "app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt": "c8ca57c719ca0df2bc002493a1568c3de1196390", "app/src/main/java/dev/halcamera/cli/BenchmarkController.kt": "1789489c62871f8bb25a4274e76c58c80414182f", "app/src/main/java/dev/halcamera/cli/CliCommand.kt": "590a408fec3e4c8fb08a9b0a3ca50efb2b10e609", @@ -383,14 +391,14 @@ }, "content:architecture.md/overview": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "19ab0340fcab873e", - "modelHash": "66bd16d22ce9ca3f", + "codeHash": "37a6ba8e14f48c93", + "modelHash": "c04a5640113b0575", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -400,9 +408,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -456,7 +466,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -530,6 +540,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -635,13 +648,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -671,17 +684,17 @@ }, "content:architecture.md/runtime-flow": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "1bbf79a32baf27f3", - "modelHash": "2f360beb8b83bf25", + "codeHash": "56197667ece1fbbb", + "modelHash": "4cdc084d8ed49bb6", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", "app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt": "fc28cf52692a271225524bfa045dc2e232d0ba45", "app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt": "3ce60c16472f2ed3e100034c62feee32f13236d3", @@ -703,6 +716,7 @@ "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", "app/src/main/java/dev/halcamera/camera/MediaLibrary.kt": "2fbb56c9e81761cea93f64109ec12497309cffe8", "app/src/main/java/dev/halcamera/camera/MediaTransaction.kt": "34f0121f9c418c8e49fb0326a99882ae6f447c94", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", "app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt": "c8ca57c719ca0df2bc002493a1568c3de1196390", "app/src/main/java/dev/halcamera/cli/BenchmarkController.kt": "1789489c62871f8bb25a4274e76c58c80414182f", "app/src/main/java/dev/halcamera/cli/CliArtifactRegistry.kt": "e01a37879d2b3638a95bcb2a54adf75ab4643ac8", @@ -723,11 +737,11 @@ }, "content:architecture.md/module-roles": { "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "8ffefe5ee952f837", + "codeHash": "057f692f5c7ba25d", + "modelHash": "9f3d1f8b2ae8dba5", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -737,9 +751,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -793,7 +809,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -867,6 +883,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -972,13 +991,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -1003,16 +1022,16 @@ } }, "observed": { - "state": "stale" + "state": "fresh" } }, "content:architecture.md/constraints": { "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "90c7c730cb5e8337", + "codeHash": "057f692f5c7ba25d", + "modelHash": "bdd9eb84b2f3c403", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -1022,9 +1041,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -1078,7 +1099,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -1152,6 +1173,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -1257,13 +1281,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -1288,7 +1312,7 @@ } }, "observed": { - "state": "stale" + "state": "fresh" } }, "omm:ui-camera-label": { @@ -1309,32 +1333,33 @@ }, "omm:ui-tool-handoff": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "5733479109e046e8", - "modelHash": "9d479f2b55b0b1b7", + "codeHash": "af533493626cd705", + "modelHash": "a27ff87e34cf0c58", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da" + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2" } } }, "omm:ui-zoom": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "0c74536c0bae608f", - "modelHash": "231d9c4ddb3622f9", + "codeHash": "9142002fc98a5ef3", + "modelHash": "b0bccaebbd551910", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", "app/src/main/java/dev/halcamera/ui/ExpandingZoomControl.kt": "e93a1cc7727b9200fa6aaf31d8210050a0b6acf9", "app/src/main/java/dev/halcamera/ui/FocusRing.kt": "e129ce223edde62c329a15b5662fa34f9f6a6918" } @@ -1342,14 +1367,14 @@ }, "content:_reference/engine.md/contract": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "a882f52b4155cd27", + "codeHash": "057f692f5c7ba25d", + "modelHash": "f6d90c9bafc4d997", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -1359,9 +1384,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -1415,7 +1442,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -1489,6 +1516,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -1594,13 +1624,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -1627,14 +1657,14 @@ }, "content:_reference/engine.md/camera2": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "a1c4cf8671b1c8c4", + "codeHash": "057f692f5c7ba25d", + "modelHash": "75f06da9844aed35", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -1644,9 +1674,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -1700,7 +1732,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -1774,6 +1806,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -1879,13 +1914,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -1912,14 +1947,14 @@ }, "content:_reference/engine.md/camerax": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "ab1f7e43500f5869", + "codeHash": "057f692f5c7ba25d", + "modelHash": "ccd050f4375de1c0", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -1929,9 +1964,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -1985,7 +2022,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -2059,6 +2096,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -2164,13 +2204,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -2197,14 +2237,14 @@ }, "content:_reference/engine.md/comparison": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "1ac54c16fae61b66", + "codeHash": "057f692f5c7ba25d", + "modelHash": "7b83fe41e96866ee", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -2214,9 +2254,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -2270,7 +2312,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -2344,6 +2386,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -2449,13 +2494,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b", @@ -2482,17 +2527,19 @@ }, "content:_reference/troubleshooting.md/layer-isolation": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "9edb9935832a8bbc", - "modelHash": "20708f2ee142c5a7", + "codeHash": "c7377f64a346f1ea", + "modelHash": "cbaa131e4b682933", "at": "2026-10-19", - "commit": "14ca1ae2", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", "app/src/main/java/dev/halcamera/benchmark/HistoryActivity.kt": "fc28cf52692a271225524bfa045dc2e232d0ba45", "app/src/main/java/dev/halcamera/benchmark/domain/BenchmarkEvaluator.kt": "3ce60c16472f2ed3e100034c62feee32f13236d3", @@ -2515,6 +2562,7 @@ "app/src/main/java/dev/halcamera/camera/ManualControlRequests.kt": "a3c9c783fc821e641b5b2096bd8fb53e7f00e695", "app/src/main/java/dev/halcamera/camera/MediaLibrary.kt": "2fbb56c9e81761cea93f64109ec12497309cffe8", "app/src/main/java/dev/halcamera/camera/MediaTransaction.kt": "34f0121f9c418c8e49fb0326a99882ae6f447c94", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", "app/src/main/java/dev/halcamera/camera/RecentMediaThumbnail.kt": "c8ca57c719ca0df2bc002493a1568c3de1196390", "app/src/main/java/dev/halcamera/cli/BenchmarkController.kt": "1789489c62871f8bb25a4274e76c58c80414182f", "app/src/main/java/dev/halcamera/cli/CliArtifactRegistry.kt": "e01a37879d2b3638a95bcb2a54adf75ab4643ac8", @@ -2544,14 +2592,14 @@ }, "content:_reference/evidence.md/device-notes": { "observed": { - "state": "stale" + "state": "fresh" }, "accepted": { - "codeHash": "c896f57e566251f5", - "modelHash": "ab3da8834574c341", + "codeHash": "057f692f5c7ba25d", + "modelHash": "5ce9361a6565a237", "at": "2026-10-19", - "commit": "b0648a05", - "reviewer": "codex-user-authorized-depth-review", + "commit": "2fb9f2aa", + "reviewer": "codex-user-authorized-portrait-review", "files": { "app/build.gradle.kts": "d66d0773b7c3040674518d8a9db04d40fd67ee57", "app/src/main/AndroidManifest.xml": "394f1ceb67558a1400f691c3eb3157f7be783960", @@ -2561,9 +2609,11 @@ "app/src/main/java/dev/halcamera/DualPreviewActivity.kt": "93bf6e4bb3e10601631adcf12824164a06dc990e", "app/src/main/java/dev/halcamera/GalleryActivity.kt": "d220302a8e9dd392cf1560e5b28dc5aa6378202f", "app/src/main/java/dev/halcamera/LiveStreamsActivity.kt": "71377b456162e55482645967b3d5b22260d91223", - "app/src/main/java/dev/halcamera/MainActivity.kt": "0fa42b6713f8b20632ec77a6b4afd57cf3f80ebb", - "app/src/main/java/dev/halcamera/MainCliBridge.kt": "fde7bf3ae0a6f1a451fa84718a37d90052efd6da", - "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1d8d7f6f32f0b2feaa59c279bb0d0a31481acf4b", + "app/src/main/java/dev/halcamera/MainActivity.kt": "4e4d7b9b7383b8b866db5942ff1e9de6b5dd0f8e", + "app/src/main/java/dev/halcamera/MainCameraPicker.kt": "875268d3943a2ede5659580905ba787a934fb1dc", + "app/src/main/java/dev/halcamera/MainCliBridge.kt": "f50d07599ff67f5718f285d7903197516ab0e5a2", + "app/src/main/java/dev/halcamera/MainDepthBridge.kt": "1ce3bb1f2264e8a7d8e920c9aea6b6f67db14825", + "app/src/main/java/dev/halcamera/MainPortraitBridge.kt": "d5a840effb2748fd3c1f027396eed92078886159", "app/src/main/java/dev/halcamera/MultiCliBridge.kt": "52a5825ca1ec9d495a6ab76f5738bb5e1d7a1004", "app/src/main/java/dev/halcamera/WorkbenchActivity.kt": "f9c6c4c5e045c737e5375f8c3c2ec283b6381891", "app/src/main/java/dev/halcamera/benchmark/BenchmarkActivity.kt": "2c93630441feea87cc093dd8aed8384cf45956f1", @@ -2617,7 +2667,7 @@ "app/src/main/java/dev/halcamera/camera/CameraEngine.kt": "7441e69d8ef8394db42448a69abd9fa688167c70", "app/src/main/java/dev/halcamera/camera/CameraOpenRetry.kt": "65d85b90a24ff613324cceb838f963028e1d5daa", "app/src/main/java/dev/halcamera/camera/CameraProbe.kt": "c7bc7ce608c811830e4a88e913e0593ad15b0528", - "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "5da08af7e2f1b94dc6bf09fd3f94f01fed86c7f9", + "app/src/main/java/dev/halcamera/camera/CameraProbeReader.kt": "621409ea83f6aa108f525c83a5b151a1ef58fe48", "app/src/main/java/dev/halcamera/camera/CameraReleaseWait.kt": "cd2fb3f441229ac0e4a4d4f09ce7b27de5e64d4e", "app/src/main/java/dev/halcamera/camera/CameraXControls.kt": "2bdcc32c326a7685cb34ac5a59f2665cce940fc8", "app/src/main/java/dev/halcamera/camera/CameraXEngine.kt": "c885e0bb38e481d45fda923dbea1d03e60a1a2b7", @@ -2691,6 +2741,9 @@ "app/src/main/java/dev/halcamera/camera/PipSource.kt": "ea1230c627c8eb59be2a2a96ff1de428b017b14d", "app/src/main/java/dev/halcamera/camera/PipStreamCapabilities.kt": "6fbe202969c6ff6d26f8a1d5e0299d2871aadd68", "app/src/main/java/dev/halcamera/camera/PipStreamSettings.kt": "873228820c0867a3d6ffd31dde1a353c26d8a771", + "app/src/main/java/dev/halcamera/camera/PortraitCameraEngine.kt": "487943447e62e1f101687a0ebc3967abb78a54a3", + "app/src/main/java/dev/halcamera/camera/PortraitCapabilities.kt": "7c843f4430f9292bada4f67932c436f9e465b53f", + "app/src/main/java/dev/halcamera/camera/PortraitSupport.kt": "d2b678ccdfd271d3e6051f71b8909f53c342da9d", "app/src/main/java/dev/halcamera/camera/PreviewBufferRelay.kt": "135eb236cdc8054d2d1ad89b703c7a6975eff44b", "app/src/main/java/dev/halcamera/camera/PreviewTransform.kt": "35ce0844884671a3848d6d87356cfb6635775c11", "app/src/main/java/dev/halcamera/camera/RawFrame.kt": "0809991e5c0aadc75e4cbfadfdf8257fc0a1e779", @@ -2796,13 +2849,13 @@ "app/src/main/java/dev/halcamera/ui/LabDialog.kt": "cecb9e63383748663a8650362588ecdef9024766", "app/src/main/java/dev/halcamera/ui/LiveChoiceSheet.kt": "08eee11b7e9f3b1f499697c27907fa1d77b2f95c", "app/src/main/java/dev/halcamera/ui/LiveControlBar.kt": "f10adc3e8ff30d0a7af97748468169e338144ba8", - "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "1ea58d787b35c1b1b21dcfcccc6e1b3272b6ca22", + "app/src/main/java/dev/halcamera/ui/LiveIndicator.kt": "218318c32d81fbdca64c39e2d71e1cda07aea2ba", "app/src/main/java/dev/halcamera/ui/LiveMeasurementText.kt": "f634eb1f4f342c29e823365255ad8263ff7ea1b5", "app/src/main/java/dev/halcamera/ui/LiveMeasurementView.kt": "3b0e5f244816f6844c08208adb738c42d00a5a06", "app/src/main/java/dev/halcamera/ui/LivePipController.kt": "7f706fae51c274c351cee16032a7d1b300563828", "app/src/main/java/dev/halcamera/ui/LiveReadings.kt": "5fb091d0da47c97dee10c62d79492b83c382bf3e", "app/src/main/java/dev/halcamera/ui/LiveReadout.kt": "3f599e31c9eecd3f48c7467632c1c948f02bbdfc", - "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "976ee52adcfec7b08dc0571ff9bdde7d36e1f72a", + "app/src/main/java/dev/halcamera/ui/LiveStreamReadout.kt": "96cebd17ced1dab82a4bf81a7f9843fc4ffded95", "app/src/main/java/dev/halcamera/ui/LiveStreamSettingsView.kt": "d47f8595645c0af61d3bc088c0b6f6773de6dd8d", "app/src/main/java/dev/halcamera/ui/Look.kt": "51326eb313529537407c10dae5e721eb153a9f53", "app/src/main/java/dev/halcamera/ui/ManualControlPanel.kt": "baa1572bd2a5db79b016d066a6d5b5d1105a326b",