From 1619752f78bd0038625e32c3f5717ed7655e68a7 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Fri, 31 May 2019 11:38:02 -0700 Subject: [PATCH 1/4] Rework image & texture management to use concurrent message queues. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch reworks image decompression and collection in the following ways because of misbehavior in the described edge cases. The current flow for realizing a texture on the GPU from a blob of compressed bytes is to first pass it to the IO thread for image decompression and then upload to the GPU. The handle to the texture on the GPU is then passed back to the UI thread so that it can be included in subsequent layer trees for rendering. The GPU contexts on the Render & IO threads are in the same sharegroup so the texture ends up being visible to the Render Thread context during rendering. This works fine and does not block the UI thread. All references to the image are owned on UI thread by Dart objects. When the final reference to the image is dropped, the texture cannot be collected on the UI thread (because it has not GPU context). Instead, it must be passed to either the GPU or IO threads. The GPU thread is usually in the middle of a frame workload so we redirect the same to the IO thread for eventual collection. While texture collections are usually (comparatively) fast, texture decompression and upload are slow (order of magnitude of frame intervals). For application that end up creating (by not necessarily using) numerous large textures in straight-line execution, it could be the case that texture collection tasks are pending on the IO task runner after all the image decompressions (and upload) are done. Put simply, the collection of the first image could be waiting for the decompression and upload of the last image in the queue. This is exacerbated by two other hacks added to workaround unrelated issues. * First, creating a codec with a single image frame immediately kicks of decompression and upload of that frame image (even if the frame was never request from the codec). This hack was added because we wanted to get rid of the compressed image allocation ASAP. The expectation was codecs would only be created with the sole purpose of getting the decompressed image bytes. However, for applications that only create codecs to get image sizes (but never actually decompress the same), we would end up replacing the compressed image allocation with a larger allocation (device resident no less) for no obvious use. This issue is particularly insidious when you consider that the codec is usually asked for the native image size first before the frame is requested at a smaller size (usually using a new codec with same data but new targetsize). This would cause the creation of a whole extra texture (at 1:1) when the caller was trying to “optimize” for memory use by requesting a texture of a smaller size. * Second, all image collections we delayed in by the unref queue by 250ms because of observations that the calling thread (the UI thread) was being descheduled unnecessarily when a task with a timeout of zero was posted from the same (recall that a task has to be posted to the IO thread for the collection of that texture). 250ms is multiple frame intervals worth of potentially unnecessary textures. The net result of these issues is that we may end up creating textures when all that the application needs is to ask it’s codec for details about the same (but not necessarily access its bytes). Texture collection could also be delayed behind other jobs to decompress the textures on the IO thread. Also, all texture collections are delayed for an arbitrary amount of time. These issues cause applications to be susceptible to OOM situations. These situations manifest in various ways. Host memory exhaustion causes the usual OOM issues. Device memory exhaustion seems to manifest in different ways on iOS and Android. On Android, allocation of a new texture seems to be causing an assertion (in the driver). On iOS, the call hangs (presumably waiting for another thread to release textures which we won’t do because those tasks are blocked behind the current task completing). To address peak memory usage, the following changes have been made: * Image decompression and upload/collection no longer happen on the same thread. All image decompression will now be handled on a workqueue. The number of worker threads in this workqueue is equal to the number of processors on the device. These threads have a lower priority that either the UI or Render threads. These workers are shared between all Flutter applications in the process. * Both the images and their codec now report the correct allocation size to Dart for GC purposes. The Dart VM uses this to pick objects for collection. Earlier the image allocation was assumed to 32bpp with no mipmapping overhead reported. Now, the correct image size is reported and the mipmapping overhead is accounted for. Image codec sizes were not reported to the VM earlier and now are. Expect “External” VM allocations to be higher than previously reported and the numbers in Observatory to line up more closely with actual memory usage (device and host). * Decoding images to a specific size used to decode to 1:1 before performing a resize to the correct dimensions before texture upload. This has now been reworked so that images are first decompressed to a smaller size supported natively by the codec before final resizing to the requested target size. The intermediate copy is now smaller and more promptly collected. Resizing also happens on the workqueue worker. * The drain interval of the unref queue is now sub-frame-interval. I am hesitant to remove the delay entirely because I have not been able to instrument the performance overhead of the same. That is next on my list. But now, multiple frame intervals worth of textures no longer stick around. The following issues have been addressed: * https://github.com/flutter/flutter/issues/34070 Since this was the first usage of the concurrent message loops, the number of idle wakes were determined to be too high and this component has been rewritten to be simpler and not use the existing task runner and MessageLoopImpl interface. * Image decoding had no tests. The new `ui_uniteests` harness has been added that sets up a GPU test harness on the host using SwiftShader. Tests have been added for image decompression, upload and resizing. * The device memory exhaustion in this benchmark has been addressed. That benchmark is still not viable for inclusion in any harness however because it creates 9 million codecs in straight-line execution. Because these codecs are destroyed in the microtask callbacks, these are referenced till those callbacks are executed. So now, instead of device memory exhaustion, this will lead to (slower) exhaustion of host memory. This is expected and working as intended. This patch only addresses peak memory use and makes collection of unused images and textures more prompt. It does NOT address memory use by images referenced strongly by the application or framework. --- BUILD.gn | 1 + fml/concurrent_message_loop.cc | 112 +++- fml/concurrent_message_loop.h | 64 +- fml/message_loop.cc | 8 - fml/message_loop.h | 4 - fml/message_loop_unittests.cc | 21 +- fml/trace_event.h | 35 ++ lib/ui/BUILD.gn | 30 + lib/ui/fixtures/DashInNooglerHat.jpg | Bin 0 -> 354679 bytes lib/ui/fixtures/ui_test.dart | 7 + lib/ui/io_manager.h | 2 + lib/ui/painting/codec.cc | 588 ++---------------- lib/ui/painting/codec.h | 53 +- lib/ui/painting/frame_info.h | 4 - lib/ui/painting/image.cc | 5 +- lib/ui/painting/image_decoder.cc | 336 ++++++++++ lib/ui/painting/image_decoder.h | 73 +++ lib/ui/painting/image_decoder_unittests.cc | 373 +++++++++++ lib/ui/painting/multi_frame_codec.cc | 191 ++++++ lib/ui/painting/multi_frame_codec.h | 54 ++ lib/ui/painting/single_frame_codec.cc | 79 +++ lib/ui/painting/single_frame_codec.h | 41 ++ lib/ui/ui_dart_state.cc | 6 + lib/ui/ui_dart_state.h | 5 + runtime/dart_isolate.cc | 6 + runtime/dart_isolate.h | 2 + runtime/dart_isolate_unittests.cc | 3 + runtime/dart_lifecycle_unittests.cc | 1 + runtime/dart_vm.cc | 6 + runtime/dart_vm.h | 5 + runtime/runtime_controller.cc | 6 + runtime/runtime_controller.h | 3 + shell/common/engine.cc | 4 + shell/common/engine.h | 2 + shell/common/shell_io_manager.cc | 24 +- shell/common/shell_io_manager.h | 13 +- shell/platform/embedder/BUILD.gn | 9 +- .../embedder/tests/embedder_context.cc | 2 +- .../embedder/tests/embedder_context.h | 4 +- testing/BUILD.gn | 22 + testing/run_tests.sh | 3 + .../test_gl_surface.cc | 60 +- .../test_gl_surface.h | 28 +- testing/testing.cc | 33 + testing/testing.h | 3 + testing/thread_test.cc | 8 + testing/thread_test.h | 4 + 47 files changed, 1656 insertions(+), 687 deletions(-) create mode 100644 lib/ui/fixtures/DashInNooglerHat.jpg create mode 100644 lib/ui/fixtures/ui_test.dart create mode 100644 lib/ui/painting/image_decoder.cc create mode 100644 lib/ui/painting/image_decoder.h create mode 100644 lib/ui/painting/image_decoder_unittests.cc create mode 100644 lib/ui/painting/multi_frame_codec.cc create mode 100644 lib/ui/painting/multi_frame_codec.h create mode 100644 lib/ui/painting/single_frame_codec.cc create mode 100644 lib/ui/painting/single_frame_codec.h rename shell/platform/embedder/tests/embedder_test_gl_surface.cc => testing/test_gl_surface.cc (81%) rename shell/platform/embedder/tests/embedder_test_gl_surface.h => testing/test_gl_surface.h (58%) diff --git a/BUILD.gn b/BUILD.gn index 9374834dc9137..5521ce8174325 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -55,6 +55,7 @@ group("flutter") { public_deps += [ "$flutter_root/flow:flow_unittests", "$flutter_root/fml:fml_unittests", + "$flutter_root/lib/ui:ui_unittests", "$flutter_root/runtime:runtime_unittests", "$flutter_root/shell/common:shell_unittests", "$flutter_root/shell/platform/common/cpp/client_wrapper:client_wrapper_unittests", diff --git a/fml/concurrent_message_loop.cc b/fml/concurrent_message_loop.cc index 0c25db27619fe..482ceb479018d 100644 --- a/fml/concurrent_message_loop.cc +++ b/fml/concurrent_message_loop.cc @@ -11,10 +11,14 @@ namespace fml { -ConcurrentMessageLoop::ConcurrentMessageLoop() - : worker_count_(std::max(std::thread::hardware_concurrency(), 1u)), - shutdown_latch_(worker_count_), - shutdown_(false) { +std::shared_ptr ConcurrentMessageLoop::Create( + size_t worker_count) { + return std::shared_ptr{ + new ConcurrentMessageLoop(worker_count)}; +} + +ConcurrentMessageLoop::ConcurrentMessageLoop(size_t worker_count) + : worker_count_(std::max(worker_count, 1ul)) { for (size_t i = 0; i < worker_count_; ++i) { workers_.emplace_back([i, this]() { fml::Thread::SetCurrentThreadName( @@ -26,45 +30,97 @@ ConcurrentMessageLoop::ConcurrentMessageLoop() ConcurrentMessageLoop::~ConcurrentMessageLoop() { Terminate(); - shutdown_latch_.Wait(); for (auto& worker : workers_) { worker.join(); } } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::Run() { - FML_CHECK(false); +size_t ConcurrentMessageLoop::GetWorkerCount() const { + return worker_count_; } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::Terminate() { - std::scoped_lock lock(wait_condition_mutex_); - shutdown_ = true; - wait_condition_.notify_all(); +std::shared_ptr ConcurrentMessageLoop::GetTaskRunner() { + return std::make_shared(weak_from_this()); } -// |fml::MessageLoopImpl| -void ConcurrentMessageLoop::WakeUp(fml::TimePoint time_point) { - // Assume that the clocks are not the same. - const auto duration = std::chrono::nanoseconds( - (time_point - fml::TimePoint::Now()).ToNanoseconds()); - next_wake_ = std::chrono::high_resolution_clock::now() + duration; - wait_condition_.notify_all(); +void ConcurrentMessageLoop::PostTask(fml::closure task) { + if (!task) { + return; + } + + std::unique_lock lock(tasks_mutex_); + + // Don't just drop tasks on the floor in case of shutdown. + if (shutdown_) { + FML_DLOG(WARNING) + << "Tried to post a task to shutdown concurrent message " + "loop. The task will be executed on the callers thread."; + lock.unlock(); + task(); + return; + } + + tasks_.push(task); + + // Unlock the mutex before notifying the condition variable because that mutex + // has to be acquired on the other thread anyway. Waiting in this scope till + // it is acquired there is a pessimization. + lock.unlock(); + + tasks_condition_.notify_one(); } void ConcurrentMessageLoop::WorkerMain() { - while (!shutdown_) { - std::unique_lock lock(wait_condition_mutex_); - if (!shutdown_) { - wait_condition_.wait(lock); + while (true) { + std::unique_lock lock(tasks_mutex_); + tasks_condition_.wait(lock, + [&]() { return tasks_.size() > 0 || shutdown_; }); + + if (tasks_.size() == 0) { + // This can only be caused by shutdown. + FML_DCHECK(shutdown_); + break; } - TRACE_EVENT0("fml", "ConcurrentWorkerWake"); - RunSingleExpiredTaskNow(); + + auto task = tasks_.front(); + tasks_.pop(); + + // Don't hold onto the mutex while the task is being executed as it could + // itself try to post another tasks to this message loop. + lock.unlock(); + + TRACE_EVENT0("flutter", "ConcurrentWorkerWake"); + // Execute the one tasks we woke up for. + task(); + } +} + +void ConcurrentMessageLoop::Terminate() { + std::scoped_lock lock(tasks_mutex_); + shutdown_ = true; + tasks_condition_.notify_all(); +} + +ConcurrentTaskRunner::ConcurrentTaskRunner( + std::weak_ptr weak_loop) + : weak_loop_(std::move(weak_loop)) {} + +ConcurrentTaskRunner::~ConcurrentTaskRunner() = default; + +void ConcurrentTaskRunner::PostTask(fml::closure task) { + if (!task) { + return; + } + + if (auto loop = weak_loop_.lock()) { + loop->PostTask(task); + return; } - RunExpiredTasksNow(); - shutdown_latch_.CountDown(); + FML_DLOG(WARNING) + << "Tried to post to a concurrent message loop that has already died. " + "Executing the task on the callers thread."; + task(); } } // namespace fml diff --git a/fml/concurrent_message_loop.h b/fml/concurrent_message_loop.h index 7879d05239f83..0cfd85c90ec0f 100644 --- a/fml/concurrent_message_loop.h +++ b/fml/concurrent_message_loop.h @@ -5,51 +5,67 @@ #ifndef FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ #define FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ -#include -#include #include +#include #include -#include +#include "flutter/fml/closure.h" #include "flutter/fml/macros.h" -#include "flutter/fml/message_loop_impl.h" -#include "flutter/fml/synchronization/count_down_latch.h" #include "flutter/fml/synchronization/thread_annotations.h" namespace fml { -class ConcurrentMessageLoop : public MessageLoopImpl { - private: - const size_t worker_count_; - std::mutex wait_condition_mutex_; - std::condition_variable wait_condition_; - std::vector workers_; - CountDownLatch shutdown_latch_; - std::chrono::high_resolution_clock::time_point next_wake_; - std::atomic_bool shutdown_; +class ConcurrentTaskRunner; - ConcurrentMessageLoop(); +class ConcurrentMessageLoop + : public std::enable_shared_from_this { + public: + static std::shared_ptr Create( + size_t worker_count = std::thread::hardware_concurrency()); ~ConcurrentMessageLoop(); - // |fml::MessageLoopImpl| - void Run() override; + size_t GetWorkerCount() const; + + std::shared_ptr GetTaskRunner(); + + void Terminate(); - // |fml::MessageLoopImpl| - void Terminate() override; + private: + friend ConcurrentTaskRunner; - // |fml::MessageLoopImpl| - void WakeUp(fml::TimePoint time_point) override; + size_t worker_count_ = 0; + std::vector workers_; + std::mutex tasks_mutex_; + std::condition_variable tasks_condition_; + std::queue tasks_; + bool shutdown_ = false; - static void WorkerMain(ConcurrentMessageLoop* loop); + ConcurrentMessageLoop(size_t worker_count); void WorkerMain(); - FML_FRIEND_MAKE_REF_COUNTED(ConcurrentMessageLoop); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(ConcurrentMessageLoop); + void PostTask(fml::closure task); + FML_DISALLOW_COPY_AND_ASSIGN(ConcurrentMessageLoop); }; +class ConcurrentTaskRunner { + public: + ConcurrentTaskRunner(std::weak_ptr weak_loop); + + ~ConcurrentTaskRunner(); + + void PostTask(fml::closure task); + + private: + friend ConcurrentMessageLoop; + + std::weak_ptr weak_loop_; + + FML_DISALLOW_COPY_AND_ASSIGN(ConcurrentTaskRunner); +}; + } // namespace fml #endif // FLUTTER_FML_CONCURRENT_MESSAGE_LOOP_H_ diff --git a/fml/message_loop.cc b/fml/message_loop.cc index bface19f9e17f..1bf1acd2498c0 100644 --- a/fml/message_loop.cc +++ b/fml/message_loop.cc @@ -6,7 +6,6 @@ #include -#include "flutter/fml/concurrent_message_loop.h" #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" #include "flutter/fml/message_loop_impl.h" @@ -44,13 +43,6 @@ MessageLoop::MessageLoop() FML_CHECK(task_runner_); } -MessageLoop::MessageLoop(Type) - : loop_(fml::MakeRefCounted()), - task_runner_(fml::MakeRefCounted(loop_)) { - FML_CHECK(loop_); - FML_CHECK(task_runner_); -} - MessageLoop::~MessageLoop() = default; void MessageLoop::Run() { diff --git a/fml/message_loop.h b/fml/message_loop.h index 30db680cb9dd3..961f92bce230a 100644 --- a/fml/message_loop.h +++ b/fml/message_loop.h @@ -18,10 +18,6 @@ class MessageLoop { FML_EMBEDDER_ONLY static MessageLoop& GetCurrent(); - enum class Type { kConcurrent }; - - MessageLoop(Type type); - bool IsValid() const; void Run(); diff --git a/fml/message_loop_unittests.cc b/fml/message_loop_unittests.cc index d7c0a9cb926e9..94585d22cee80 100644 --- a/fml/message_loop_unittests.cc +++ b/fml/message_loop_unittests.cc @@ -7,6 +7,7 @@ #include #include +#include "flutter/fml/concurrent_message_loop.h" #include "flutter/fml/message_loop.h" #include "flutter/fml/synchronization/count_down_latch.h" #include "flutter/fml/synchronization/waitable_event.h" @@ -281,19 +282,31 @@ TEST(MessageLoop, TaskObserverFire) { ASSERT_TRUE(terminated); } +TEST(MessageLoop, CanCreateAndShutdownConcurrentMessageLoopsOverAndOver) { + for (size_t i = 0; i < 10; ++i) { + auto loop = fml::ConcurrentMessageLoop::Create(i + 1); + ASSERT_EQ(loop->GetWorkerCount(), i + 1); + } +} + TEST(MessageLoop, CanCreateConcurrentMessageLoop) { - fml::MessageLoop loop(fml::MessageLoop::Type::kConcurrent); - auto task_runner = loop.GetTaskRunner(); + auto loop = fml::ConcurrentMessageLoop::Create(); + auto task_runner = loop->GetTaskRunner(); const size_t kCount = 10; fml::CountDownLatch latch(kCount); + std::mutex thread_ids_mutex; + std::set thread_ids; for (size_t i = 0; i < kCount; ++i) { - task_runner->PostTask([&latch]() { - std::this_thread::sleep_for(std::chrono::milliseconds(5)); + task_runner->PostTask([&]() { + std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "Ran on thread: " << std::this_thread::get_id() << std::endl; + std::scoped_lock lock(thread_ids_mutex); + thread_ids.insert(std::this_thread::get_id()); latch.CountDown(); }); } latch.Wait(); + ASSERT_GE(thread_ids.size(), 1u); } TEST(MessageLoop, CanSwapMessageLoopsAndPreserveThreadConfiguration) { diff --git a/fml/trace_event.h b/fml/trace_event.h index 9f86bcfa04b0c..d37b581f333af 100644 --- a/fml/trace_event.h +++ b/fml/trace_event.h @@ -244,6 +244,41 @@ class ScopedInstantEnd { FML_DISALLOW_COPY_AND_ASSIGN(ScopedInstantEnd); }; +// A move-only utility object that creates a new flow with a unique ID and +// automatically ends it when it goes out of scope. When tracing using multiple +// overlapping flows, it often gets hard to make sure to end the flow +// (especially with early returns), or, end/step on the wrong flow. This +// leads to corrupted or missing traces in the UI. +class TraceFlow { + public: + TraceFlow(const char* label) : label_(label), nonce_(TraceNonce()) { + TraceEventFlowBegin0("flutter", label_, nonce_); + } + + ~TraceFlow() { End(label_); } + + TraceFlow(TraceFlow&& other) : label_(other.label_), nonce_(other.nonce_) { + other.nonce_ = 0; + } + + void Step(const char* label) const { + TraceEventFlowStep0("flutter", label, nonce_); + } + + void End(const char* label = nullptr) { + if (nonce_ != 0) { + TraceEventFlowEnd0("flutter", label == nullptr ? label_ : label, nonce_); + nonce_ = 0; + } + } + + private: + const char* label_; + size_t nonce_; + + FML_DISALLOW_COPY_AND_ASSIGN(TraceFlow); +}; + } // namespace tracing } // namespace fml diff --git a/lib/ui/BUILD.gn b/lib/ui/BUILD.gn index e7cc9a66bdc4d..06f1aa786936b 100644 --- a/lib/ui/BUILD.gn +++ b/lib/ui/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/fuchsia/sdk.gni") +import("$flutter_root/testing/testing.gni") source_set("ui") { sources = [ @@ -34,6 +35,8 @@ source_set("ui") { "painting/gradient.h", "painting/image.cc", "painting/image.h", + "painting/image_decoder.cc", + "painting/image_decoder.h", "painting/image_encoding.cc", "painting/image_encoding.h", "painting/image_filter.cc", @@ -42,6 +45,8 @@ source_set("ui") { "painting/image_shader.h", "painting/matrix.cc", "painting/matrix.h", + "painting/multi_frame_codec.cc", + "painting/multi_frame_codec.h", "painting/paint.cc", "painting/paint.h", "painting/path.cc", @@ -56,6 +61,8 @@ source_set("ui") { "painting/rrect.h", "painting/shader.cc", "painting/shader.h", + "painting/single_frame_codec.cc", + "painting/single_frame_codec.h", "painting/vertices.cc", "painting/vertices.h", "plugins/callback_cache.cc", @@ -136,3 +143,26 @@ source_set("ui") { } } } + +if (current_toolchain == host_toolchain) { + test_fixtures("ui_unittests_fixtures") { + dart_main = "fixtures/ui_test.dart" + fixtures = [ "fixtures/DashInNooglerHat.jpg" ] + } + + executable("ui_unittests") { + testonly = true + + sources = [ + "painting/image_decoder_unittests.cc", + ] + + deps = [ + ":ui", + ":ui_unittests_fixtures", + "$flutter_root/common", + "$flutter_root/testing:dart", + "$flutter_root/testing:opengl", + ] + } +} diff --git a/lib/ui/fixtures/DashInNooglerHat.jpg b/lib/ui/fixtures/DashInNooglerHat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..488fdb4d5215cad1f7921544b2d9b632583befd9 GIT binary patch literal 354679 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�DSoz7VVlC7;|-V30? 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

bilR3c+Wp(!e-{rAdlTT+oj>=4u zs9dimsa*4V&5jg&I0&MaH8u2)F+GAenOu(5ga0e^n}MFtK@oK2x*8D1-vwnOMJq02 z(CmdUaU_s;JjcMH6-Xw5P4aXk9`N)o`a7H-{9o$jhhrGW;o=ygj>BOVvMgg5JPwCI zJmRnZZx0FZUAFWAxA%=5R)MBROWy0BaL2X4^9xCI)O?Yg0PppZ2fm&Zx-BH528}Pt zsBx1|g+`?Y#dGF#He;YZ(6BH&5{8zhpcBrm$Rcp)HH{?=+GWt3SRsvu=7zeFZ53^_ z3brR|*i$tVv#joJ)GK_+1wf2P6gS8wLL{(buMwg>lmcg}nA-?JKwJnIzVzgl-*(RD zAAe(O{?p4I3``mP9~=@4hydUa8778_+gfjBh)^C$U^ENM?gV9^Ab=CGVlvB^5=;(S zNg@X#3nR3C0%80(eu6uh9iX*0YqYCf%cg;>4vw1z=#9{7mwpql5fVucP!jW-Sto>NXZXSNCE`Jh&6@Q>`P!!8GA=eu=IeDt|TqfGUwW z6HeRonEv97oBGUb`#;^HNuFNQ@co4*HOrW2 z5inHe{tUbN9!=H4m?RS>%6`u?oh|f3(!G+A39*7-QDS!x)(X5#PH%f|aH z3{b6lZ9h@m0-6!i1sJAAp2R;vn)6!1Ktk$ z4pMROGAw*bpdUm~1VgxTf)t`Hbo-Md4NS)517s>fDb{SUf~z4nZ@^$eTj&Z|zgv}v zqB@8-@)$%-3^T7&Et6msN8f;o1CDVTo(J9OIT0TFAj~W{bvKvfBc&a@oiHi_e&yU7 zvu4K5^)#9VGrus76hHa?3x{8NGtFJ_!HMI`>;t<#N8;*#M16<=scH?|--dY;1Yfmy zNkUe#fc@AD~&l?ex_@r3)Kt0lDOdoR7Qos|AjD}XbDlR;XH9I znvemJRsqT-v6Lv$JAFcqZmRknB?XE>$hD zP*9&pPK@k+K;6|pXMdmFzN1V`ji&xyy*6i)H6rDM`^w4mryce$3{)|U&hx2kORO6V z+XsEsxSE)YC(18eX8%eau|0&zMRPXV+k_Y?KX^$uGxunEn(uO_o=45gyP&w0r#=0C zW?{EdJlgFED({a_{&=s>m`nWad%T69j3uB`=s(E^$*;2_tX6qrkCCu|~6*v-YjTxpX`69K9L@G9gO zY)ZmaulSQg81!6&XK+zF@UYwD!x2hwHI7gs6$;3@fMKP8IY6ElH4%(228$cS%rQ{YeV(+gqxgYcgzPw64;6QUz1>t2Vhe?=43Qqka~hET zL6VyhbHt0>VE@|}Zn}~7uv$m_UR~6*YENg@YftN`Kh4YE^2Niaq+!J!^X487kKN%E zuU;j%RbPtrBVNkmfcWSWVcBZ;mH=}c%?J}tJX(ERSl`^@4b`JkUYRI+B(6MJlH-UkTJJ8 zMpghj=o9MDtOwM;&=x%?n`CWHRafV}OH*6-V>u3L^*aw&GtnG*o9i9h&5Qy;JTvrZ5qGKyo0qN zj*JEKwwi;2gTfE(UO6a_4#Z7gI4C<+uLZDHkgV}a8d1h${H+pchHS@RmV+6P0-l9H zVqgN#V<3JB7-WbyQU`NRL|l5AR4>Q#%-E6hNmq^*PyjseO4+%4-wyL1Z(9y3BjZ6< zU?)&8imQ|msRwaNAW2~YPdGJ*u%tL~>H)58#=C+DrV(ki7Hi6z2OC?qdW0z4)(=t* znhMs4&KzWouz>T?sRJ4Y9z%qzrOVpT0Lgq!M6NE46BcqTqzHDH{Z>YW11UL|1g}6H zxK)}wPTF85L>@pN(oK?fF+XLI#!dx*55ze#ZGm_K@ z5x)31@Tta5QV6QX1lK-r5lKpc8)ja-Z@U)Gf+XeJF6INsE);0hxGnVBPm{dAC@^M` zLCy0(RWiWS`&&p2WbhbnLNPxqS5wsRCL2(%-{MvrBV8LgTxo5akec3>_)9s=F+(M$$u4UIDjPi!H)e4RIj)DSE@9eUNu+fn``cea>q;xVeR~KLrb+M~;$6R~ zfBFSw;rY?@YX|_&JG1+`rP-;q`a*>>RxVi}EJ^vyNc|x{vqp8EZ%qAAPD$>_5-nkM z)6<5i<)4_sG+#;jL=?}N?i>CaWz_;1I&P2y`Lw^TIW=XlJ%>u2rD7Vy^B#7eH%kwl zKAM*Qnr_zZX)l(mKT*tR_T-&1rS&G>67LW9h=%w5d}^=Axa)+FZ{ zrcBPKv?T@ZGB}clJ7d{IkZV8Uw&3f88!d@iE7DwA7`hjd4gezj5uda`jRg9`GGBwR z3lFFOvlKEiSfF+dijcUWnqXX=pP2)X7~wF2OkQ~!ns(6pW1EJh-B(;&qc9>Zu>FWE z$%NmY+S}SpLL~H}1ga3Bi=SZI%RpfJWsUNO9Fi`_HJ!BdS7Tb}(SA&M!yrN!1Py_Z(RefRMqVxj1V=mzJPH>8mDXV$ zV&wet?|(==6ne!o`HNkLl-f*CBQFy}c>4&kak!4+38@zNs$fk&a)Tl# znPWl}8WpfZ>sjXNfM7S{A`$|-hFGQFb&;`|9)kfBrAZK8fFUP>cf7PsUrJNA3*6vU zvy5fdVniOFprpb%69!u~+rwvltj{k^uGsEhcfd(m36O{2KQ9ypS2T_7kYz8 zIV&G^u%cYjEo@g0)Jp>PI+s@mz2`oq+c06{;Iuy9%1;&3{_?PNZA5V?UR`e<_ zSm4@U&w4a()jqmS)W!P3Km7RdBM`HYgewVTam#s|!(C1ApX`5;t-5dA0Nrx_T&dVc zq@hYOUCmMvp})3>ifOVhYk3ld%%!t|=H;i8PkqQIXN=JLcqr5gPZDj~e-B4t+D4^UkyvS@v+B zSv_~n*~HCQ14AR*T{M+cwlA8BRWb7`% z)a+@qA3$p-n^xIHiE?#fhN{(bx5PJ0i*?e``3wx_+BR8IG#f$-Q^fSP`mJrviuO>d z0aK!Cb}#uOa9|)I1DoMx^GRDw;&2T_4$+wJ7jjQrmZ^~GMVBwB!%qH z(?rzH%9#N%Us<3Lq8!)T*_;Tpf^J^cRRx$+Ib!cZY*nNW6l41q9A4J&6>j$a#7^`N zyqM%?DezmUmg?=0Jx)u_qOVCaYIB~sotf*55zHjLFg$rwG`hzPA2eq97)g?d;&mdj z12a-munvdmoLfPQA&XE@dy^_S;%`9rv)lAY`bRase2p z;TsPPb7lUl{ie#y%Y;cEWK@VP1#{GiLys@`M#nP{v*&X>vi**F4;IxIR2 zklp_IxI?silX4+lL_R17VKBVL1%`W(yFwwGD+l&vJX~_5>l#YPn)Gh)1&~%BK3zum54e zzS3B6(799Y`x$bn_ol*L27y=0_RiKnwG<5NqMS^7-ml*iv1?@09=rK?=GBT^a}|p8r$CMV9%(1`A4DBZcYmfam@UBsCDk2?N?pxMQz5S z$BgVe%{y6E0sp-htJRI8+31%m3aKAy@Yt_Tdcd2LWjNJu37>kY^ZH9x!H$;)8`CEx zyQae#PR}#fCnl z^3yQ6#9m5^CewoSEbSECV7iK$PFf?Sate966zr$LI}p~?Od4)*Zz92i1bx{C>IRq9 zkw-AOvi=GqMj-fenS4rpprjP&MBiQkPb|9A2<^$VTnqs&8s6#~tBtOiAdl8Ux4p$T zelK=#-^73cpLN|KOWD6Zjd3HZX4}o8{LE0{vSkZ?=Mg9M^d0)7Gt8g)u2kG3Ch2YD z-S(0xl2KmTp$6merAd22hQj!p!{OjUH2_;;W(hj+wF*)ySct{I0FBGID$!mfslYSH zJva76LNUTo#*huwV|f(99xM=(ubIFNp%Dr4V4#t=OJOV@gJVHvg+#XA`)~{~!BM=c zfvgBGOpQmF_-pclkCq7-C3%UTe?ip_7_;waXYIODB+TrjadJ1}X#3EnM+S0qIq z^fVpWG~r2QeK(*UdZaO$N{$KDYmEx>$s8>yFN_^)(_SM>sfz&yDr#9Xa}~J@XH?XZ zQdsen(LWFsNQS-{9*#R!B6?HkrSiVwz+eJMy;Fzx1;s9vNR`)D)?V8E{%tTS+0^ZK z(uUBiK?m%d)l=m;QQQpPfVMQptk|rCpl#rw{ ziK=7hUfkkn@W~p2SSQE)pl5lVd+R`C_;K5|JI!3r>A+G+nM4aQ1v$;+3>(lPgL_0_ zWDD6{Robfy;xBjqV-3TTl&mh0Ph5$|c+4mRJdW@Yb3y&)7qQXSm+Kc{)VS~nHr0=h< zv#rnMcZ-+X_+?hu*DDs(d(Nb7GWUyP^qI{A8lJx+p~tD%T8(X~VyJ$<&t_VFHD-*JvCJN8ML)~f`6wuOY17*YCW1g%vRmZkE*j) zBKI+*4ZaS~pq2aW9WVS&&42d7vWIbRcNk87UD*>Przp)y2bxIqLLX0Qy|uBmWYO=8 zE8erLiiJD5}Lzpou7|kS90Q1Ui$n zV8Q>AfW@Y1L!#xB8>P-B_PB*H@D{k1Oi47&mIOvLrTsc&VPdz&k~wKX$iX=o>5`JP zm|$+1aqfm540h8^XGpyiI|foKxTi;n^vGb>q0byQ9+KZNQMd!qr$u&B5_uv9<7ghD zHjc5=Px?`Jy(t_1$u{1ajQ`M>^GK@D(8--b^y~NY%)Iq&|bV8>8#)g z8V5jD@0bkEY-$X&k)sRESIQ80La^ahfs738sJb%s1!YI~e=oWmNLAdrg}zX@F%T?t zxiC!>y@;m;f8akj5$X^ z$&S5R6a1U}N*H=r%1ATh=MKS4J!Ko-4^7%?7JW!C>nbEAVy-NV&`>s^78yNU6SCES zW)X75$#N)@a4MP^<zp55KWA+|WS@l~ z4%;;b21O$gycpCY^kT@;o?9bbCH56F3L zyp!4R*V+30C*3-o)z}M>T|iXAxFiZVGvQk8;bs+*Ln+y z;7P1do=%zcKH)Y^U=jpxF%iS{i{zJkzK;QH4~w-5(hsVRcfCz)Rm`C$g6)%e6TxpAzKpCIa}h{y4U== zmRKYq;REAjvR#7x_&Afj?t3I%j&(>NPlOQJo9DL>*uj?)5QAYr(Eu;9;gcV6?K^+(JzWBGNIny2%mgYC8;8+n|sbDwcwdqqRk6(?00i~QnRb8Ca0>4^o5Jp z`^Mrbq!L||omdCTqcQs#AlCYxtKq10T5(H$XKaN7+6tfTJ#DX`@P>K!2%~wjz>}7V zcd{|AnpDvD*H^m+1OQw@2ZK%6WL!Wr@|zCdCyD=Df#&b7VemI-*h)jpQjg|E!1B%! zeerEoziytn`yVJD&Wmn_y(mO7pJF@`8Ho2SiS(P%^~!uLGr6BSa(tpo*KhRj@)WUb zUt?~4vgYj4l7?0>v-6M45Sud6-FSAszKq{>HQUuO$ye$x51)V3r+EOC7nqkHu*BZZ zZO&X#<{L5hs3bSj%3o6%L-KQ9%Y6MPbxpmP;ms~f?KwU5T(`8@`AqOxnmTy(YmFcO zb!udPtZfh(Rx5(Zxx??fDv=8M%9mw|7AJL**pd zZt6?kLVO?5IJ|dnQ_DnD1J0SD8*c5?NzzTrNA~Hp!~2*3jlxLSka+|g4xz2Zv_gxU zV7`)4**`rxA35@XiAs!1C6ZoYTceRG8%E{9BA6vlQ}p=FWvDLZP<)c9(o!NzqIt&l zvJ&5gaoxqcTGVdZ{k1v=41n`QN9_%QJ>>RCOi2P*a#Q2u^uv8#jEoQlUjz1_Mph=_ zhM&$LmCkkK3}QzHAs{=lgMbx~j?_vCvm09`WT|jAQ~W^?D30ZD-*B%0Wz$c1;zh}c zX+O`(kL%Wi_s7McH>0y50IT^nR5N6b zI$n?{f+5`_=nL3)aqr0KfaO2D#@mw_Ue0?$KoQ>d>GM2Kyr z%=HrkK83~YwC6ntE`45R`-sjkoOl9Z+8RkQbJt&zkV?{miG^GcYDFJ@6$?eE%t2?dh)DJnvN=C`4wGagxRlm9pyho+7q`ND**s`mkGu^uz1Rr+H^4}79UV}mMLV3& z66XH7?w;H1E4#{#%8L32A3ivfF8MZS(%n4WXU5kj(}kg0ShP2OLzS!UWH=)ZP8lwV zXD_coDdkM~Sxv@!bSRv|r?z)&ZT9O)vK8$)EDbox*r#93eE`-!+^XgWQcs=guy1o4 z^i=zrkgiH*%0_G4+(y|e2_G?c1-Z7R><>s|=_T)BSE9auz zfn#wv=1BCFEeu~cW!9+2zbz%VHocbly3Z-)-zsCjwMv{Rh$k@aK}2niVRGN2sk`cW zsQe~G*G!H{pNS?6JN4CNOH6K^rhZ9|;BEU_4RY}^%%4dMj7@Y>@f|RH`w-A`9=of_ z_k1Tj8+i$eW^8`pYqCCtffn`8!L!v`;elhI_Y$ezkD+qda>Q_{Sp?%iP1uw{C;u@m zr>HDKyep<6K?H(t`$NM}{$W5Nr=2gXE*=<8+~#hrAi^{)GBI5`aFW5kf!& zZXiP3F8>I=eug&yD#V8b0FQ&(aP$Uz4s2xn%NwM7e?b=Z_!n2N@IHf!NR?iuC`EoO zii1tOZ|-nDN!Lw@o(X!z*hRe(>U^!{57i{cvY`DU2p?Up&d$ z)(}g`dw;h7Qw>a8KZFuDyi3rYgITPgV+4nH=tRCa?So__1@;pk#+`*K2WBF6F*<~Y zq>4bY0wjnu`Q;K&AKx^*S4+-GD3DfwJOiH%EylQhN&purzXYS>aDeY3Pen_&oLZ(Y zMJ^QVvTh*4V<;v=7>VgJp}K=ar4eD*y!EpC7%JhHohj%HF$sMi+DdK1-n?BGb0*ju zQDP56p3c|oj7YS8VHJ#8wy*rNF>90QDa*m7pQX4J)@g((-BHEBSy(oLKfX+)#_;bWe4Xe%a}nlT)oZSIO15D^_=}o zhOrF#V|~JC-YaXqPJgD#dT*&}W>(2I>F)54s++Yb>iC-&BmF}+GM3T_jamIkX2C3R z5;*i>@yLGJly}i`RCVnKtpNJ2(UUzd2FlLzTej)>XTIN=n!0f6NBKFPHw8}O#+noO zcwN=ap^gcT1bq%0pvgTVI2@3z-1VL37_+U|@yq%1nUQ(-Ge5_G2V>9^va=y0M}^eT zlBa*avVr%;?fW&AjxQu^}cFZ2@MJdlNobe^Xs3^!Qqns~*XYB-M~j2)2&w*GW3}(c55^*@y`@U6!a|IF?23 z;~VACDxjH!LCTkxfM z4@}dqwF^}eDkmbZ!nxE?)Uv;1IU67k3b)2ehJkCaNk+$|`E_=!5c43h|2qu=R3|{|0~LSX6Mp&6w;Es7XCjV#$JN@wO3JT-lRKBt*X`&YId-6a z6W}YFHIb$g@-MNC2yTJ5EG~>?YcH&FQN#kdK>|Y=HeOAKi+;Ys1akXq0?$30_s-%@|-0cUELZj>8@R7uV0MV|8BM1H>Fz%Yx-@W{%KJ|S60(F@* zD_0*IIoH*dG+)2JXIIykp+&wLps{1;`lBJ}*FPQ<`Nxo;g7z0nUWziPCr*9)i{EQP z_#X4_PokT$3<28H0j|QAtlekfOz*D^u~pL7URDR+cQWs;RwaF@GWR!BGCM7?+Iu;l zq`!IExPCzz{3FCi!qx<>kMqr4{z=g0+wAU>Ae zWV_#vB90)NYF6?0zen>DgK5`hU(vV0jwN#w5zLVW7!)P%us@ZN=mdzgRQ?%`ZGJ0`p?xjb?ugo*uKk4c#03p083C5Obf-qcj3!LY`HK< z1-7vS1v#x99s|UZ%;(Tfw30?Fv%%HG-AyEGR*>uBoL1~(%MZv9V!=j9h=zBY#H!?A zjl%~npc}_I1EC`!CRpl%eR%7i#AK0VqrAZ#J`N}Ym%bzPZ5;bJ$~OMMi*j5^?|-iz z06#enL4s)S`ZOaBhH6%!WHIE9!2!=9*fWt(Bs4O?m zheUfavVIZxB6Bo$(zvW2=S@aySVUEwZODCrXW@G-w}!{0Fy2YeUe5)Nn3Y1RL4xRB z<|{GJU@A5XhB|y93)`mglKlOcJQrzR#A+BX6Zftq4vC(rs6~Ad zG$Fd7SvEQ5TEl_rbyNvdJyPEfqGeE}=uob42D2$>v6ml+&j=oNW z9Ece)ghGqIJ0gd<9%(4CjK%ca*#+SOBSY-WCCgCA4u%^k`2nHKm3rg2)jDct z+UeZ+KIiiWwA-DzzvYj}Vo2V+pU>x<=RD^*=WInW;G{jaSqe0@or|C`RV|E{Uhi47 zW%{EpWp7_IzWj-y^L{a*?H8lV=ble|HRtiVFO}w&?FB4-2PL4f!O*;@R_ytXp37V6LCMfkw@=ugt zcBOvuSXp&%wXodp9udBl>vf3t+xDN!SC1GMLn2a~BJ}0qnRgIFp(okxv1q$n;ZNZZ z6Ug#Fm;o39c3xP#3kq04Q!TowfHU{P1T)A$5gxO4^gK%Wk?mqfkl8E`qyEVn@`M&I z@Fxt!@?Okf@svwFd<4Yi$2bMV3T+?x}1162^Q6n zbWvpIpsSdI-Nx)QUZ2%>lEhvJax+nP*ew#8#}2ZsT~JVWQ=Q!2>3Lh7Bpm>DHh9Q! zU-_gW#BQ0UhSou4+S#|WZQI{m3rb?lFV9#1VMMgD9Ft`z$% z^)QF}XNeqh$!f1xLutN!0A(RN$P{DL)Jo;?` zr02jYiPO=p0tvDJl)V=Sw0Ue+sD3fzqQlTiBWTDK|FhHg{kwDDo$AX~qaP`|MR7!K zp!r+2HbXN?dKM<@3zhP$W@5+CC5~4@p}{J-#%YA5@fT9`^#Zv`=8F#u2xii6WDX? zy}GJ`CAV~!{JqZCYsl(n&jOo~HE=`0_;SM|W9xd}pE_caWP8DZ5004jPcrzMT95k^ z#m7rFPe)&ndcFLvJ!~nl~;%AsE7Iz!qW zPOq|3H8|#0PJT;l_iaYl4mpfIM0Ix2$BJx7`0XO}-Gu7^GZBx!i5G0>Zt>xef+pl{ zWkSq)*Dkt-)nLM8G1^(_b6hWW?wX2g$&2@wUe_4yGQSKv9 z)+r$ZO0LZ5G+fzg9{u3VlFZl;t)@KOq8h(+M`BrC(}ei zFm%rA4JbK>L(>-m5y{QK5W$f9AMDvo+64Thi|EJHp4cm*JZ zFp##shCmmE%Ve@}%?>*IEF{$vK!F(qo01(IDGan$NVbQb+b>gRv7-i83vC8E1cNcr z=LgFhwmFN=O}P^JP@!HZdw=zZ54MFw^T>;JRD^Nq!;8$sQCa}j6a_@QNeL&hKlL1D z24*0$o(!pBqwx0(mr+KS%Ys_^Gz5i!IGUx%$Qcf5!rEpi>|$^~P?>4P6}cTafRLYK zCHR;-8a3^4BmmPFH`oSxg`}~aYA9C?8|hl^qV0LTI~xfQNlGr+Fy!=Zp$CF@dW;`F zPKL}V3I4z);U=n)W-tN^EyLI42;mUS9532a1+9Iac*& zEK&d1Hx{ywLKE94*Vyzz^a59RV8B$f^h;sE_A;FpXlVS30p83obiqHd%pM z23UvIZ=@ducGV4nn&V@|J72rSUT(V33Q67e!W7)=3KTgVL0V+2$_Qqq2iV0s+4TM` z@H~oo=P6_{)JoZc&bW0b!Fbd&TqQ_DK|t{e(`R;(TP&>4xd}ZV@t8&XJO;%VX?D>= z72Z_wULAm~B0>twU5PZM-MCM^ldwbViwdeV)jSv+~cBn?(w=GiQjzNVG)-1PscEpzmOIkwP6FuEEeSFpt<1aTabsFyaI#!KZD=1*P7) z;_rrQPlmNEc>CFRy9-)qVCrTDoCvkyhyI7v>fr-55h!h8p2_5@co9q>Z`S&5C}ba< zFl(@HNk9%vazPLeI(OJwZ(2C9)l(qoiUs{L#P^PW3%ZO!SjF%BAmM{q6A(egDF-a* z%o-70vV5J7%eF1Qs7-*``0lUJ!Xpcx3)V*?g&@KE*s?SZLMrsihWQK$kwRFHx)Fv` zfIZq_v%HKN2kAp!7pLTg065{QiD>f#DK>Wb*b_M@X{4cUmO}AV>D5%6G$0iyFsLdZ zQHAzuX)qtq+bWaNKzN(NS-C5_!|YCzac10FK2mvpAKNpa*M81={P6d%Ccwu*t4wh* z>k*0lfMq3s+qathW!F1iJQZ+B8Zg}gAO zELAla$q`?=Stb_6_=l@t^?PflIqYRxh;eba%Co`uDY=Up(+hL$XhPElvIlyr{ERDJ zWekQ==4Y*QgkA<^*laUoMM7uO?NbC$1$;I?!+Fw9!p}uYt{4^O85#uKz4d3T`kfYT zUX;6ATI>{758X2T^^#oUOw%#v?xE@#29?{g$%_N!2}c<&`dSq(lXe)WS1on5VD+&` z+$cO3i~^QWV-X4F(i5wKEeE=m&I0zb9_?~C579Ylm`J=HC5Grh>dn&$`wCuloOR@h zSH5`oMRm>@>a)P(2bj3NkHo$*-i6^H2D2bgVEH=}h8p-0KC-*f4^KR}`(4b@A2l7# zpgQ9%kQ7vC#mkUef^a1zhnOdUk~R04jwOAZrWoq zqLD~5F(w|g2gmCYWbgtsQsp(49BuRU)WRd4Fakp!1$D@gp3|GDKm67N*oZQcdM*GQ zVg&uYT1R2?uy>Jh@-yg zZY8Gcd?T!~7@MUX&l$s{b;xARLTaE(B}vcEf|1Bq1Ex#XqRT9J&!x)ltTg-MjrrcG z$~?{(Qx1zLC|O`zmTr!*`|mg+GN#!>N?iev2-H`}C|F;fwP1`$8K{kNg;qMF#I{j~ zkoLSFnI%Wr6Q@v5*&T}!kK@qyrdBl|Qc-Tx;=V|)Q-$zEpaz_}HBKp#Ve9o0Z5JpB z+cHQ*?fILG97sNdk|-P89opT3I@{XADO6N`YZ{x;m{%DqA7G*2B~;os33}$ zG8DxT3Lyj}7_2$%)j$2kqJMJ8>iMI#|$;kTF^19q9pzHxmTWQox8@*Io- ztK`G1j2N8~wX9ao;a_4?s6fGh$7n~mk}GtCu+CG~$U7eF8@PX%BgC7a4p?poO^oqX zDWP_@7{a!N7!6PsJTm7oL*JdwXS$7ZdZ>5`#n2)wXPoa8v^BD677RzlUAUXmv1lV| zWaCIotVOEHOPGTKt$ub2_AKZ;e)JU+NdLE%fh`Lo(P(`rnBl2-{BZvo1iufJ(*1k= z|E%8C5d8^;Xv@|)$5`_s72DSbww@@=KjlsiEz>?;(C(c`x&Fh>D>)Uq89?N*Y0b*( zWh!u_%}9=<$x6qK7?Cx=n=<%X_W4@$$z7Nw@R^8_|@ z&b8tHRo8UB2~T+jtiGBG{ewNMXjctx+}sd9a{nrUxK_NYF$FQF)OriEQ;{+3g{)?k z6Oz%vy*1SmbTUD;TSA=aRwR1CCHT=9Ypt#36P+C-aByrjpmfV%UVCfo4|C|>DB?SgYRex(HyNjcsutu zLmyxJv0_rwbm=Xf^5T=WNT3^}9jdxA72I%)H;(6oyU~3JtPAZ*CK{yM`;@%bl7^g& z>?y@sD6OMu1)6Obi)E#KSF{VsCDeCPBoWL#kh!?`11((eL7|AeFIqr=5d0r_GGZl$ z)zBn&+Cul}R=8!joFYEHfO-Twfl@d9)`u7hyu5=f2rHZ&$=(Zx6>>M8XW)UT6}XcD z9vG&0^ciHJfEW!Qd4Ay1U~E88N9V&JYD#aDY|e;wBRo35s^Fx;iYrVz{)9%uFZNW5 zo}S`*>BEDcXnQhgFp!?b(D&@ty#vA5&(U$Aw}YyY<(X0-tjrbeUKWe^-sM17Ub73z zy`$?8NNlENbN8L2cxeX)ImyA9kystf8A>-gL!L*u!AM^mLRVX11K7+@oQMY~1JmxV zu%P?q**woxrd-4;(RpR*;z_&qfvW^gsK`B`1T_i>Kq9~6G&hoe9$-yuKN6#avlO)* zh$fJ3-s7)Th9}E?tRfENhZS-^G?){$3Ohqp#d}9OI6YX8k-!%E&J<8ukSnnOkF4;| zKajX*9>&htrhlIPe`G8eMNA-)qR8)UKn5^=U^PN>Miu<+z^OB@Sc;0qnA%$vZ=1Gj zL0>|eoieaCC&#Rq1T8@<=l{o5w5puSw?T8VZ9rBa6hT1Jlqg8U?bi%t^qRz@G8a>=(iQtly(AvN*x~2BpTIXmZvMhDm0@re5EH9WMY+B<9sg06VF$EDtD& zo*>47g_@qj>~}1_VW)}Ra73WE9@rT^&IyL1_yhU{j|uPz*r#C19ild2H1bkt3qe=H z{tN#Nvjx@`@1&P8vqT?)1sb%~p^YJ0lJ8z8r1Ii{2s(~k7*ldFE&7$GpPzb4HDt9H z&NEiRvoHJsV6Va3Flx#IUIaggnm|b79>DK+p(r*g3hFrL@e)un14JCfKEb`ckcT}m zR8ZNXRxnT-t6u`9GV)`i3$dkYu-*2%3D^L_Ky4eyPhuPhOW@$kA>s}75?9GqL5}`O z+!Q**y^PU3s1cD0C0AILmkb|)u#C~jAd~p(?JLsTg*~o;)X-^PT$byAk>I{XXBBjU znStvO?j324)`&DxNvY60ZjfH&E<){(1&XmCUJF*intyOo`##-|zOs-3z&7NcXa0r3 zz;46y*oxw2Q@{aQiyTQ4b}I8d?3Ul>s(#|2q)TKQlcP$Wnr;x@o@>wG>kGs+ zdsO1NCAl8VAPmzi=(2h+ zai;uFIku@1)x?zSGu3aJ1okk0@eU7E;H}4+PGL5HA=@(0af;G0Zl!&_|CVZV$Qe*_ z@+gjW*5veD|9qy}l^kWonzZi`H#cjy8OpHh#F5L^+sY%yilH(@=u zXMJ9Q%&2tuWe?6BAvwK;%I~QRb1PO^ABFzB6lLIwoem`qtRC+d5kQkdI{V0u&{nvr z$sm6T&+X|uqEH0mFM_U_mXps_kY{15$?!ptPN1bVVTa-!$ngZjOnz?xvUD-N0`Q`O zN*T~gj7+V1x)KC1if_q>02?r@gG2!bO)TlUy3k0QN9y<9l7B61T9z~+lAcBRRGEfr zqBva~PZ*gQB(&DSUL=JHycM#PSw_M=jV2LbM`mz?vR_&KWQb_r!Z6Y&c<5Z#ytS{a zSg~Tm>6cGUopSVA!JqL2zTT~$cj0Xsg>|3{6gY?ITV`#iI#MB|{BX%az8(#q9V{GF zcp7>K$RS2nA%|fP8%|YO7VcL)^{5ENoWA*zS>@UU>QrURxIs2R_ef!$0@Yx3Zr1lb zLJ09l&~TCBWEis;!vQ}8xoGW9RRQiIbm0bD2{eXYAwl!f590AByOZt0I@=(GLI z0|n0aMTYQC>=*D31ONs9{PbT~5$rbR7Rc`R84)ZcGt)3B{bu+_hUz|p7CJ(?)V6i+ zVIMbt#;xp}9STKFe44=+Y7j1})RtB1!ZX~%)^`s%Co3#fE`dLfPp=)_BFGrKJE5i# zwBd&QGmYHXDw>=zcsBYxYaeeY%TfzoOyXjtUxgL^Iw8wGFjbu_s~uYh%10p`uneD! z%lA=f2^`3|?h5q$1LOcauXrKTl$wnKu9)uDW+(a?Ur7E zWV9_u-Ikp@nre2K*yxMdUJzYsBIB{YQ3VhpMQuF?2Ms=e*#{p8NLpY|BLxj`RlIvA zK+pwq9!dtmXb1agqr=NM0WuNn2b@Blw;$NXRT&Cze}fds5@AyNb&QZ4;=20DEK>U4aF;$+GmG&4$6^s_r4T zvR3G(&gijn=dHr&ezfixw&ZJP*rCkS+-S^UJ&Nj{L#Q3_@15pC9kd}+fyow;!Bg1+_+y--O$ZcHPdk&(hy*LQN|sK6M*~s=!9x4Wit%&1lvFq`=ZfBnioURy$NSmg?5IN6yj$G^#F&5m~F2@OcM$0^V2Ko>A3GMN++2N@Fy4TFg{3v!m~AvC~}5MV43 zRdAhg$AX-o$bqO}L1H;h2lKVm)KqskV$7)xh zh}_@v5mG3FY>HXk$0}4q&8CZh4mUhpr{@C55CL`t>W=z9k42-pmlk0pQ6GFD#MZYh ze&#Ew+4`&ngRDgTJjiP@ysGu;1`M|F%ShrMGq@869<`j(!)KECsA>l^bvt+XA~ zYURg`4&{Ih{SwIwMb`)91C>(wZ7ooH~XH2t)j#iXRIxR=N zWTfYMx4^x_Bp6jyW!sxDs$}Yek4QfwX7j^J>32O@B_$tql47Z7i63ObAnFP)ECQZq zoP{eauQ!wANc*?Q|$-dqqqX9pMt{Qf(Rc22>KEAAp)zm9VNa8O<4|u>;~=;B};?fzQimT8ZgG@t%2?Hy$WEV@`c_$@#J?^IA{T z+K>-4B2~$ycZMKQ@Eq#jKF0wqR3LNCKn>+UFoi`V-3t9x0z;3}fev^R0ES^NHDB;$ z>d>$BA3f*%P+(0m2CNdQt|J9FxW*~A(!y1wd-IaB%~2;a*wwTP4R6p?ri17Psw76v z(@s?@cHl{{k{&ZHC%+PXR09!)n4YqQD3NMOp;!q~*90jz(c3zZXXk9(I;2qyX1n+< zBsBx~nl2iJv4>&{sihd#*$(P~1`*)qq>$O}yRBFT{`Px#i+S&O_Z{iV11N;8wyMH78-1oC~Bp&-q;vr2HXCJsBUlS4M z$~s$m96Ep$t*GOM&YRVKbM^|k@KMh#-&Axa(~7+ElTB6V^(WO!DF2J>5SKsKr4OJX zh#||!U4gX0%Vo)3l8q^%s6d5xBAQ}(<51;K2TEZ+UygBu%fa$!Z=^Tip|dBvq< z0FyGFe`Lj+61m`S4zxPO9?e9JG51Iz!VBsJVr_>-@Wo5fqNd7UY2#K+r~cKt1jhuZ>zCt;ZO_wa~vSifeH0lM(CQ~{3@O|y@&Crifav!W!cKf$LMk7Hmf-!JvRp#+t z_lV(Djegm~aVLG6)OlYl^2~cF@J4aVs-y(8?dx##VhkIY&W4< zh#~aFw5eFS+(KPe^0WPb>NLqAq{W5*Vrf2pdG3R7L`h(AsiK`QGY+B$021*7e2(YF{{k4FaJ2qumF81HvR8I$3g2EJKl_ zdY>l_U{xGIA<%NAz~WGGHF<7|FObv#2k*3At`kJj{VA(t)@gG$Yzm=Jh$RY%KMeE)Ct9#TVJW@gIf84NC`bE|)`k}0EL_b%wCB3+ z*8>fJyio2h*WYl1f?H&|Xu5#74nYVzjieasx1;xc50J*MI3GpfE)szFmk-D|Ad=3{ z|EBd*Wp}!S+iN+nyt>Sr`RVqs1qR{W5xbtTh6kF`&DVS*LzY^Ws~0u=WkXs1p-Y=@ zbu=A2{C|#Q993?8JSK3st6ctV&vUCsl z_0s~5(4vNlOojQ2EHP+x;pm(!T14Xnw74(`ppVXlBAfG2IB!uXFm?#lvW1~&5V@&L z2M7M8=d8dR@}Q+~xoN5_GzO_Onm~{Zjss2@zCqwYQ+V#T=p!nIkRctl#d*+zMk%fD z2z1vl2tt<|qW^y6~~FwKKXbrYJ{f z$E~b$mZF|IjKMZkK2h-3$%3eo`uVo4#^-NqB9aXUG^1^44u>PQhUJ^)y-|sLh&@%+{TfrTPGr>4}a*_Nu z48Bn6fLga{`E87-ft)|wH*XSmQEp^v#WLr0_z?e|poLP%2M9~C5p^qX-M2rqa{{fp(aLJ+$1iy4T2{nX-pWgILS+6=+Js z+(B0;yLal;bkv?<@(;W9s%t-U?`jBROE zOmW>X|7pX@P0drcAJK77HNBzxc4>5r?yCu0WB#I1F_KxTYx7@xc74+0pFY$1-z(=& zd}eokk3V|&nZsX{Ck*)Ha(=zz?zP;b<@-}zr4h-W%fC2M{`dcMt@jT*ab)D62H)BP zlT2IhgnatdD-R1Yr};*X@D=}`1z(knd$#=i8@JRW2kr8~KUHa>O)a1eL%bD-+0u|jcPGvZpa(EUNQ5}uDG6yy4C_oQB;OEc7y`i zsUcSQYq|4Uwxtxk3DWb=*3@ki-*qSr8_=ID3+h}EmtJLoQMgm^iC#q}HI66~Nt^uMu|;X>@SL`)>w*8L_jF?pSHe34mLu0o51ypRgtBbtT1du-g) zuiXXD76W!Cl;u>Lw$bSD+F5@wwY!%}A^RAr4O3p_G^IQ`{V7 zU*+Q-D$m`%ck8Ca$A)>x~;5hMIn+6M8)s^EV8&(9<)wj+t zd3}Tlp8zFjL2FG*%v=)H>%&~IGYL@TL7g!}V9bV*F)Jq;SOo1ai{wa>Nq<1*$QX?6 znw2QrE@zkwZC1ti;1lsC8L*I;t48bwYz*Q-UiU_XXOJjlz{+Fg@-q-Y(yK>eMK#>4 zjZZ&Xd@k_HM}NO@YYWizICBAj%U)2=`d}BM)XR z`)?IPtw_%iEuJ-BqDrr^%{ORU(rrcYP4=fZkG`6^(p;uC|3SU9p>t+R{^Y-XJn{v> z%bBWI4A0Fi&mVQ>#BBAZz^z}8zOr}a#_g|eeAV&He;-NyWZcT$J)17iTB=GtV_R-$ zD?h(@??BfZsjC2Fo@wx0FB$%9^O2(eRu;V=2{ix5n`w{jne%nvifzATX3J{}-h3wN zwq?;a&a$U`sJ0EB`{erv7Z8N_?7v_N#=XY5kYn85qT4n$^L~>*Z zFaEPo@s15p-C75}qRW-X<9@124G6F@UGtL?kV@v6kUKe|HRG90~Z+p(*D{GZ;? zeKMmn1-g-0x8^WX)aiOvH>1}ql>yqeyW$j|bx_4c97agFAp-Vy4gi6+s#TPX_MXo} z9WOxRuih#@O4?%Km=r4%=5rU2QOJ`IDMrED1-QdPU5`K89uCC1%57FC*3;t_r4Cy1V#m7=+k~NoWid=&lO>feNr+HFiT8q zK_g0uJz#~r3|@^Ua;KPB{#D5P@{lUnMj@zQa{yuiOR+d6_};)(6wja`l8KHoOgqYx z35rGGbZh#IB09Eq;Ul0$6R;D#17V6#rB$yF+EUzjLv~1Q?twSnJ$<5$d!qiY(^^uq ze6==R&--XUs7(MvisnV=U!DM!`NyWi*gE#mQ&4-5GSy%njcBO1niSNlFsib@3k)Cq zfV=}-qP}#9%P=v5mzGjW=QF35dPvcY!iBMI5ANtb@eZ}V>_u)DfCxe|w9;Jsx+t#X zcdO7qGvq_VKvaiv3A%)V?kyxETVz7ASAiri=e|K@wwSF&#u3W9LKI<5#oQq2dt-Op zd2iDC&d{EDi%TnyWPW;Zlgd8G^F-OZ3(E3G-TGuk{=&&ECr51m^rQ8~`=`E|@kQHo zk?$XWPPds}3R{2q#gE?aE;Nmr25YlYy!Ia@sVkda8+7=pY0`Pm{9jBt`!~t+zd!Mt zGw8AW*+k=^TjP$*dgec7%u6qP_<@Hf_iSyNbn4TYCFzCSuWq21TrF5GRVDWqBaSbh z?x9stz|*sq4CR?nd;`BqY2`8Q37-R*sbJiX1f!>K>){Xja6Y2pp!?zX1n(DMlz#g! zWiEW;kitA>iH5N)LJpWM36g*;%NR6EA|eO+;@Y428Y(>i3UpwL>!HP#HM6y||7zHp z6=+7Qqc~HVbaQV*V`s=;Q3N}Atc_di^i9ac7MuM#MmDN^!n!RI(*Wlwto&lB9tcIS zGnZmR!STBF-LI_&T2kO#BDaGn)z)qSOO=e)O&8k|^Q-d4K5S@rEWP7^Qpq2vlE~4u zME9`i9UE7xG$?vF%sbp*ICu?B5v{!#b(E$zY}0Ug#sn1Zpk2 zt0>oo&G27BPtP-T@ANd8qdIn|b)(8M7PLKH`SijbkN(#ke{^=ZHYz%LWP`kb?Ev{c zF}$_O^G;sKTU|Og*&G)1z!0?4q$tiQwW5B|-?bC_8Iu$}9`0&-Hw=`BJdOv;%yJ#X z>5%JXn}G}pAAKd!o_PljOAW@vYQ2u{2o13O4nx)w1^OIS)0to?U<%M*c5%q~E>k*Gc6>4PYml)w}$CoTuQG(uWe)hz?x$FUoplMb0o?%AmJu6R|Q<()5Zf9c7H1%6)~)FRHffa(&tI;qMBU*1hWqw;oE+J-#HPr{}r#U)u-8 z*h=*!t%vh-zJ6_{{Iv&!-M60nC%62DSNWeCY!8d=()OrVR=<0B+~na;o!rp<+NeL~ zXFaJd4}59x*DW7E;|@5S&S=A#=D*Kc9e6GL)!%OKUNdFIx~8M$Yd^QUHXfX*UQ}ah z7w_2=`0zgx(q{A|J-b2n5oEt32knlyw5Pqr*R%Cyn_RfK?2%U$Gp@{Ck9pCnvv2C? z)b_#;^;%NrK*-S_(9<_n)Nc=}T&T)X;8J7`QPbK5li|GQ3$h9KTbUnypF@U*%@cO& z;-#EC(3orT>>(NzYvGHB@3eYWGVy6wt~WWndxfbdkBfv6BH2c90|ZWSa(GA74&aDk zrYX+f^h1--hFyk)(c%iJJI%GjbZ5Y?MygAB>Dy53L9iUZp6K1K{UrFv4=Q?byEb;#p`22XF&%mFI%o z8#^2g*ZjRG_(nZ{(2HlP9Os*lz@C1RVhTTX){LkqwJrIa+&-va-nf;b$Ctm|wNTm8 z`}&JrC#3I{oWUyz|Pr^<8Rn`=`r4H|;Zy-%)ZXiOab>^KTiT zBBvsuWl3Z;;2Npu3x5w1%}G1`2M@wK^q=g(X9j{YDq51CcmN&)U1M$VC-4pI^uP>2 zG$>0U*9B4+T|{5QoWH^UT57}RG3h|D>!Qs{HiZ!kw2OkdwBT?0F7qe95_PCfQz&mm zU(;MrXGYBb%(G0oV0G+SlWMX;TBf%R{>lS`_B9 z*rf?($*+#%WESS@q*p_u(bt4>Ah}j3tkChQy%Js46l+2{^FM`*CJm=hfC1k`li-Ru z_i&w8%7x@K`t#DexqvnQ4@$W7Om%{evN6Fuo*2DbeH^qbKd1=DypK;SRBchF7-b3>T(oCycFgi=9oi6ZPGt zDQBz&vPfs3dT35o5r*&Lx)*epBb{x-B*acM$)FuZ2nGTh6dE_=(!N2W$%8{137Q6E z4N`B&5;=T;LyQ_Gt3!WLjGF-EKMW%(UKb;NvS{&&+00pi)S+Tw&KnPg3|NOfJpz1^ z6)2m2qCaECL64{MUB`kN;bU z)rjR;S#lq^h2O^mKSiPhjY23)M$jlQCjeV4BH&98xLD*M;nL13{??41!TEE)Sue|# z3qZL$4`#n3;ikZRJyWNcaZHDU_x2n^{xdTbQ>SXU2H}px@Y-zK!rb|*?d@JD%7?An zRQu702hU&#-!r`p?RSXLtXYS9!Uk#mt2{m9+3shZ$>88~67Pd=9CT-ZZ~kXkW0h!1 zF=+2V_>!vb*W^!JHyw8rg-43S4eGcT2sXob@@7q;jvtX-)9F6jP-|NipFi$s8VYyZ ztH5DjFrfvKc7bexUT7-UW@HMkW$Hoz5Jl2P3?$$-=kKIeF=@7`GOgYW%KDODe@Qa? z8j)PN3Wd38=Zn(Cm^t@!o)=yPo^j&bk_>f-W#Q;6(K zq=Koo4Td#;DA{4*%2wZXoWd=BV8Ri)7zYP>Kzbv^SasKSsUW&5Kq*>~W=SHi(~UmVR(HWq;Jz7Txl^TYt+FX%wXyM{!bWFhvqQ zu<#ww3f)nGVmMwNtLCKvhM9nR@b|m&t^Y@PbLRWj=7s#Bs~z!|=+xcjMnAd=UQ>^`!2uR|qhstoHJ7UN3`xxtfx43`aRzT^S9M09&r%iqA(vO~w{GxXT4NU*S{rSpI7Kuh zT%Ld>7Nw((V2Fn(u|7G)upMaVltuA{2Z1~-Wsfx+=tQsZTwMkYfI~<^9I)5$+>!;z zKvi{RH|7b<3e#XEPwR>hl@83xh1LZX4S6PXlood%Rh|V7@jW(qsN1Crk$pa`b?l7t zx!jn`oYqclfeC6xBjg%T!F)VUS=|5(rx`B)j z216+g@Be7`io1Z#QD=>F$Kn{+6yllb!gzmEjWDRs=0JZbFp-q_i>&6@i#||8dElRX5zz3dVDX1 zf_ZUxmoCl#E!r%dKQY;y8If=6Onx}s;_q;}Hh=uOZ3hnwH7MsDE#6>z^u$e-w8i(--$$q1SiK{HD`=kl$nHwZYOhov z*2SE*H@8UzzcjhmEj#c27z&U%m;T=MUln>Z=n}6hGMneU#98Jn2)A&X<)3I$V8&zC zkSUx8U68rhIkd(osMy{*a&c$pqAyJ|npMMJIk3L_Z_lNlPK}Q7zxf({{`JM?w6XQDY%ullNu!PTtUK-~ouT_t4DJ_yCY^NiSn$j4 zBB=(b!lNG-;_9UNzKIbSqPOQY+Y}j0%vY6XcBA^S$?=UT`>8vE2bAr~zg#e^v2ast zzuI=#_01;R5}3~h)9RLM`Oi4UUv7(?@Qq@i(0NuB}C>QGg(K;0Zh-}s1 z|Fr3j1Ex*vHBI}`!QT-y9QS-xU$;?GeEblIea-&@v#9mL*Z+WzCntN~J=J=%809yXm`O>TMLdw(%=ndiH zCEQv>A&uRFY zk&@yx`I%HxHO|I0?NM#MqC+~pOcepuNvb9SjpaV{0s&-2q`i1-zi&p0y{Pra8*kW!vQqdRwJSSAY-X^ z)c`cY#X%1)F=h)u`j-doBx%ql4=c%8r z9&q%4L8bbjTX-n0`B4wd;20}zQwwf^bXa;`_Bb(Im8NEL_==MBdE;X`MW4urdgWW2 zhQ};C{nE}Xd&q}{zZKRk39-HEw{fq}k31A@T`4^9rE;^4+f&yAQHXtDwb}Id*UIO8 z+c`MRJ}CT&+(YVK`O~vv2L{}qIZz0E_Xa zF`KFnk}!A02LF;SoC7TM|GNipIPbXNuhopv`~EBblsX7*t>5VU;Cp6mnAu@if_dCN zPUuG#kv91EA9*G7iV|h(_x99{+#b3_wz;$I50yD*9Q%o~V30zMapd$ziVn-N3CfP& z78VwpP9r4qT-3qxY}-1{Qab*wD_j^nGzlQ2kVqo92xt+H|V2qgrB6 zfs8;`&vo7@b(`&e1byM&q=|Spt^QJ1ZXqY!d*^~Y!E6-j>{YTVxxt&WH*u0!A&l2Y zWY63ATA86oX{`HJ0V$qkbdJra^nkfVj*UnrW-K|ht7PF71|dlGf%;sqC{|$jAlpOL z&CI4$0RBvu5;DP5UTiF01O(+mJSNmp^#o!I)Mp{SWOj&;gzsbV$R>r$kS_$)18O-$ z395+fAdj>uiHd|2nG%MK?~_dH10(=~EKQJ$^-S;9p;!RAXM{5>wqtRi^eS95a4K+c zrx4T@1kMC5G^^<4(W(K?-lTm0_`$m^+ubRrT&IVj^u5NVZMQdB5+(ht01G}aLLCPs zc1TsXq{nJ#pZ{v6B5}o}#IcU@g8HO^S()ph2~#T;U7e$8J(=cxdg$ImPi2*#yar^{ zs(o0|FxQDR-U8VGduS6HJXyKTdOuydr4&Pj!E#Sfp6mMb42EX+plM*wrU?_Anl~?9 z+A9~nspuG)_Hq+9U}njps2B@pe{FAjTI=RPw!?4kmUe70JfnFI42o0`J?4;RLusa} zEnJq86}i#+@Y6_ywc4yM-1VQv4^A(0fZ@+Q z+w<;|AYk+Z{$W}z$Qsa^_-t(RCHsJNPHyj}eTR*=xhQGJ@-tU7<7WPOl0oY}#64Cl zKbz{C6Oicw<_VIzK$W|sa+>S5YUCif^4(?gq#N==16qId;1VRbYS%$Qj$Ul@ZQ5D} zsL_4V$WtmmX9520-_!Q%Un4k2f^kf-!Q*OLwLV~XpOFdqUv;C=5I0r<%#xRaI0~@= ziOO(Ln1WI9Bhb}jd<9&&e1BC^b}Cz1n?EseAQ-p zRb0IWtV>1!zNuyxSn03I{jHMKQ-tOKQf9WcFH4x>MTn3^@#+Vl}h30E4}ql3raYBgkg(_|o-tMmw0 z0#?1CLd|9S9vd;Fb+?VHs1Um{@3xK#UD)$*%1MNC4@(j!pNi?eHpQ5fW-yu18PkD) zO%MA7-4fr>g4Y4FN53uGa z>wty%qpOQZ9EF+i6F;v2BiVT2Gj1cLV4>K-|M656U>C|ph=U>MrS0T&n0Sr7rGc3v z?u12d1fS$i*GMm?NNZ{IrxrJVTv8Kv5Nmwcn{ZwEYBbtSs-Awx_Sq_FzBYqURWLWK zB~qIjq3{A^beMF7YTvaUOL-zi`|B^1-NPT38V+VAJ|FGLf32VnWZ$2pf}+~72kPfnS{AJ^3IlgtH=_a&0Ce<{Ddo@{DfHR{LjkF4nLTWurkH?(7%AWEEb&WsoA%gn5ZV4bT|jD4;$D z(Ofic)~aWfO_EiU5E#+r5)-7zoo=8{isi%1gjNyA3IrKMH(@v>JfHw;K(Gg!m%_Ou zsUQ8s=86vtD=A)N+0;7Zv%}3&bY_?`K#RU)3j#FaiQ%w27x+;vzEdDVY%%y2cfs)fQ}X&dPRG*IhMDlfGvw4IA;qkPkEs zM#ovvq^y?XC9^BCvh3m;-Z-gqOM=Oaks5WMSeDvm8igeq^C{hJ`Ou}M(*I10Onmw9 zxX~s=U5CH6%=Jtyad)7FifGrKw}xv|Q*O@tuuUCU*g5H9wN1OPuq8gtF{$>vIq6pR z&Vui{uj$Skgc}!m2&?te&%~p zfNSpA11#IUCsOv~ClC!iA%qw2^!5B_4OaRu@xIH&sb`;u9Wz>6_CYl8aQIXNZRo#g z+v7L)-uV8D`2P0-(+4K2Uby(AFS#=!%`!WhXdYHf#Ec?TW^}92Ayf9N&s_dIkvZc^ zPF}GyVy92P#FK83-_&BF94Jif)#fs}nB*xV#!qstT8*iR6t5qf{)Tomf}X3}Z|4T; z20LaNQOPLL$tN6{>YR9y2%*$WHJ7HhEx(1~qMv}n+XPZs6#bDd`M7ZE(?ot7wud9kQcbPt~9tMP93-u}I zK?)SISw=uvgfE&xX8Hki2sfY(qYC^rGV7G2w?W&-GVPeR479dkt()AaM?*q@sS;?PSS=sB4?b(0@;k%VU2nGRtaBoZ?DRe`C>$JI8TAdN#)|2dVjUQj z?<@<@?9k1rlgF$tnD1`vZT?(0@OgcBLA-aAH-Fq85Bi%P$$!T#*#ZLc=yQoP-?y~| zhWj0v%8osz`MvdT3lHSPolo#fBw*ub+uXy$}pZha%INZw!04dpfSkb&px{! zmi-@>_O`ped<;#0xdk?|*|@u~w>&CiL>3P($)xOGuG8g>!Tn;C+>eY5ox_x_T14OX_B`XCh;@FWh-i~sF|B<9&+MYD6>7BE^B zm(*Wl@&iIih;^no3h)JFA(LUi@W8KOLeleuixCLHFaDcMl)P2Y(t5$aSU9~Kjq}c` zrVtEbcM*QDzmjsc>aVao)l=KD5|7N7l72cN;rUjRczV8e=ds;m8*;Q^Len=brk(-S zGKD~T*cE$REwxwrt2;xim%3lfq(9X*Z6G1g3Tp1h)U*k}K4rs6$|TIwi*EI*+Jysd^XNR=O>3I@Hksa)&MO98*E zv}D*qv)|hDjt!;xq4mn8XD~vgqjc;mkBmKV+Ij`U2A?v`d$UnCsxl)+zgWBbytz#K z#ErSfOJvFirZrXTd#d;>J7ENmz6jlbQAnlXR*~S23z&5iu{jYyDY31DJhWKgU+Av@ zx`rTte$qY0>Xz0+O5D3C6HQq~;8W1rz@DFr>*0Gt&{C+=(7Q79 zR^If>6&m01#KRNXlnD>X7TFs+MG?=(I-9CwALtJsctWE1lWxYu63JL^T8Pa$QL(x+ zbi+XBA1$@cxJ4>Sv-I1lWZz?tzBFsJdTK%gs#de4{$r#H6&BapFnYs`Nw1U$M+y$- zA2qJK?4p^8wQtH^Id~w~*)YN4$Ps>5@aW>z?$=OXEqQ&wsl{i^5!oKYHZ;IFl+5WR zPi-m+#iujU0?`Lt42x7DP5+-2?Mgz>mkbM}esXXhN znK?cQ|3GkkwRu+HJPbu(rd<_4? z5BPIG(;o~JoRGS0#U&XhTce{L?&PDc&SVGiLGeI2WHtLRz7$j3OB*8}01M&sIm)0chUS_pcdz<7n-&dg7CSdV=Zqi?^S zrJJ>c>$R1i*+1>ttl=XX66#i%I*J_yM}1S?-zjTtog#Zql>YkiKx_B_Q5tUd$Pwcn zkhYH)y807o<6e(o;+zsw`Ddu#)QW44*FMvR&Y8kxqf0XK1C0^NkUu*dkcm-WGF&=? zui6CjgEkX}mCJF@VPCoBiO~Z_m#lAHkt{gy`0K6D`YZGGfmb%=`_h|2^;<``2=nvb zSnayma*7;RNkZ#jXXbl{QigQd^a^zD1Mv<(*oK^|r0=lO*#H3jLBxY!&i3zb{iRdA z*Z92{p_!~w5ET4>_!ahoMdajvaN9}T^1Var^hz1ng%l3XtBPV?&}wug_)7&q`TclA zF4{5D@s}l|)hW4W!u)R2d*Maq$L`5?erRW4SAyNe=n{xCVQJ1BB2JKNWf?pX6MqnV z!CRyK+W-C@NWc0lP_IeX3-#dD=f>R1h$++OkHD!}Bf!#9BT*8H%8Fa?(5s|ojFFWdQ78r^5aDSQcsw}6YovOCH=Yw$ zebF|dFhw=^gJmz+eHx|9Y!}UGus9Ts)AC9Je z5ni&<#a0OMkYMsd8b>(fLdgsanH{#&^6b(;%L%1@r&fJ-z{!@Kw~w~Ir599AbFXra ztuF8sF3M@lS7)nojkx2~s2uknRsw`FRVNHW79Z9374CwSS2;c+x=v+GQYKm@Jg!6_ z#9{QeJq%0~HJ-stH|p7unxh(E^aXR5#KPD^1653}Lp2b?b>sbADz0R8Njh%bH?GSz z0Q`;d@$nc>kEVGc6%OB&D!;(wLU=w5vlo!*!t8}8yBNoo2I+M&muXpr^Rn&>@AUz*1b6gL<Jnmt{{aOK~K$zC6bDiZJ2UqDJRoS$w=#UWhl!B}&0 zaY*iSEpA;`kLT0ByRYa5)<>Nv)U3N^F|}14@1nRsY>hO{M~lINWpi83<;9_^G^$(| z8!5oE&?E=E2>D9pFL6THlK1_BzJ7Woujhu}ZWqzfaT2KMJMO_K;odL${^Ni9l^L{M zR8-c5j62y0m=TgjAQci%J>W<c=V04Rka zB2G2=KABCQ3ArDpkQw=&8KR%Tz|jQ(uF#oa;XTOYWAI7Bf9vrBySx^XnU|u{+?HJ_ zF5CJZM?rD*@vi?%*_Q_-nP~05fLo-NiKV9Io=}<#np=gL8;T-mi(`{%3oz+umZ?oM zpxN?f=0b&NM#>_VO$(N`%(aEACQ5<4jhSQS*kXHDv)=nVFV@_d`R={n_xr;F5y6-D zJ?A;kdCqgILuGj0o zCBH~mJbMkw$tY$kcck~!^g(l~kor`g0#l9~eVsr$$X8`nqekLMr@RbgGr&_BgcK$LU}d3g7@Bd)9!77;qXY z6{1o>`C~F4DBmVmAaR;t7ws@>qzP;az66tgVW6{PoM!Gu7hc8!YHjlyFe+OELw#~W zvw=Iom>I@6eFc*V&>)&1g~*YaEC!ho%>z^LBxq}*p|j;ddJeriY^cj)+=~NdukE?C zMgy>#AeoT{+D3*uYpSF2&JxFHp7#~;(w>YCAMSTHlV>{gBwpfzVQ(OCi?& zoRac;05Sw2!%_U$q=Bx@crd~k4)~_Q0p+h(>v(W5zzjpBg5hezUje)YR#*Nh#$mr6 zD2?&=2>o4X#(lV?_rc`@t9A^420C-_C&0rWMqDuOL=;#NgQyD2xQ5We5>y`7!7iL574Y3(9LO${UR%6Kt$w92ouIAPST^5I6uKV1Zdd5N8uW-ba=)6@hb- z(Q0%oQ|e|?3*%+rX->KvguQvX*W>Xx=ivk8Jl4B1vV-(%;_ZUjk%3Z#D&eJp0EYE|} z2fN)OTce}NHWx-&4)!Jixr#NSZ%eD_6nk&KF?)Jil)1)EVZ~58Ps6Y`E`SEd+g$q! zddyB1K2b4{hrW!mlNUhk^5qjIFEm#TOqoxVCmdnnbI?;`pC!(qD2@W}$5;^QL1AbC z#O~03Jao%QPZI2nf)2!i<=I4-)qo=pTGoqbBtwJD2jHSYv|bVj{ZJ2*%<_iB7IvB- zQJ0prst2wl`UHq^BeiFCcd~7|rg+_BKKHD9gU+5+W623mnGuwqXvZsilYh6+HZWljvbx*Rh!RHR8X}j{Y$Sa? z{+@b$>Y4{iP~6|PJEkCJ&*SbWl#I!w^T;@yTwFAoK<(UF=C5#VoCV?FRQ=Qg6<&A; zYi*6qd?>E0tWdCLt_6*jOfpX4bb=ocV8m{2UKEU>vW8hxFhD%ATaP?h|F-$P_H)UE z)hqS~e$p1Z>Z&>h&^cB|Lr}qDl|k}g=;2{J2Nq7T!8+`Uhc}FcG1WMU0^iBR`Xz>M z2|srI#-A}Bg#UOON@zo1#Uiu^)@s0h3%uHg7lI>Z2nT88ajI4&gxIHocjYmMdNvK9 z)Pj{S;!pO%&Sch8C)FWiBr;x;Kw`fP>o)$vK1eLO&#mi_7`@iu7o;u6OpNaO_423L zssmttu7);cn6)YeKCVgsyEx}B(GDx($yhjp{^xjj!J1?kM1!jX``M2X@y|6QAm5J& z$nZagd_P8M_}^4%tByU-n@kG{bPgGT`HGbdya1NcD4*d*+7=TBQ=70#ArcG>_Cu(uZgMenYDoRMGQ491Fr4+E zePg3A17~@Y>qoP*YnrFrQP@}q&Oow}rfa097}ct=ljH3H0b>278rpUiGZY(Vh=S&_ zVInvO^Oe9SqhRpg5C3|=S|H3dsgJ&es#ZacT=XUQRnfDA?+t~NmMQSv5KEi z70sbSeTcy(5L3YHCV&~_oL0xdoE>Ap(W+|=)&(=Qlc|G15d?j~c$(p(4FD%w$Swhi zLonAvCxZZIBIpn>YmD-42!i=>8e6rU6u$;t7)3qtvu^TJExP@NqtblqhQAv(3f9q`Kdve<0+W3PkImC6`s$yhng&fxcd*@lmX#I zJ#M9Fjc7%n<%0_DT-L-XFPb(kgx%zL7Pm}UrtFZ0O}d%Lowyl1#W?Lxjd%MFYr*fF z(Y3N{GkdQe5v0L`$A+Fq2jn)N;EYsG`CK}{6*39$?dOVDlaL{XC&R-7 zv!aJf6=YL?j8uT_;;_L+0MAk0<00|mwKpEH#u;F|K|G2@#lJiq?r*_DhC!>v|5F_J zJuYCyD}XSA2pMt)(kR4p3&0+Sqj;*B9@b4DQ?eWDtr$oI%|vm>*c8uqxzp7awo>t2 z>P@rwF8TuSkFamYCWiVq@0c1;xm9Uv3PLgCzF*Fh=h|oE`HpAGYkEQ0>K@5*3TY+{ zzG4OBiIJ?y@K;mH#b8^!=AZz?zjH}eiBu4_!s;D{e(D%R$p2ML^rr|3CG>~Lh=Dll z>rWLn1cu+M?f-JyP(B*w(g4AoRGakN`?Gkm{I#sMq`K+d_F!P-)ay);~=JjIS~gV zVxYsx#IsASx`*mO;D0?mIQ;h31F;v5Jn`oWj@f2~D9W8avrDhocEsb7WfJxIEc=L< zwB>CKpY^$ghbMaF#8A^0J1xWS%l+RjT^;{7ko(Pjq2`W3h=8`-Zv6{@>tJ5*cVv$DT1 zFPe7}ZxQTwg#yM|Y7cw~k3JQf@qVVg0QN|>`i=9pVwW$8zd=90IYU8 z3+!{Jt9k$wgXl34HU(yT0+Y_qoLmoX0{Q3py$wr=-0+^2=?POpWUt>`lWBaod_h!jv(%?iq|K7y zry&~@cw<^(k%l^#XTqpr%(+FnlpreyXKP&YWi%(S$yr8CU3?q>h{cqdhM0k z2F_JA64!BD9aNKx7kxs-d2+t*YtoR+Yre9TI_Qg<3PPELlNIExBbD{qJgB3gvpCmW z+x|4PvYHE8`S!;9nF-n{6xYkTeENgqF2&p|h5{#!oYopw;g!tFs8YM^-8mv#=$D*L zm1NwWl2pR&#PwAUn-eP?h$hrI#hg*~f*Q56Ep?k^lLMqj{1%<&5;D}V z6^HVCRx}9TB{;#x*@reOqeGgP7hAFOE4=LH&9OaH#N-+TTFTWfdd!jBc%DHDZ$YY+ zL%@MK7r#UU4+9I@Kt<&@0lwFX4LX2BF-ALKY%)eyLa7AZQ`Q+ff=#sQ;V@A{sCSwb z`*cm0;0kweQ*(K9{l*q;V%HtERkkeZK}gH3^<6H7Hp~uczZj{Ku9?ROfUJtF`ngAp ziRnK?KLgDK(H%k|2JQY--U1d!%vHM>~TyMJ|9Zqr7@ z^Hy4rwe-dP00SnNC4@#j*-frwa+DlY_hHVxyBASls&LCX9&i`hxUKv*b@ ze;*tD5U8PO`xvzw0n$$EPc8f6RcgzkU}@(m-^GVkj-moT${`w zb!NMaCW0V=gW>&;$_nt501@K6<-*~V4NT(;8@?M}l`=}18@a5O+Tkj)|4F7TqZ1NcOXQKtw#wMtj!$_j0nIst5atzqs=Girz2 zrGBKr!sVej_!({K1c^gW1-S`!BgMs`jIX1+TtQu$&=& z<1{Y)C#F*yl}Dt+VoihaNb0v6p2*&n-3&+j42k(EU8dn_t9{KIN?8R6<@C z=~i1%Fv)ng13Hm-U$#NcHP7I+=QdW z$+^c5ojq^dReZyz>%3Q1R99ByjZgKjoZlY#;c8&$=5CSLdm5>%tN82sTylPDW=_aK zH}rG&%u4?Uq`FRku|_PuU&75|?dK0cNH@q93N#Cs7qbak{N?IZgDETfnr4P;!Bg0C zvo_}zy}T{@6URq(Az9Hciuv=o@oRPo$T?i-ci%@Dzp~mbXF76Wms`%r?u)wwK2Nnd zHWoflOz4SR=^%`%ifO_1x_ky)QJFR1dXBAZ&34HE@7!N|#9Ob1r9?;4?`QUM&+X^MBBfACd4M%oN670DBQb zSdTA_KV|^3JSKFV9c_Frhzk&j86vx&{3bcVmG9ceUFe{{WD6d!lZ!T-C9&^-W{zgr zNjgsn2g0bvb$_lp3Tn=Kv1xU%h!BD0p-o)bT^RnP7xd)-$dnSjIx$O^VD(%SA&P^< z1yQg;W-CHgb(mE1o!So_XK0}Ogg=EGB8AEu4si{2E0}Y~K`^$|z;GPal><*C6OP8y z0$jVW(J`2?h0YjU;vl~Pn(OXpEXh8XS^yssD6ek8mrN0rp{D{22Q&!neWgpfFYTuyonr(9tNb z5KVlPXY9AhS>j{S(ZDJAhqLT!Nc~Jgs4kE7jHLC#&t|2Fnn-4QNc}0&Vs>7F+3|r= zn3pjsl)6gQ)Y61Sg^dScuQ~w+TJFH$AezA5J+l{UWtn1OU0$aZ!MWrCkTv)hHV3@W zV~XK@fsOfuD2RX{#rs$P2f9A~iG#!9l4_AXIrm6zp|Vuz_}NU){rQ&L_(9}Z;pxGh zhw+0}P_%i;x3jx-k0zT#7Y3Y9VPYB7F@y(gK0ohq-FHBp$sBw3b_Mk*x@n^Iuzdm% z8%=6ILQbYFWCT0t8wFNHF}?LJ^V{b19yp6;Qbc!H*@0_OUoX7UA~s;4b&y@qiqIxB zDu`ZQUU&*+`Qbb4ixp$I6(+SMN%*4~tU;!+!#k z(kiDbZDG_hm(A>j-h^2XwUx&MvoapX{XnEewWG|Xuem>}J$$V_p`i;0ZSS7q#YXxK zgTEb*MJ)BY3!U;>-=gLdH@;6x;7)12ril%D=>8^l+KfV7YP`cco7pNxz4o2dF)vYR zdt;ErIz7(|FDRc$dR4w=8!bfs3Jyg#1C|hgt3e4l(kfBz`+_#fv+S!hS^)j7zv1zMyRnFm5ha1d~qq+^=G;r|4V`{ctiOm*UEehQ3+&wJV!-bF1?i^SA-D zDbK;c5?CKR96dI8E6jqfo>?!;y= zCmbo)f6CLrq)*A^k@AYS%1&r`fB9hTcmYx4t^XhPY=V0nG+voDF zU0w?D4r@>aF!>I7NjJ%S_Ky-%^P#$uM3`60rEUv5WelsRZM#SkL9EFJ>f3Z?UO!v# zR$_GTCS`T_P*X&WcoS4Q*P5?2)*O;zCcC_4vDk$OvJ>!~O7oH<(1NWrP@gc2rL|5l z1)X(c$@NgN)J5MmVK420xYeWY>-0UcFyaqd+9<={^=)9~`>pFcLf*FQ$#dHnm@a)Y z{qqf_!7cJ%ObMPRHq{J(NYCcmuM02#`nT34-1_>FLtWH%`K(|yIrLUKw%yYL8xlUm=o%iVm-k3Eg-dA3s$2sZZkLgZ$^?Tv)KWm>lavSGFOaP=#$NFOV8y+uPbL7ty{mIY{DQ} zs*tnXg}Re~Zxfh^XL%1uP{+!yC=?mQXL)f02i+HuTAh#%9t0G$r&fK)8U7 zz8OrEqOshyxhIhcW?k5sf+gQ5Yr8$FHkaAlb?vmoW^ID{{tmbHJ#i1I0l3<(f#Du7pW^Z z-U{4AxrA;@gRmTo(j)Cqi!fVos0hG|qu^xOv7NLv1^9Po*P85vlpYk>McO8VgqZ2p zDRoZS%Cdr{KpeV1dpZa2klZVUEQSwfS+R!dAi&G3U?(?p4Ycf63|NdszRY4{oCqD< z|A1@;3lhgiA6z-$41|>jD)<=l)Z`_Te`9K4!;+9eUdgU1g4Ux10Dty02yx zkhBA$=?+;`(UC(gj+&*P)SKHQXF;pnxU8pL@q#@dn242vhc&@`uCRVgGGT5OT3BOa zN#^!1+7>+%oeS3Wy97b6M(OTMo_R4VJLDRu8{0+*@n=A0+X3jAagON_7+Dqji6aEH zr30$7e?Q(*cb+>JfNlN_C)GC@Eg3`g(;XkRFRedS%(RGUXXP{w9d}u&6>^US z=~O$lCs(BL^ouQUpKUxh&$CGiQi9y$F5zz&^Y!TW_4_ksb+uANpZZ}~xxre5nouq{wW`2M} z!I~8Ex~)P0iyq9?wt=2~xoNaTQxBYy-Hksbs47!rk174GkS`QUr@GvQ^$*!iq;#`a z(Ub&sktEAZuHRNi+tvfMJ2;{OUm73fO_-e0Sj(D2r^WgWG@l*_-0YC*IzKCAYnKmq zP|Sg0;|m=l(yPyyFgS-K*b-1yUNV2eEm_=KssEy3`vOYfV{u`~P^G2(xH^upvPwX^ zwjEzO8h3{o0;{S8i8rI7^UHO@61c1y(S20F%#D?53|?&{m5MDuULjtdvU&&p&}Yqp zi*FJytp9>#T@iQW-8UJ4hx>~lvn9u5y-!x>z{gT!C{NJfO3dG}y~IeEf|(1PLey{Ni0^nHVA*dG7v)-C3KcsCs-tC*9Im%Bb*NOzp?unZRaEC z2=3$0sAuou2irJ$0O`F-n;+}tDViA9Ud-AEeIjuV!{`CJ5aZd%Dp=HIf8d)Yi5L;Z zjndQYw^|L9Y~l9LrYDg!{Vkz8~enQt@Q_EkOc)GMi9A zq0|PuR=Q@i+sRC4qAPO~jYAl&JAFCMVs1_@`5xK4{OA_t{Y1a$muAX<$FXKXLF;)5 zmcovEnz?RNWRH%t2xqiWZN8q|&G%;@w({&Q8?O;@v?T{;*4f;0CBnwZ7q(l{=RKZY z#jGWk1e6&2S!^>+ zF`I|;lwX=Dc}b}maK0bSJN#*E|60;dOFMR_3-tQW^N1Tm0&8ZguT0P^c{Ba*Hgx<* zVBgrJGnA%#v6|iA?@e}ZkXI|CtZ&e@Cmq(*jrhGlSCiDaPax2Lyk;~1&`kod$sb}v z^}hOP@KN@WW2qV4nC%GXE`+9oDs~CcC@LymfR;m5AcM_I>%}HvtEZDUCAWix*XN`w z4(!|Q&38rw=1^h7h#AVn?APi^+O2?$C=B6XBj2UTCdk-z+ZYX0hrsNf#k=C{{Q?1s`Wp!NmxT*eBtDHh=dREUp$5(&|>g%oaz7xSL2_nnEwFJ zu}D1r>&8h344h(E{Xa$bKYibj*Ramzs9T98w1rLTS5;Cn{R2{-4c~j+aQm})Eoo#w zm2hYtxy=}|IM%)ZHh-f;cN~^x81%iabu1YBFjBiHh?A&D_qg0fo54N~aB4@Z3qcEt zv`p7NvMiqs76dpGZD`Laxohp7G-SJj){1Q-brtOhLUSw<7Q>@cb+IV|O~Mjw4S*}Z zICVnGdubm)e1{PTbjxhYvp<7t?BIQ`i2GIxVZa+hpHhvAzGi&*p9}?m6F8jA$EA zZY?)<%Cbj#q(^>x7CrJ-VqrOt>z6_}-Rkq8!2($^vHd}yTb??l{P@qPN>a5?l6l4Q zseRq~Kob+rHH}NP*T`NyOhdoqnsXA~^c^gJ#kiLQ-9yLj3^sja+e`=8?m~;6|2DSY zoW0})`)&=2Ed9~OVQVQ1W#L9?lVR$*NV%|zvHGDa-@5t8=r)(*;_i(ZThVJ@>~nv^ zFk9`QJ01^A!*xmmF$fy*d5IG>VcD|;PUO6#iDKsYW}L{ieyWrRVcaxxHmgh>2hGoR z^Ufw4&%Wg<^F7(qw@@-vl6>0avU$q;+#hABRGd>^E37KpFTB3$P+Sxa$aiFb4pxT*&X(EmJvY8WG34JLSK70-`_qjjCWr)I6J zQ7;o#cG!HXoYIN+vNJhQ&(claI-FTmNZsD*MZ!_W6qc&aJEQEFQjN2NNr*Cro*2rm z2qi{ZH>*Qv4#dytseq}u?HaQ5Q#s$s#Ms-jP-;QD{`Z`#rH-@QuXep^{p^Nq$C2d6 zsZ(qvRnXdFmO#jjfJ+~wpC8LuY;+vt5+x{wR%=H!uRts1VLc}VRz0kzvO8hj{uDD; zDZvztc}%l{kb?6UsO+PYdw1Vq8hbwXnmouya~(2k&!RaGXj8IC2Oig*Aa}sK+KI0f zubnAQx29RTC!a+bty&?3zPW75iaFxtC4$NxHs5&8bqgf2G+w2zO@q$+noIE~sc$p5 zzcO9D`7A#9NI#qyv}?hnRVgV=Cq~p@F2m;=o-?~JdCkUh9K_`YxZCm&V&=r-kxU5B!u-0pr&a^r63mO zMdKvKj^s&HV5kv?p|YWpLU7ZYMD0OyFjJwQNS2_>gqeBI@v(^k5RW6kMgxZ-{x5Qh ze=a@tpixx_2WV%FmZ9$h+E&$)LARO`EqYTB{4*9r3rShXS2SI%mezK5)Dm_ zjgUJ4wsY+y=D;W#!{*fC~JYl!1Jx=H4h1~K_rX0*$YUSe79M# zQL$0B5QqVaA7_N?@UGv$44{ZeEa6z;(%EL6%6Di^KhtQbys8h1sy=94SVbGhpYAOu zW<-|j3L4(d?+fa7{YDp8%B~EEKi!?2JIh8&*?hbD96Lyy={zeAt#6%6!dd#oMkTPt z+_a1+D4|)I;E1kdV=Z&+hBv%n_=G`} zzJ&u?Q*471%vO~%5%Q$8jh+l-t||4t8lDMLLS7Et{)KU#NBOjtp23ZWKiL*6B?x3Q zsTUG81P2rDWpk7_qd2mDr1Dx&Iji|0y3!q8Z;x#D_6e3(Gbpc%q=XpKaM%e>CGM(h z7mfi!5COW0gp`Vd%14BALKMLJ1$VWsj&u5ZaBB%g_-%s_7wM$RR^~mc; zbpXX*-puf!q=RLboh>3xPZ24yrBmIma2M)Dvb(5B%xP*JZyl)h%6+^p%%fz3Yauek zw>u4ZrBeodo@b!HP1J8?;Z*G~8oSL4I}4#u8%GJ)e)dZV)HexKk<$RgKs1U6 z2@rHzNh~|(C^zxK2H}slO!i|xcClFZ4)s^%fRw=3Q7L>6qcLGDM0q+p4c!lY$ucDl z$xnVa0=tfoM{kc$$POOQm zi3))rq++8(bu=V6Fu>~6AxSj{8Kv1Z?uBIv1=?pYlX8(y@*(?@Ys08x(y7getbRb&cCAjAN3o5c@u_U?FWA+ zrWS@VMyU5eE=C8hIXE!z&hfXKFIhiZtXX_IoySQv_4b0*`O(s5Xw_ zLF()_E{K-C)+C*&JT04MwY*xiSTV|Q6)okrQjbO@?V$(tWV2e)t*_k$E54 z53S)!U7;z8&5e74X*12lOFakk`_pP4oc9J*xeV!kml z3{G051k%qDFee_Y*eJn)J0cR0y87K=_uHF>?U7cMcJD2EjRPyQDl({>q;GGslbF5h zDNm8ItY90}r(^93uLsyB^SUC%5Dc{g)gV*P$L8JO4D^cvPTqhnGqE!StCQd?fqk6V znS&`|&D{d+Y=B0!*xZeGFc{R}%Ecd-hwi@56zS`q^<~3iC6Mm#_mwO>V_g#9fmt>^4 zpyC5|u_Kk%WDo8jA=z|xUU$l!E_&qTFMyA+newtwnGYMsf*rJknh43N11D*ZE1Z&18&V47_7@tw77L(jdIl`GAja3+ejgfxZNbpN(*vSMQ2iL}5a&P?NU zhYd1fm*lW>!LxXp&AF3wx2q#ZSSp>0e-4`S^GeLJ^x8!G zg;#39XQU<$%;Qwuczb$*F3HSKgG9xo?dOm(pyEgO+jtSq8+98kC(~|GThUzSIp-0o zPqFTlfMJ1gWWTc0>ck5elh4 zn6kkZI~{vqYcyn%9(0S#5Z^*|BOm>WmjN-qQ=W3Z#f>&0(Ns*w!Op37R7;_?7-o?6 z)ivm0ba%c`*IV90God7ur)+ur!;Bn2vlgD^S{9rU@B@cGU3};L++w6Pnj6OY3;*!e%c2VzA7!C-Lj!O*T@ApXN|G-y){6a%JdG~B?#TNI`( zAHM<49tIV&L0&xtgR5|!!VV@BF?ikmC(QaMh5&vTGsrQ(j6X-+KSp5eHdX+|qp3!q zd3nJyqP{HER$3WTe@IFb!Bw$mt&LrJYB>nXoT=;`a@~i%8qgGvKO~lkw9y0~QyX`} z=I1LrB@?d(9ff_MzCg_FVDeHP23pKZB>Oey!C=VGk;_zRZZgSG9gFz{Yr=Uo0q=VH6qOtTD1NM`S)QJm6b~m*m z0paXuUIKuxHROeF#Ce_4A@J@1tqI>8pC1ii-5L+km<1ux4`eo9dR+iGCcWFQ7g0q} z)DCd{fZM?HUAx+-&C09ttUkW$cd^rK<{Qt=_FK9=L%vtN^zO5`W6)h&u~z2Ucl=a& zepKgCCXrEc#D-c29lVGWbt-|l?by#f$0~&Bvs3Tha^1hSST*@UuwutDOuXhLY+5Vh znjsG2736td?MpRQHP;koqA?qZ%`}NLgnD!;c}MKff#I+77YB(M(zl?|bwtVSV~3}c zeNB1D*D7uHyeHS}9N6LeJViFwo29`vYp*R($Luo&;WoLFF>_y1U~aSAW(=NqsxPO9 zU6tUvOEA?-VFeB+SS^vLC#FFHEHtI|6`Js8nxeH3pBf2x`O>pMEYuVW)FDObV$P1W z?%n<7OhQcBW(T&3sb|BN8#|?hA9+E8I=8SD+`w5jjvU)J+NQ-}$5|CZP5U}6?xf?n z9%};Yn7LoF>$7$C$lmr4*{xzTBX-I=5OzF{kHs|^*(0B&SUhI?1zJh3Y|AWXKaw*0 zSwJ@oVXKu@EZD6*1hEsV#W9&>1}K%rZ+#@eXun@sgCLFqJrWhrZDg{zh^k94)A;J@ zWc~sR>cH4YSAKFp%P(Rs@qw~9HJ|LBg)VmAlXjGqzH^f#*t15HSb&x-2^XhlpcyfoTB!FYjm_0A#5wnplkTEhVEPCOE6{S;EWc^7tYy#pX8gt%>Z@d+LO;THS%Y)_nfK4L=Y!92KE-l zrNr0@I~_F8L(6rYBps;e#q=Tvwi%Rj%yVxg^-%X|Vi9#<8DL|2axZ_zX;L})axp6q zLGoflhss~YT0(zfY^xx?9;<&|#Wip&1n6pn&Q4Rcd$jz3Pp2iS zVyt5)Bx|L0g%^su1)ZlK4DkJfjs?4xNFA)$;k81)$KvzupS(N0QiH5rx9WncYP!Wb z+xIrC`+~uO!wHI~*GUBuqE+F>b?_e)=2-IkuV0V{{+N7JtUo*flfuJ;kV8}u z9^YWU9QYb+O!{8{AG@u>s&33W!2=Vik3R|OKX~%p8~4jRz^|~$1U~BtU1=-7 zyvTQob>s!DFO;YB(6p7sb6OF1rb_dyzgL3GZ3!kFN;QFfia&%8iFSfR%2k_STe<(w zY`lFkc<9EdgSu_M*e}6ksDjLxOG3_V1OWr2O%+a@7RtnLkQ(Wf5XL}bluR>syc8Qb}eC)qBz_Yp0Ud)in9Z!BtEnymbR3!Hr2iyYnIG z-pyj7Nn9De@)s7;)vPAN?z?RdNf$2#D-*uR6uCK%NlacPT`?v76Pdk9u@%psRoNw* z`z`OZAPQM*)$kknA8GGxV9$xIrcn&Uv&OF(AG%Uu&y|>oVR$WBHyNWR^lL=h#MxnO zLD2nRf{!H77)Xk;JS9{1sgPf599Lb~91-Z8m9S{A(vRNZDVih;pCRn_bDyZ)=YsA~ zf@}X$Qz99;Xj&)Ue2ABu{Qj)&WS@Zl0AKodYQ~V*KU9kwMnAWRoU~sSW7lQEpWQrE zDG)O`RAjIa2J>W8q#S26!G;`Y2kE3I%2vvRa~!34L(Mt9`>q-!AqI6P3HY-KQK5A- zGtPKQfsY3&M>vIH`!-By_)e)y3?}3~PW^Nw&>bg+$?YN0otBYD*-t4-QGG*4OR~q+ z_SauWFjeKI-=^*oGlo~CuCKWfC^|l@dLqI_?7!;WyQE&6 zX9vDr(WdlNhmkti$YGDvQCDd#ixd@HL^90YaoxWBB`@M)x1Y=p zi_UZ39!VI60OB_hLJ&B111D$S{C#n2!?u_=-&b+%U}R<)s*7)y+ktx`?u0{CGOPZ$hWhY40UNY})^<5Id;%aIh*Q{+ z3X`yHtWW@AmX$Ue?A|D$~dz|A|zP5Gk zi5GRBw*sji*Qc6)UHN{uf3Q{k>6Lwa@>&sBUL&%xK&pbR8`2HpZEY9sd8oWTOIy3H zG0Lyu9&edlN%lN))!wb2J2IT7uQw{Bk>9PO&*%CqUq!pr8j(^>8RyyBmA~U+1MEt&hY88=R;<^{3s#n<{^UL>?L_z1^wVj`k;FtEo4m1) z=QIZC<9ss!dpf4uHnbSAnEN3I{5ebfHEY0qESh zOvoC3pSKIVTv!ieJFM_A5cY=a536WEzYn8akij5x8MNnEi}NGQ!)PQUNKqaH;>TJA zxSij#4(9cNu|-gkVVMW&AgmVp>z5%+|M+DqrLnc3#|`qjUA;j{G@e+7k8T^BG;5|J7vMi zX_a@oraZKpuX;L-63JOwI`fAmz2SL%4T%&t|2d?mu3vevkKrCO-S7V+na$@+mWy}^ zY#8yfEl$}&xnMKhOX^pv>^VXCn!f&VmS)1cBj0gy`pEiB=^>#=8KmPt zuT+1IjSm=;5Nk*xsS5%d9l`4i^vH1KsU5i%-UwB|puWbmIfJZ}c9IqFSi-}^m4n@| ziRVBA^lgw@=@l+Vl9`E`fr~Jr$P)XhgP~S_9LHh}7PIi-$w}0{3=e10uLO;cvGepe zmhl+rmEF8%ygieWXXVJfiwujAQv89F;R3crlcZ^88xrkGec^4&rbjx-Ych36f2knu z+!+2qTV6Q}yg0r5Nryu0}tIKIFT@uU?b{w zD$sC!3%R$gXV4LD^R2dE@k(lExtOc4&-OE?Ug`zwfnLD`hKwrg1Q2565enryDW#;z zkq6s&NH5p(W`jLrOmf1a63ixGsipph%*)+=pR`fy*>!!Q2(|NU@&nSZ#BBjJ>`Xz0 zkyRp+d1yGFMW|9cn>^M;l(NFIP<*vN2lrS*rv>7VS}?@O8Z8+Mwj8`qo0U?tuvnXg zje|)gBnO2X8%Rx3y0gUt8T2i7SMjlY40@8 zGd3srUs=$dcWg*bynHIZBxF(+t5tSsgH4Zd7wC`*2xeTJ)tfxF#oT#mZLi|NpQQFu z($kgGlN5H+-9$v zd45s9gT2_VU%V~p90$KT>aMs{d6ymeo)`R2q!)SvxZ;#K^>5f=lkaqqzB@xizWxBg z4gAZTV$6LTwD@zCGS6zhLlUVE(DAU217XdJbSN$uKE>3Nyn&_jH2!A0=%jZee3z7h zM`Q&h_p`+@e!m{#l}^639~#8M3{V7fOiuk^c1-YW*|Ddel^4Uc+2lSXC1m}2kM~ol zbq+zGN$FU33X1!)>swrmvZ{JdHkDt!AI0gfb|yHscrUP9&%sBX+VlMVk)N_&*SGTa zQGPY=-SF)EPeXiXS#;lbhpiXx5C~c>l~^F3-HW}xH~RaLjukf#<~eVKxi|A|GY7~5 z-m^PF0ZA&C#*8HQ+i~fCqh1~6-1;`w!d7=}@odhUX(hZ}*FSB#Cb5_ij%TpH-+8%V zuN90RLia2DwOxo@9We8Haf&l~(y=42MvVjxdk-{yUxj{ARkY;|%i|<<^CSE*ck{Jq z;sNqMKFPTov9q-7IR_`%7pzRX*R#pq(R^)1TX9xh?v^NIHM`_gKm}zp=ZnApyclgZ zLJ{?7JnQD!Rl&`PF*zzoAyEheA3#61NqMx+a_X*`)8FYgef1@O7N*|8R0GK{;BL5K z5U~9I-H(s{^?yiBAa`+WHl&cI(LX#qULqO1Jq%;J82Z63Q^Tby98YRk?lWK_!z&xK zufN-0!Mnhkm(axo+uiXp3WO^EeG!0xO@wr1{685xA-ujpj1!lLEffwyg^RfN&7?+% zHOuUl4a|fQH`ug4trv z@OMfrb;Y@W=t8w;tlafiZzum?MR>ER>FXo^sMjUt_ll-ErN6WYFnX0hjEcoc7G1q= zhNS-B{h7)C^}QQYbh?6mQcdJ4)j^VGg?5wO+7pt!HkjCz3641+w+5mE1e^JcO^becNa{=ry`8nmcE+5*10K4L(LF0u z8spcTyyj3e5FNui^7q3%G4tOF(_vO%2|2tgCUao@w9nJdmTzdW&$vAE$!F26uG6he z%3AgBNbH32xBd$=Q!iQ5r;JJfLzu`A5 z;!#Up3Ki!O3;hkR;Fet;jcH_@#+$Q-v^{ueUu8)QsZ*+*e8=;sOTR?#iaYD6_|(KJ zbK!z}Er;K?+&EZpc&0b)>WhCOdaGyYFI#_$+3^*z(~+{YTZJUi>BYy{YL}X5vk=~@ zbKe-d6i_b~NhT)qTTFPzT~@eO+DBfKOz4Xm?QL9h52a0_CxD)P98d%I3m_XIUzOeE zykPu%`>ZFP-7v&=pNg8^JqDXFL4x7O7z z%e;DI>$miCZ(RlZjpe>8UdfMG)t*8dUVW499kHhKM%*ZhaCUy#Yuz>tmnpP*d$`f< z9sjrEDRa#HEzUPvHRX|)zMdD_n-)9j`Ez%c!|}EkWwSv zd@tEo2)C^`=Lb2WfsEXuhb}IwkL|1h-mm6PH*O}{vHm!rb40ccX|^rzHpzR?8hjXc z)?xA1SIS)lA&Ru-eGBSNlW_G}8MwgW0VBWt;rb=Z7JmmN+Y;MWQ^w=h z4vVvfJJ`KPqfZ>2>*R%3J?injr{Q#YI$KoSPJ0QOx|b);;gW2J1f+fGH*A0ItywhT zjVbTj!V6oJY3t)oAlr4MD{B+)i&Y*AU&4~X6KO|emyGTVh@?iRvVS$M%KRZ3#(M{{T_F> z5UMaXa-5pPxWxbM3$o&e%kRVg|59XqtnJ_dOq=l0?%hyqdd#7J=ve_}XvoJ{7KEG$ z6`X;If!VB5tk85C!*Z(j23GlD^yKeifsdu2#*n0eEEpdMANw~y^6|OupXRoOoOWK@ z8fE*Fpf&jFT~)WqSNlvX!jO~``00)!Eu$CGQ)NbGsdgE%C5s(>0;-Wl7}^9n?~S%uY@?fyiN#n>gZH zryT!Ys)|tU}4^g03_%-tSc7>UodSl}Zlhe0Rzk;gl%y zkv?y8m`bXuP}@p1K$nf%hNr>rLFjboC~;t_PDi_hLUm63R0VFV-nKFV^(+JNuLgbD z9b;sX3HPo=g3T84B`x2@s-{;MjZ-E$@?6J|e3^F;sFp$xc0_!+adLY1sX68 z&!$a`#munmWFTN9LhB!JCAR6107i6T6A#Gz&}JP0<20~x+y=I=dwnSWVbE-J31?X+ zP%rxq>nvh@sJEJQT`8#Kp!=xqHz)uHPY*Dw)N^9A_-Rp@xVUhhhG@ z)2O=mh^~B~QdD-eJv+zu8q`wFQyz}sQ({hZyMIr*+mVXB+Qc_K>-1ogaknuf&zjDFc2a` zNC+aLMdn1Y3{GIR0R%N7G7AA|gbakiia^CGEvNw;KnRgKphZM1;w-k+wol)Eg7)e2 zUhj8Z-;Y27$;ot|d+)vW+H2W@KzDT9!n%%oX#%~nkiU@=U)_EtlIU#aU5q$%xjsw7 z!^mmlZl{%Z| zTwLsFU5C6N8{xm|cV8}zh0f|pJO()d<#dA6L%@5CkA3%z5>|q0em=d%V`xvbGdFeF zi?+wSu5Rg^W!zXFZ!Me+wdZ|lQDLM12XjPvyhtI~E6@y+N}auUt)=^nR!uLL7x$Ms zxH@OjT-gio$m_fKH-mnvR1Z9NpLK00C4e|F>|*0Rq4>)ISNMjJ*H6M&k4m|tIRgJ) znYWo@7mf#p>XkgQuc%cM?K-NshE}M2oh>dCQIMksE*Y>V36-n6uQL3Y11-j~*} z7hnFw)`FZ1$a|;-K>U;4>3$>Yv|ye$_y=<-};qW#jv8B#oBTD4nwK zz$I&580|?()IN0=e`A%!&UZuMFBQ@w)C)WNYC!c<2l}OEq|$tMDT3vf?hE1 zy-73djM}Yl_wdj=R;$aeh2Qv-HM9P6b}6Uw;erPr4tKl0U9J8#=e%|^x%ow~YJx@h zV0@i0vap&pHI_b0#eRFIZmE%4Q?>J}bQsmKcP4td<)D85w7Cmt~ zUYN4*NSfiBCd#qB;-{TR%=aY;OAeC;?BD*hZRTEch8mH8Wq*A;Ab>!5D=5`T_*YplYWjW4-ZN!WDs0c`p9t;P}$ z%vmBDQlPN=e_rfTVDMSG-qoN>kAU?el9%Ovtc@sLKLUnlJf5d_#1HF*2|B|n5zGpc zn%LRM=m!QFVbI^T^0!zhTPl>qd9_L~Pzo)R-vj^ERezekm!^>Z{u zXHAt3Lx8Sf|8Fc+c^j~g6yZncPf-B+MJsd^)>RqU*PPO$CG3&~OL!_<9lmIdh{aFv zs}qn6PVK9AUv(2OppVwDLh`Mf(i+`ZNSnXg2y#!0` z?G_Z=V$%5SL+9;Zy9K@syZ#u7eu;&ieg9-lK1FLd6$T@yMu* zEYFnL41{6p!QlqNdpFDg{FMHYB|BlxMx>?tnmvT%29XDFVMH>ISULta5g3k>j{wt* zpu4d|WBLpub#S?k)G)I{@l-^T<&}_U!fm7D*=)BVT|&$CML@Wt#-Z>7cQlPX$22Zy zhSajh-okBnuOmf9P>6FI2Uwi2+G1;DsHU1LtvMnKRYmF^Zi82BT}O$#X_UE15& z@8dw0bR)#w_`#_;DQF;`t1?J+`t7)fHSZu8Eg*p(sa$8zyMSk@Rzlo63Q)7m1Be~ZfqpI?9fT(5z2MO!pbe!1LZq-5Auq#& z=>g0HY?v4SDu0I1f|*iC@dQx*Z9o;MgoK5t`P{jl}pH#E+~d;RdZ>C~CP3#wg6bfj?H+ z-d4+{6r)X5rCDNCzQeK|2+`!|0G?Z3tQN8&z>U@RHjl3fnWeS~$W5s=J?5Rwdm>OD z`MhPpa0JES<<{*>jcp?pwWn{1wpCgUfW+Puj^<3PwmVsOdzs#2Qc_K+mwf*)ZaDTf z7cpt1>+Fk;2WncEy(d6bBjxtnY=b~V;NX$s0_T2Bqztd8)`d$q~0 zqtoq=9-rA&Wu{tm<2oYodXFAk=aehHpiyIdoLPNsHu%~L@}er;iip_Nq>IN%@4ze! zl=pcjQK}b|18{+p?8Q8VLYb3obb50C5U!gkjWs!SumdC6ZPS1G4a1%KJdIkB$EdZ}x8CN0-XGiW6uZVWqIs4!@^uSd^1YA%?{F?7?Ywx+AdFw0Q z_M5L1Z|H{alDI1$)ax(tR_vkOu=~&LnC~{$Ddwu`AF(k$b2Z;A&1VJ@?&mLG^|B+N zAmH+_iacc6(nyQ?%fYP`wk3G%X|2IwI_~aonc>5}>TILLRPb5j(1pi)(iz@POH|{3 z>Sp(q97{_d-z&&azZssw@3$5 z{JD=pEZuDK`5~?MT93I8Op7g-|3JL@*S*-JK~tIC8rI#*N7T&>=;Nm|e3}$TtFTYc zlL`_nKlHqJKb^gQSCjTzs-}-_%FS!GS>DrJ%X2#_3xAtp9c9JF6upnUy)N5q>BX>% z<j|+gEcq%hFE9@>OSQVpi+a2wbRYKHO?`_GAd!C%agMiRr1nVCnd>cXU8AWv zI1+~1408G-omwMxUb`jZ0rmP1GQ;ou)xUNQL+LYnBV+sB{qDj0mVVo|k7MOX4Sn$s zDcFjxzY%KqtLUPQH?@|py-Rzb`&ZL*UOjng&YXa~RI+sSiCgm4%cpbvhg2gCiF=GJ ztC_aDVbBS$7PuqBqv>3hsK$~@jEpN?m~Hx1`^y+y3EA+TM-et;@tQ=xpDXAK^=nk^ ze!btpN9yh^OWX3j-t8@KF6Qt`5(zbnyZsf@T&-Z(1Jtw8>Ig1+ewouU-aE9 zPDybqG+u?TiRb4Oy-dLdr0EewO^(BuofMqe=FZjb-f8UyCH>K7zq`L#gfNi03a|T5 zOZUw+PdXYDsb?2s#u;7sQdM)+O$J<_XQ8JEc3eXaZ|h+mYHt=JHwC^0pT_lW^bu)FZDZAu^U4G=A9z4dv<({NS zEq=g~CCraVC<31_gm=t%B9j`j(q81yU?{IzXeo7}sX?mMfqn@nlL}v7S_|MUptml% z&L?Qaqndc<^*CGbe@(7B68elPT$p>MGhw7Y;V$&g0vxm!!=OT)DzaLw%*g7o$hjC2 zt83!CKGDg8f#Gi#ntjQlp86iLmG6MD zio{f~*|z0tA_m zLGMpAG8Eapw@s?+JZy~u)N_q9+&(cAOpUDy`0PGD`v?eTf&xC|S!l_lYUH3GE1Cgm zmb6lJ-J}vEGuXe619~>a9@2co>V6+_W2?)-_^|l1nN&@6cgsn^@pGKu$>M8m;fpON zMKLd?tC*!JSn|cP64nQ%EVLyMZ$`(3zhjJ&qthT}!;8e=FaJ```#*z!|kQA*PNI~6Bh zu9=gxBD)unwReAH@pFG#m;8l5`mDs!!ETSbkrSy9OizbA8#f*CkT%&Bmhq88?H1yk zQVPu)|C;A1#P!qilI>c6qq0U%jp%3b-U*K}E{w;&$TOCN2dikQb9STVaWvv;y>c)C zLz%A7j5vF}WHyS?|Kx(v58D^MvWCH5N1@-6F_Aj9Xw7tJBhrxZC| zGD;{&aNDVqCOF^MM(|Rwv22cWmQ)q1S3dC&6f#B){S$?U_MR@FIL1UCEgm`6_|Eyy z?cS^h(47P`lH3!Mn58>>bp|7MxDdKIDPOala z{bxD^S%dph#PZ>c?R8?U%T`M2DT8?fT3nz^4)il8zWMGNE}Kat+vkuMC70ctuIELb zcqum?U$LLbf`+RsBf0v{TaNjI#@L7n*kp2xHI}IJhz~bo%0iE>Zd0p@VGrQ1^TRva z!lL?m1}XU&-?9D5WL)M%N5%hgY?teHnAF# zOSBW-lL`XU{Day!J6aGY=J=wtpvTr7TWm7B-s7)Qys!g-F{9!=I)ZFPMzH907>&1y zb!y9gQ*uzYGiH#+?QG(@$(Ve9Lcho$#&yNdq2)SMU&BW4%*dTjJbHW_jwb1LnQAYZ zB^z$0Hm}$$Ka(|L^RzpWdEON18hvV;&QHFlx35W9HW>2jp8J>HkTsvW*p|_f;uQ*? zUt%{l3Xr!UNJ&2@d;MFTMv1px-q##teaT_%@XGhCOQ`XQN%5?mi!2XDBVR>c9A0CV zbhP34#wXslUvql|>9XYOyd_!ydD|8Qm}&VMe))D_x+5M#laf9l3#azrF%g^oP#E@D zZ_Dd#wb*kayEQ{Jqz-C#XTNCQ^`dXN zzO6FgrK`iu!6j!V-B_vg550$d$%{ncT7M(mK|Agot?8y@5#sP>lg+j*hRHN!S81iK zg)`^v^S4~}&cxl4!?7;+xTKx7VZ@E{rh9`=3UnVfFAP(86GS!)y*{*u7nPjyQzFa= zQDY8|>n^AD=Y=0g5#a1S2Z^>&EUATdeICD z?U6w+MhjzLKrQ|I_NR~wPpzz}iPGl2+=F^k5lFY|G?^4c@et< z3lyS1IpSsg=}~XF=kyn3f0bErA~8^5Nakg{<}BoF%DE*!9bTu3vn#M!o@}Pq`TbbQ z2j7x33gbIEUhB@$bEm^ZNb(C@Rwlel(k$+cNVT4qFC~6pKdYjhi)ra49LHLg4wYxDo^$JgA`Ke1>X|G9#o-=&H9jLdlhLAX0@@B%Wy8$Ne$8;mu4r*J;;mFdNHjO4u_Sat)FQe;d;y8FyZVYK74*m|2>2A{6r< zCbiQyBHFSQDFSSHHX|q07%;wEA)-YNfQT1Y$S@2l3kJ{PLZFE2u{}i(0zfk)5JVn8 z@|YhT@_VCg)vvSUg>Lyx$5*N-QXLOHHd^BHiW+Znw0Th?IdMqSeRJANqV~$2ME7*@ z_Pjja*Yb9&?=fvF_PyGeTy1kKV^z@1rmmA2u|AyDbsE1X8`W+ZZkT%M=a+ZRkUS-3jxFj&)5yDDcp=^eep0BP3Afd z(V_DQGcYGbcoa5X0n?cEpp$KSfLKt+F32&cV|Pi3Egrx;%M5lWicRBegwS&q!+<{x z%wd$t1N3ghSl&MIf^0BNwBO1Je#eUyZEYZ3jf%jPa>#DsQ)%qIwdo+Xn9_99Vq;%= z*tLFlNAjwuUxm)BdoH2VmukH^>;w%2itPdb$i(_`w~sG4|; z_jRqOB*nJ#?8ajWaW$hNBs2y|r)NGaoUg-`A^e}r3I5i6q=soz$~hHP6p83C*AE1l zAL(=0{8dIerROop_hwSF)JH9NwvITgvp(uKcNK24nc@%b5e)T!MxFogF3IM+u1-JC zog6vs$f_JawIj=x2z#VL4@{u^^qw2j#TPhOS*2APQRc7D5$vdKlNSEC0+~K_b-3(1 zJ=I7_o9(+`X`;}`fqMO-FKD&Oi)A}6xLa1Vb<`@ha1#7;LogZEAuEC=xfg4&BK==) zk)AIvekbRZ-B@$|S0k^0>Zg21Gntn|9Nq24w>G4;d8_@g*uTI`0TpyN4D-9uw9Z#}@?cJlgwJb*V=pS*2#cj&c z-*|)fs)k|^&e~HcxJ|-B=j@^l#Zko$1&?{be5CzptzH=Z3UP>|mm<)%dvv7NJ?h;c zo{r1Ycg|+Y{Z2VJfLYtM!T-BQiE-9Wb| z^mP8;i&9*J1~xZn4ICag_TPWQtNri7M1gJ8lyqWJXe{$*;K;nviMKu+(v!2CpzL_k zRh9F2o!iV@hwE#-Smswe-JLxIx_*n+Uu*e54ZJ%;TjAaIlZ10C%Ob!rj7c`EcFtDV z1-P4#4!yu57ca`ieIA@6wIe^1FuQXx<&DQ&8pndu`dTzL4MkSz$9ID%P1kq7&(iBW z1pY3(Xd-LFE`i$Ui1scMsS0Opk`M7}ouVh>(22S^`OR@T=3$)+h#zVDdYFwy?=sOI zJDu#9k%D=#Y6+-dUhtU_WXmVHh7XHCXN?S{{_l^IpPEIq_1yG*u`vxF%fyn%xx(3? zI>l=O29d--^I!DF!?KrCrfgX6IcF7CY z4D)J_1%*N*=8y&sscm)mv39oS1!G|d`HEVZ$sX;)Nm|>v&G6O4zP6>fkc(D zh{T=bno>x4jAW9SYb`UDO!6r>6F!Ws5-=3C(!ya3&tJ9zcvZ?Fj}%zy;WUaH*eZkZ z=5vr{)Ftr_kod?pv1!(H6$NV@o5?Q{#fS4_oktgt-g4H7Tr_zE;S5Lwpyvae93bYb z=;+xxC!iCCh)1#~bRwPyI6Its+8wnOMpo}d-OgV^@mp*s8Zc+;Wav%Tu?3U-{^D^OHl8$G}}l5H+F%undwQMn#ZeBd(@L(AdVbC_q z=*!=1Cze4;x-Eux0N<0(RJRk!<^d?G3Ou25K1@laYdRle_dKcf_Wqozni=xQ2`VI<%Us9lT2NDEXhB8~ z7AGWL{^`JHs-f%-4cVnan?gN@D#pPVU*6KXeyM2ty5~cOpG>#9M!OAIPAHCAybM{p z+kq_h%OYJ3xKYp}{jRBq5@`SPU~t+M5^@)BH15#7xeV*gf|Omk+n_rPy8C_FdW=Gi z4dty_$A0RLkYuQ_Pm_Gce~hM%H_BWqF!p$4VbFA$T}6Q&(a$Y|fGMvpm#Q13T8FLl z8PwD~SI2hPNME8&4%X?kF1=u^Qp*zLs70UFG3ssp+P0Quop_qzXZ(iQLbG`)ZF+g} z3nLEWI`;%k<$59VWo0X#5?))xkvu^CfL4rxFnQ5&H zzAk)-E#$7{An}H^5m~racj2uEVmh|co)^Z6_8$c#WZ<|>DkvrwFY1lYiFWxAzMzbU z6fJT8g1<9N!nx2hL;ujwP1W$`#hJ67980^E-6pS+BOYSaZCWR~eYcIMs)jLewwTHsA$qVB2S$i^`=7n5)71|?+PoIH-I8;PZG+EY)nEl!uex;;L zwu)q;a=Rd{zUrt44qJVVbh*FnbddM3Dp#;uBsA$Kq4+XH-8lFH$;9-a@5}7C<~_4P z-_XDd7J?4E{w}*ZRWPB*Il%S!^l@S9hfj6 z?ci-1U33a{Y=pH16@Dy$=H(#e3%Ss|hC&AllEV#C_$L_xiltU6I&Yz5Ke|8~V+RA6 z9gsnHHIV2ys(7*vRCjP%JJ~_dZ|A{7;CS;`dIu2XaBMK&Mu%nOOiUI23h;-N5WsioqfZ%3nj^>5{U1OXS4#6(LC%YSl_UBJ9&&ISBxn?u6j^*mUg` z)d!rx+%b=N0fW}bNe9?HPg}9edT{0(N}osL-q`d|9R%WSZxth3N~*(`J(u0hEA=JZgfZ)iWlKm+$Ew8^^UsgUwixhc5(5({3Zv zHgD4dh!>Pk7!9MGubSGw>h55cK|M!b*H% z%}=v*#p}P3*04r_UfbG^VN8+O<8Cz*QT3++lYBFp75l(J z%t^@_M4~{xzT>i{7zwdU>1|*OG2iEdug(jRHY#$B)@+|HE-D?atr@vj1|v&UNhej;j|hsV;Cc?{crd4wPr;f5xCQZ}kp`dhRgZlf1m{z( zjeCvtPB(8Mro2{n4?5alLB=u840j27tsWa0sF<-9`rO|;uWs_MjR%k)0DMu*TAiWZ zy1Cj3KOtEX9f z$(EA0x=eMvaGIacnLgy3dRgLH@I|zgvRGSBCt`}xW>qeyq{&;cPcE77S-$>leM^DEQ zkL;l9UYwc@VxKwE6B>y3-6jp{ z-F5q};{{_TlA*TBsPc&7p7=sT#qGFFb~=9@M`8>dw|B6%pY2lrk<)Rr$ZN8F+M&OQ zoul^C{flM{tq~QcuC1fM57)JL}UihejTd#;soH|rz^0xpoy-s35d!~qOTvLB=rykXq-aXhL8ut)}#LS z@Qu&e9-7;sT>^B2`Y-bNKUE#ro{9eF{ew3KxMMPN7qV$3U^mPpPBzGB4LlXb$-E#< zYw~`rT{RoxYRETA$KQOna;V9$?g0A|%Jm^I_8ECyMV_`Ien*B5MxV2Z8p`Bn)>Vl! zi&8LuoS^yFDHJx|qt^yq44$+r6az16`GuMCIu8;id2m2{*vQCdquD5SY_S=y)v-oT zH6$eQ0hzbHJtG9Hf}i<{=`I9|av>(b8K|3xut)fUr;6BtEBNYe50EDQqiaCCl+V|D z>9Ffa9mPe{_?B8r6K2psfG}lHfSQP>hH+9?qSpuyab<(0#wBR&@qmV!3hFMyIFK@R zRb8JTRLSQy-tB4JFx_DLO?IqjEk7wp>fLbr_g_V80uee6t0&eb$cbP-1P z4KsRAoiH+Vv8$o1(R#EYXhSe)N|*6y87HdfYP^gti9>Og@Wc`}%#pZkVhi?2t5&&$ zH^yZNw)M<1)NtJa*B98;HtBgxm?EXeA9s7V`UU7(l{FXdAHEqiiXSb4oNk?nR;Xdz zh@UPuGbKk2p$*Tv@@HxuS_cAr9DKo!2OTp^-FPA7O$o0(#L_|+>zSo5ZJZVEi;x-{ z9rL+p^C)2dZMzMWXhN@Au;|*gEV1QF+y)Ydg2LZeH-S zL_t@NT>HyM2IE&eYaz5O=~#;@vBSjlHxy@_yg6%q9cK{F{q~7g1%4&%0LVh4C#$f* z8g(uU2UmCWJe$8j^`nc#KeYSFc5hQpyd-+KTRmyJ`{p{1NlNiTuhA>NieIx?zN7+g z*WX0(Wz=xWYLVqKT3PG*E+c~FursT%rj-`PIg&ufea{%p2#emCF0-_itrG=kN{Y&L z{CQ+HRb131(DZ`fmm>3^V~4xbLu`KqG|$$C$0Cgks#|mI%!!%dQV*fiAQDO-4YL&* z`31Um>{l$1<;wJhtWJkuOUJ#|=mYwsK4=OiKXUgPc3 zc_|X;Z)||g>Qj#&Lt0^QLCQ~b5Bq_b89LSBeg0;M_w@&u#=Er9wCv$E7<*6A5F4?b zVB|aA-#?7q-B6s)y!y>087)5YN#ofwOq`u~-*;yo4X(fLpK4CoRP~5_i-S2QcI%OP zi=~3X_;e|lT%4`tEsc)e_~ab1b6I7ob5hL5+p`z^q(**THL%l8b3y^kDiBOWPPyZJ!F!wQX6cXwX8{e|}qE!BW_1B)xvgzo~E zy?a=bX|kZpERQvEcS*+RRK`;~u46z+s%m>!9i49JzTV}%a1hy2kZ?S#o8o=hPtU_> zb8P}WNT9uro!ZrCa-$Y?QGWeg%`F7@(7+(?Dhc_YeHGBM|GE8%O!?0rB{{xkptL8M zh~s(+Kp3RcY9<6C27@^u9!9)I+XmgUN3RKx5o#Do2<^Rx1=D5T!!YOvik}_GTZ&y4 z*aPF<_2aM8q7f#*chC~1eOiE}C+8v8d0`}!3#!c5;L4}n1AT31vHH1cMNu#`RQ$U- z`%$1r*X5bNHT4`b z*Y$~5kV(~0`Rbiqq@hkL%^~aDr(UtH5Uw|gkC>{iv4TFq#r#H{!g0lc88*P}KJm%k zbeu!PG5cw$%C_v$!&_58IsT81YS_Dc`ElkY@{?*@)irk9B{>_4<~knb+@K?>>d2HL z)qY#>vn*I5u4Zp&XMC@@8_V#RtSF0$WlaCb9I<8M16JLttuFk|5`JK;Itde|J04fe zFRmTc7{o2v(4QRx3Sux^KG$H;Y3GA_{e}-wq6=Rb<9mFF@U7YF=z5)&!;q47qB(GnX8kyni8(6 z^O7fRCNm5>gY=^P!@78+Fi1Rld>M@1MC&5UR>1dz$QgVZLR7`q=ajatZHO){)+P0A zbzv|pss&oKJ!e}71_&-QQOTaIM;5$1IkRb?s|+Om*|YR0G+)#VNI}11*o*KWpo2gb zfc7s;V4Ff~Yc$;;62KG;nvejO&3ln4aT^6ZRy%~$Q7{kZ!iXfqxNVX$-ZnuTJ*B=_ zjZI7e*D|z14y3{Qi)M?&?G7uZJ@7sL@|s+Z`lX|x$RK0?Pxen9%lXHawNoEu*|Ii% zPZ=7ijoePXnGxdV&au6)XzQ~8&zTpjyGLh(f`DIvFQ^3EcNq%ODq|K}hMTU1*RuH0 z6G}{YAE!{IWUhJUc&;$v(5R-zWN{s52SPB3${nvGPQ=DC2cD8HAAliOAL(;fmvFrW z?sl1jR=I^{{I5BowekwbEf6Uw#i}=H^VHGsdeUuifu4bKEaf#!&`xn zSk&kB0MKL995oe#FjK-oM!xe$x_M zvYjw7H$5o4(o;tDip$|jp5k~E{26DW&U$rE$zGYgZzv0-Xu(5o?U%mHg%L>tPkTOj z!!X?~#4!W|^TO}$73)!mz4&IBn(-afm6xO-BC}zNIRWEqU8lz`$Oj=eK@N1DU=TP* zs!DcaIw5*)tf;s%lg$IwGi3dw;}1J-KIVm!4Vxo++gTfVInEI+egL3jTUVw8=IV;RkMUsEdEwkv;lY zeL7yoSij1qG5OZE&=ApgIr0i>Y+z<^et4KIIkVz zsjl|z<^Yj4D}W(?VbOsMbrT1)UB8vK8bwWRGscHD4AIp*@fe*k$=(|>mWxs9w|&bQ zLF%r9)ouISKJ%XH#YZ;7`%UCw(uR-3~|)MK=+dBS*nw8PcPM>ab9+@rZ#E`gAr zz{g6aOH7yo3Ic2x^0s;u?ITc{%1)NFaHeKtbZ)#;wO zD~2ppqQhkO4CC@awHVCMxdB8WVB*KIHGIg$0Z&DhsQ9QGHVS(w$%*LcTi$_=O`*&; zJfvAD0c<{bu$Y@qNk63$pHqte`HfN$|DA9A&p*)zqIW=#yYz4Qb%0TnXyHF^_48Yv z{|$wY$m|{3^da^JNmbTcRD=3x;b`tt-l@1(yoz`vp(w>5YCVT_Vrg^@k^xce;yzK2 zXb@kp3@^#yOPz+7I(`L18)t7ex%L}3m2N3@(eK+|*SYC#?Mv8S#7IWJ(;z;nJn?%v zmdUk8BI*r$Nq>TrbJUw_l9&A)H!7QJ7<6qWRI_gGRiZ%S4gcWJw0(5XS(+-=Mz+Q* zVR*~NhxOM$%;4?BE|bQiD>B%3gj&7=m0tWyVm}b7vjL2p2+td+<~L`HDDuokJ1LS-95{^@nHw`bD-Fmo6Oi+ib%>t#j^aifT^lve4-&gNZs- zZ%bTV2UsTRCz})9po)c#9Sqwm4W)qP7YDTo42ZBVjY_*yj2S#)52Qi;v}l(wm}y8I zw9$#^lC4)@g8Bz}w~y#MdqwWJv!SN`Z2cRrUM5I`vnTx7eURQokX>JIy5gw^2B3&VCmch!! z!R+X6WK|i-uqea|9f>1rhu-7Vo-Eps~~NZO+EU9+S;iH=6Bj_7iR^0sWz_r*-9qRJ9c2WRf5|oC{KR zG=$MTh=204d6Sy#+INYoH$y)r$o5(%b~Ya@2gwO(Rs zz2n2o+w>+Ay)p6FgTWuGM_UtumYnW23OZ86^V(fsl?z8eEk)Y_m+-NRpy7d>_YJB|k31drpjJ+@lrHZBz}V{eUf_W3YHZwBk9gk_ zIZiE-VGdAPn}$@WBd*6Uw>lgO=Wp-QreIX(|;r=FdynEoNvHftwVvRGr zz^@n&obMpN3i)IMzhA}HNh}Itk=y*h$N^jXhLJUJt&C+`q79Q-cMj%Lnr@EfInEAOP_&i}iw1Sk?<4VXbRMxudj>EEN*Kexb?gez!5 zd zIBYu_2c$&K>PkZY&8#^*@@JBu^pTCnQkSOE(6?!Ns{T-kn7#Er^m1Lk8~)NR7&w^Q zO%f!$W9FNuV0ecLOBetWu6X%?=nAo@G|Wb1sS}Dw9~ZuV->iP)2ne?Dj^Tb2VIs0& zXmMN*eD_p)NnNB}v$FN_x?JwE9V?@A#?Rw&LY_!dFbKk&=`aOfXM${nEMu)+U^h;k$&+_2oo+ zBr~$~&ij)<(md06Gp)g{Mf9Cs!n*um=URe{RLVZG&!IuPN3>9%q5VgX`}~*@ZwYztX+A z!xp>XU`2H7o~QEGXe7c+aU-ri8u~&>?T$oZCU~BNisfiuqZ~zg;rmCI2qQcg7&V`v zTUFG?4*t9heI~WaVm^d3G_{H=r>7{VJc*DEH2bX~HPSTIF7iM@lw{Gs46I;Dk=bs6_UmFwOlSqoJKnn0juWsUr%+CKN&Z%HpM<%J-5T;iV6ENHLbyBd2fC-{){sAFbA zhg3Cs%=qQ`FhgSf5SbPRGHWANXv~I$chFVOxdr9wx-T$Olp_?$1R(mU0KYDL2=6bdqP30SuJp^6= zDkyaoPV91JDq7#s@u=p+<@Uhn(b083eIr74k-{nA)@Wv$Y@RYPCtgR>*Y^~tX683t z9Nbh^(R4AIi*IWtWL#)^xY@J=<`0pd+%<+m9ePcKTB-;cW6$3rabK(Igjmjmf?=69 zO5FShDne1q7L3_wqd=$mh~J7wEc#gI<(*-o_&QyGCoRt}ImHBUg;k|>6fD=v44Vxx zwl`Xh=W^c5*5OBb2iJK_4ZE(M6M1?w_b%SCN9r;|RS~`L6*4l(eS9@aP!2T(b3r72 ztX9c2Bi=Clunb%#Zls|D|ZD}UVY|XBV36ODdt(JdZ{jg)J`=ZCmW=Vo}O4gFJUkKPAe(Fc~6xAAR zXL0Tmq(8gJ9dq~1AQHK#bX9gND^fL7m(y#N`eCkR2IKl-sV~@oF@g+Ev{J~bo@8&i z)?QyS&TO~=1PQ0)Q?NN7=7)*Y;2XbA#^0kafZD2#of$j`8*!%Zv?O=wYWuTd?;XNg zvuv0hXB|rkKI7xC`N%?;W((y3enIq^Nf9VP92mh?k`2(-A!NTOp%JwaJDU8(lj)}|GE?LYgDD;G`L(YUv zhlqsxo<72I9LJC^SKHLL|G_8jM*}ca zp!}^ws9E*A7>6z2vKwIIJ-N?Yi|=URaGEsyyFhnU&GAN;SK*~W*Ji`}dVlwhc*@Z! zVjm$BS2ucyE1mjjKt03-IsGQ}<9)$#PQm2)5YuTHx+?(uLr&-TKyM)h>GKNbL${4c z?I(>V6&gMSYH=_(eFGoa3bN#RFjd{a_8|zb;W3smnIYZ`w+SZBa10E3$|wY|9iN4{ zt-zuXCY$B+toiz@q7>}&lZ3pf4<}|KHcjmr?*j%TK0K0f_fBHbJ^$tL-g+U?MR%UA zNRKRuKeTP#+POp1RfjF3`V8NRPY$}4DmN0P@SKr%NS&^4C^L_|h$>r#OeKT|`)(jZ zDn2KK?FD*FIr*zj1(DI+9CKNS?+wFqfeRUpF#3%J3$x`6xrt80l)F<6a&iCP2rZ#j ziml-sJh;x3aYvZKr={cL&N-$oTL<#Vx}W<6$~0*i*zKm|`VPsb5tm-L>N#savhmoPEsZoe*ppFXR zjZ`j%&u2c+Ij8dxf0|kdA!f9v2P*kN(&!yw*jsTdr;m+Uw2Hqqgm!h8_^~|a zXy--KgZuRfn*3D;uc&I1uGw+F3BbWvehkt!v3yEr90M`d@*ht|N?Aac@HLZQ9xx`s?dd?BJkg;&bON1mx#_tnp| z>qg&-lK0cqX6o}O;Z_vrJ(#M(7ahdYL=r~7l7aU|Wy3pFsvdL|KpQFg%PJQ>asWU0 z!Nh1O=%pfI0hEoN-Xp+vJg>FwD+`Wuro8+#33Pp2OJd5X`lGp-Fsp`^@@PCoFJmS~ z73uo^CGyT^tvC0VS(o_-u)LE!@Z*`heKA_O*PKGGc%_+q(IoI@VUrN9&wb}zjM4-7Qy!JJlSp5{s)rqTX<*`w)89V%S^gd3bkiRcZ z*K%0}PN%3dD!DsG-MYRcYn*^JjgDbbt+}=qou~F(F#Fa0K$a2y7i?vdUy{AND8(nl zC_#Ca!1=If5%WBLtoZD7J&@BR=~3Ai5L~dmoha&<-OKleSP6flc^)aEt#7k#a9Lg+ z?eW=L90&P&CB_M7ihiXMSEHWus1XTr}7IxbK=Uqow8bQzdsIny!D_#cvwL zxcD4LLJU2>!F4jfAAkFie{N@ZR=<11jg#Y`emxC@){jn+9UoR#u2mf0b+fDK;vKV( z!>V^`m$%uS!dLGJzmnmC@V5F)l%4!O2T? zo%+Y`zbqVUu(VyTrbc|^cd7$(qT}WLhi5wM)_gTx|Gj0<+xJFEej!~0Q#?eZvvvD7 zoMCF5r|}GZ(_ek&?;@=Vk3Y|*V|HHLFj{f-$el)3Pk`foML4bPa+p-0(ixXvW8So; zRQ93qQE{N%tLRF0-k;561ByY#S>l-*QwMNuxiZ9}vG(7=@}KLUrm5$v&iRNtHt(MlHvNpVW}*iR0uGusTv7k~_H|N6*JEt0VIgXDLw0w#8mgxo+Lm1yFG3retUWQ6hA2YwGRP1 zb)MR=<7=0{RKxeOJ>zScWGJe2@z9U_1j(wSFOmd?9#g*wop@|pIXF+ZB8)i+9jjAR z;W{)CtB5Gaq}v{c;nIuR8Qsf0J~Aur1_GSj716pZpgjTkU_T~a5|v;OjLN^e1izB4 z$E%i4V{oEQm&U&>T)>obtwE*qVWi1A!h82rE1pH* z&4(Sr(u@>+hrq=TOxB9aJ4yUhXFNX@YW7b<`RLo7@B0)lTt7Z3X==#hcj!Ih$3m8c zni2`kQ;_9^&dl#16s@>Q!Ut$K^hhL-^gJM)Jya|bU1 z2}4R(|DzxK&Dp*~*{1t-FQ(4~XQ^qBG|KjVx@AXK+FqZj7=6O~f|IHOLboq;jnv>PHvJu@?m3iQ2js_uyTnqAC$Q>~R^OSn- zipvfU7>E8-k-9cMkKxL)d@nVgV5DMePSl8SI_EhR#&sRz*-UPaP({Ey_|Vm1nMJ4b zuY$N;BHLdj?|9qZ3vuNihXb=ukZO*D7tbj9zP#pAQKzL<0ZiB_5|~*H9+P#z9f^Dq zO1jc3!NC-Ohlhwc8)9S62NSwtGf>fMal7cg>KT$X8OB zPvYwHk{)IOjlV6vJRwoMG0>@FKPbSrRJWQO+-+hM zR2El1)>m=EJ-*TUyItQ-lCGu#kv80V1Q2!inpA=({--T>Bp8slyU{ZkIT&5CS0}=H zDHv{f-#4S3gV|fnX}Z>-5rlSsLyQx!E{WMfZ2v_AA$G; zQ{`^*x!@#f|MMy=NRJX7`P+2Rmln~YOr%!ex?ga#O(tj32 z2kX2cBls>$`L4;6V9(*Up$LqokemWt(7d5o-l8Epvt(YyIb(-B1vrn{kbY9l`GvY5 zEU&tH=_>Z7e9Kv~o(NP1x=0u=_YeikB9M0W1fRTog%^`L7@9^|PeI&7%&x8&Joekj z-Ez#WR)(Ql_6RLY*lekMn}bgFG^AV0a!a3}Ja>GLwA?_yUld9Hs+XU8V}EXAq-D(SA6~< zZC!Sgc;_wMUORWU$zBNmuzp$0>-11sOZ1O>{N4iDx0kh;^Z~+J%u3SC4E=$@)PzE6 z&A+lGcuRoR8;TKsmG*vo7!DnyQpnq$iwSc|XW8acAuvL@@h_-Oo%AAz+jyyKh8}t6 zf|-{eXhxaOQe(_)XH|CZ8#){=)`C3tmRPmT;i?Vyo7=AUUaw-d__#g!&HBwLnis0PITH_8Jgm&MbJIWLj*7?MO8jIDm7(14iq{uMZ0t*z{d)fXU*C(yzx0RzX!SSu1#E({ z3WA&He?N(p!66JR^`NN<%=OMqYMr+Li^6$kgEgir3 z=-Rfn!#my+wXeMP$(r)`BW&M^V4KiA5$Apt5P;0n?j}$-D5t$alz>{XBH}X8g#ZRe z#mG|y@d$sWZW>X@ItUq7g4KS$SSo@WuJDx$Dko19$#_+6NKb6-03DSVF8Wxn6+fr20C!mGXNv9F+aH!1lSv3`)F0D}N48WARxT7fcIHYEI*@{3B!hs?!?=#w zjQrcC6%3yUt}#?ips;4?9uumz5e>kaLbbuUuoGB-GYy%2G#x0Si8_2DfjS*_^3>A3 z>0z9obbS*ze~$fbHdl4PhV2XtxZ3_c1|V1&v;t5ang=vNWsDE+al+%1OZCZ%**I)1 z0vL>gi()g#P$WZ`GjDIq!Wn-Suzm zF0TkA9!%NZZTRty+Pb}6C!T*AEJzc{Rx?r-Kf0R#dk~^lT=IFs&oAUi%Z|o(uj5LraB5(SZ zhPEYzjCG{VguPQ3vHd*R4^-$9OR;C7j(I_X?3>d)1i#W<;;}iPdRe@B&e801f9Oq) zuSNcrt&en6>|Mv410DoNsB~3pJHIV&9AF|20Gd@Iv0v^8@^+|N7q53yt3(gbW@u$n zBnA6@1W695X5tVQg(NUYZ{X1{X#@P`R`x)LDqWOMUc_TC02a8q$T%M4e2QouLa0V8 zGFDz_dJI3GcnDam0$S4?FqI{2Yr^}V+f2JCR>}TjaEjc1N=svSqBSB`x`9~42qVuY z3IHhwll-79pX#tSQfrT!5x{msws!)ou6dkmQ&nt8s{J@3GPIL9n$+v)n3-~{!c+xJ zagN!t&7Qb}Jvgo7Caggxz`Tp?pRgsqhRbKCTG8H$EZ5yB0Vyv zPoJ-d@zJ{Di*fYS3C&NuX7M(=aUnU*9#&mparclY1LZ6Hi#SaBwoFz%Hg_VmN z&-O4@T?Z9rjh6Y4&_`#ek?JxH#ycJFu*eVGFSD5k-w0P zYZo{&hPXECg9x*X*vFon-U~m}4@<21Ylqc|_3r#`psA{VRa-(T*MFFakP~z&XV$5m z`cYpJ=2(C^0sLAR?aw<=V%~DXg0jKNL}J)gMu-nzmL@^&DE#hSgVS%}lg4-Pu|+%32+lOxH=hyF;hI)G)bOA~zQnY4 zLEN&b`R1!#LhTNY^FZ_7~6MkyMB4eA*4GKL!-FA7al}TgF*4p5W^zpP4m5OrvT4bq@6H+mhbap7o01 zLEjSrNe>LYf>6i@QYH&1HvfgP`A@X^cjWs2^Y^!Z{SpB{GCe@D_)_G;eO2{xz?Z3b z#F`=^w*MB=Xr@)}FgCqpwP?_H_lXz%WK*mmVcU+L?}gmu36?w9BD|HT&b7=Tq$BAj_^l)+jXW=9~~lPgX$I+A4m0p84c82fAX0*sBhg-k&- zE5{5RMwsv)4aVH);Wb?qc|53PY4#@EoX*dGG%|+*20=-$oCAPeAb{sMn6DQiGvowO zF5yin%XrFa;|Dnu%!}DqX>(CD5dO+|;=!P88GGTKj?)KIq8|7-XMGs-Td`(&YiHB8 zlm~sX&?7B-f|e8(hCXU8V3l!qVRX>pD{R~qeG~$yFyWt1Tg7$nMFiz|+~{t@IJGU* zO{)p@Xl{*1grNftK28)zRXE)^FQZIh5<4o={GHXtj8)fSMRj`Iu2HErH?}l1Upvkz zC|OMlO|1*g%g-aBHI5#;n1@%3t|tBkIUc;vpc5XwPJx-!AS5W+FxV<{Q1Styzx66W z2eCH1OWX7ooCpv&^asXE!XNV>=4jE4!l7I^caVR)|sgC(|Nn4xDX1p53Rq^f*_E5Yj?IrwfRI?5W0fz0W85h`N zQx#~H9xO7*bzC~~M* z^<&M1*h_F6c$rGU+2$uurnH4b4ZyoKfI$M{pbe;zc8RKYfpK?~%#Yrm;lf!f1u0-? zp3mevapVN>^Aig-w(e*`M04(AiG9GR01=MtXppqYz{HwR>ycl2;kJg=JSYlSW&uDR zvH`OzHehBRh`pf?azWsu>aqbk0dR(|H@Ky%R+XR618ky$sR@ju3mZb#SzN)%7 z3Y>C%#r_nF5z>8TrpEZiIUoFv-+Y{Ltq^V42@A1>*!=O!QuBBm9_9-QF z&GUqKWsEi2f z!p!zp0)VuYm`oTOuc7EWo$fSCVLlAHejabLy8lji0UcxtVPQ{HBYOZzPavo9wSMnM=g}n4iXseh2+VVrb25`--{gP%L6k-K9&i zzo0#z)j8tQl!)T9qb!4tK*%fEt?e^5cQA2fSs-D#yv4}#>76>ufUCeE7c)9+e~UZm zvSER-V`MV>tZ$hb;pD!T!Cs?WiKHy~vKy4G9?gLL(F&v#}GIy)r&b=|V3>1t7H15xzrzU#LM+D2|7_dJrPLtx9-Xb^2yM zw@ru|E0mM8fi)h?d4$PDAXtJ@RSj(n>Vt^+%K2+I4s1DGtb#9`AHRoRr2%vqW_0lT z!Em#h=nE?iAkVX8^@yJn?%djKGN{X;g%E5>ucDTGB;rfU>ESDu=`}G+kw&|0y9@L>K^p5x|(r zc{k%!bD`$!pO5@`*~m1*I+vo$#5LIJ31Ug7mBMfY?^>p&`od&a?KcwSx4V8my?BAZ z`XE7^v-%?j z*6%7Wh<$j|0NAAYoC2g;3zT#%xX`Ax0FA2wJ@{B$ zG1DzncP}R13T1X8tB?37!gtFc{f_Dv?}64yoq?;GOVM+tI%a8i_SQM!8nIoz#WK#4 zlfzNtm3INHDO!1S;G!2s?cw^bjRp>n9zwue&0!4jKMeq*YpN(_I>3gjR{+XnxQPuW zP)+)1o>+w1H?)X=KY9tcs-pftq!taNJRsZ^a}j`0)T_cK%dN3J@hU!MxA0p%Yq80< z<^Goi`2`Ep>21avtMWPmRjj&zCn@hT#>iLOk+Z*fh6*SombqS{cwn{^2Dr(5mZ~m{P$fxN`7E5=`*AM2_pLDYCW|c(P%n!| zv{ywASf#Ui^T~^o0%ZW+1XDaNSNf-`K$#opFbqngdq7)@mqwbZ>-sdFVW2W1!UX!M zH>_8UAtD?c905HB62WIpcJ*TyQ>+V^V*^7`O|fd2rK@#Fi_!p$Sn0C#r;!6KKrwnZ z>tKj#Vb~!WlyUk9aqb7))fE5pz0e)1%rPs2sp>g>9TIAsB0dz2*Y7|#qoJd1)&JvC zwuTQIxFKqH>wO<7nL5kh8TM=$sEiscO7sDv9(y&uC7Hamb5`RRQDk{hV+zd-k21S& zlhjSw^hJqk=7L*euW{=$rpX#h&T)>MasZ>F-6yR2hbIgrp|7}jdJ0v=NZ9ZVF@<~+ zdBU<4D>hG}YAp1``HEF{i_mSylkt@81LRk7tVmUaGIU{#kEDdvfO_z7wi{jBIQ{36 zP7E#l-a-#v0S-B~u%l%0EzrE2;He-<6?xiQdf3+n4v8rMw%=5A;7y=?yp8|`D7QPS zwaCN*oR^400lJ*;DXDHo_3BK+OuO>Cn3MZ2;?+0J#TRc=0IHK2p8B9ecF;+bZF>@2 zI#7XIN@2iV@kUo(tskc<|vN4|5%nu1ZyNA3_hIVDhT}M+xM!=W)>B?)d(j%s~SBisPQ7jgl zgzmN2eObXZ-I;F(AT3P%Zk2%Mb=rO=A@8glu@4bK6y84Z6DXhL+xGX97mR?>1nt zN4lr`8|;&obU(u)^$U`M@VC-1$$ge@en?0Py0Yh&3^L}X;n6#sefoCo8xN<34A( ze@O5dF4ne&;;g*Jt`G!WH z;nAsz;pk?y)_7$1mZhrb$5X$>hps#6ze}>UMDxuwP%dn2UNBM{xqS3kgYD@f`)(b4 za5WYrDDO35>72~+6?$(9nMNgN`xO;oBiAKJdAslOTk0+>-rlQjR{j5(0#@XH1zG>= z{mlPmBu)7z=>7Nh=YM3-nn#xQQs!jV*2qh|oWZh|MxKhg4Nq;ntHgS{u&a<(5D8d-e*G|L-oa=cY_S1|yut;9;ER)%7H9LueIXx=EfIuyePz1j6?(^z_aaopsoja0?2**Mo%YasW4)MA^9PV zxeJ3Hj-KQTJT41kK28eK^@0J-S3gZ|X1|D9h4iZC8z(}kA_6I)Y4HOCW}}RFA)l;m zaq23@+9eynors6>6~5`58g+pWfN;%L7d_2M0UrT-q6R&YZ78Q)pDJBNhboQaj>iV!Q^g*-xTF1Oz77;l95RWeyP^NQMpre3f9xlVREd!V(tq`L%(Dn)> z1ExS;TZ@UdE_=lF9KA6 z#AZ3PxLb5?I#Kg(HdfaMa3^&Ca0hXXO@_(XBhBH@rx0^59 z6`R^^5=;QGE=7F&6tA$WMxU3$3dmkL^6;s;NfMKu9cDWdmNywKnP}Q{fO|EC8e3cK zR*hLL{UkB0ij9NAUP_?(McKEP(I;hQCSFypNxY<#k&+EV89eEY>*GZNkmH`J@ghd^ z$N^Pn=qkL^RErYKR8H3iA5Nb4u{YXbot&Irr?I{y^s*g7K!e=(c_K8{aJzBnR#mO2 z?WhNM8>U-T=L$;D#-vO(BAl;Kt09b@RAe0OW#$%fC!+urNX4ispSNd*)}E)K>w`Zy z!gW&HEDvq5y$z^3p6F=a1*CN6tJf{>W!u6|pU`(DO>q~+AGTlrvz8e--zaz!M^xw* zt;-pdN}`7!N|4mecf33K#^JfchJQg)j%@)cul~mfZlqoY1?kY{ceoIkM=X7R=OL-e z{^p8X2No?&9P4$Oy|c#s1}i#z*Q462U6EUAxB{rRAT>mDIj0((?dtH0i;6Pl+2+H_iDcd9vMJke3YomWZf*earCWDwao$>x)i| zDHOg$yAoM$zy7_8wKcTiV-Vv0P_04pWFNpZl#A_&FZr2LV(RZ^)ZdLl<-ipn5d8hb zKSZ1V`W##h!2qN3MR+lvXX40|SSP?3=NC*0EOZI4W!SGz{O|99V_}2!NL45*kiI)D zC|t33ik~|Gl`_bcBmZ(R)$``>jNe0sOmt5 zS+|6}w-;4|jxNu*SE!xBD|r=wVt5fpAQC7Y=XVRN0RV@l#igtI+3ChmlOMI(qPXNh z#fc_#8?L>eNQ;b?0>(8df?xMV&mfVRhOQ+9pfZBCWYE(4HRX`eha^TJ1(l)XoB)Re z1wf>^>HTd>Qvyx*0Kfa9J|K%72SSb>JdC_Zz#bS;HXQ*y1@vioI5h{zwJ7zj7_AFj zX7sfY7}s&U)O^=i$e^XwuUTO#CQ0;fJb0(n8&r^*)p+B07pF_Ut>%X*M^@%$i*t+~5oqEQVwz+8y|Uw$##U}0 zT52vMoth%eU(o#4$W&JNwB@?9T6$7KPn1!Dfh(?xY-z^$sgZ-sKrQZ-&}&l(_U5=mvf4yy-1sfWElPCUiHK94EgfSV$ymzJWnOlqagSgi>-cAU z9*+|oFjeo{lBS*&+J+md(&4FYUWB~H#6O>ru~Y|}@0u8+3`H+wp1JD8;oN6{uX@uY zu5?vOuqWQ}o-k$uuc!G$V_knUALTLCIJJNF>f2gsv9BKmv-Ti0_m*oGL%|K_Vj(x7 z!ANP>?QWpyN@-bXyw3FSLR*{MIlHyDyQbIT7sU1@HX5liLkgpo;rC1+*63Cp&6Nd_ zMRkiV8f4=2oD~ObY@0X{R$eRL&(&8(gozIOt(M-T5EgamC(YG#Q>k>%TK-yxHc!-d zUJBQ!=ShHuzMxH%P^UXZLX9?KXyf$93lzod8$!Mo6dQQ*MAD0}vleVB?ta5I6=^mQ zbosa@2FW!|SnF(hb7x)f`Nrs^_1pb{b@WzHwxp&mN^o(Hto?kqN3xeeR$0{P;vDqM zk)z!Qz?9fr%1X>G>>97B<>}RAHB7YO?i_gsyZ=5O8*9V0h+of2lC(4&iVb1jXrS1C zXJ#tVr)=3~qUD=2ZYCJm?gObKYc^gnK}-u!;c+$(R!Zu7rljqK+so5u>)Y!=D#q2q z59Hz38qST^f(++=v#O<8Lw&$xMS_kW#!|Irx+xhTxNQ_?>FenI)9at#JB5}3I7 zTaXL2`caB!c1s2Hv? z5I|{Bz^sdVjnzojQBjos2T_J3oB~d!AT@-0Wr*2-|KvG1RQ{dU!K-1LK`&F!>-r2+ zlXiA7sD?r7qzGaffO#J{IR~|f60ZER1}lX-r{OPD&W8YQ40sE$CIkFegBt`N6_e2M zwo=|5b#)6VBOTFjA890^|dV0Mt+*-US1wAbWuNL3sm$ z4R{FuT7bvGT#eAl{&=B|VV-U)XJ063v!{DlCXy<03TfMfkMhFk85+t-NW2eKKS@9r z?yS=8e`44Xx2fpVz~|>c*gRD-YCgb(Zk1)9Aj-U@&-BTi&(udwW}C8a{Z1k-a+X16 z@5Koy3OZGYQke-hVNs_t$XXl9*y2{)qZE3XE*9z4B{z95VyH;#)oPKEXBRf$DUBekFg zvlpQw=kzqL*CwwRi8h})A=uLWf~JXX%U?B^-&WgoKUXK1s;(k;cQO6OCZhm}8`Luy zfNcj9(WjL(7UIoLX1`Z;*pZV`!-@*Fw<4{wiD1A8@O>Br<`<+a730WWWTBscEfT6v z6~or?%Io9r3vWI^z-fXqNCd{NTN=2Ehl=($%DI($vRZ=KHRbRtX=eRzmr9MZnfezr zCE-)`F9(-`YHrP9i-oBA`lz?Hbs35VOEp%ZUxr(oAzD7By<6m~GgMyGxLs?FwJouP zD2(d=NOvO0R*bFc8!dUDEr9k!1tF?;O9~T`agW``^A_>;5U&RbH7VxHijD@$9I<|e z9)r91SowEO*(QUU{bjhrXYmx$l%R29hN)`7HSV;v5gpDO?WjyllIa(B0)cQ4ChD4T z-ICEL;gsasod+sBw$|iDTKGg0>%Ev*)D4(TIBxb?FDbIUX0Vxb%ygPi0jwux)pf#FfO6S$>GOBr6eQY3tUP*4YxHy+M^MsmL3K=XA(ZWZ`6cROfLpAng>dj?wJj0TSM_EH6zW?e%+~Mum0CS zM+GmS7byrDIEilWY=Tw^Hk=ntD#qw4iNO(jfYLhHb{XhIz+w&n*IJ`cMiJe&(cm{$ z62C??ppp5dPI{+I-jVYnv7Qp}2qszPrm z@gks5l1uF1mZ55Oi;{z4_%|qpG#xMoex<Dt~A;NL-%Z;D(C9uJV|I6*4;_zR&#(c~S z8V2)Z@kZ6>B9e0|^L=~(iy(GVVaytW8G+#Bf#Z?^G5f@{k0+a3B9=K21!Q%xW1&xq zU%*oEKhspvAkR=H2_W|Blhud=-9}rQ-&T>JS76E%-lzUltWaG`S&YCtzsxx+LXsxi z>ixryV$ND!KVnIrn|hO*KfUS|M5{%a8sXA(%T-WMVYBG?~ zsNiZ^T_3?=exD8=SvV?GWszkM-1{$12a-I1?$g2^AKZbs%IJ{C7_-~jJP4V`xn*4I zud7iLvs%h6>DBQyw-r;>(a>-Hyd7AeT^Y(Qw9606Ap#MijQp}BYG6dcuLW&`$*nnr z1xDSn2vp74HPQ9JJ=o1M`bdY*z97CPHbeaOK+_3^KEoI7L#LJ?P2!!^?DPMFU zK=#)DHQvl;Rz(nqfc5t!yx)Eivj>vRcH-GY;+;J`?AJT1OMqj~k0;$E_R(A)$~TSW zUYl?|ZgMl@Js%En^oqC0SK1t>suQ)F2evi27*QW|V(>+_kBD4yR;$l+b5tk~th`9c z#)?vDLpMpZh8u44Xh!ElyUX`i5&%*{E?2^W4ye*0`ibOZVWBji(6b$Aihfs*+s zB44kx(S+IcbWeo9`EUy5z`gK{s~9ZzJ*n#EO8>(9F0SLTGEJ3O2mN&;ZZ-LOdeXUX z-9#bgM-ATAHm)=)g@!R|ezv2Qij#ukh!yva9e+s{5{pM*5XL|+!5gr|@IKDLgyp|rOhl4)}=}!)z3B^>#GEU>WI_+6^BSr&yi0sNxpO=-ufs4}&Gp1N z8=j`U?H@nk3=ak@tEvdIlbKsz8I0U|Dzcm%yhRq8Y;>|U&~Hlblsb(kqWrRziUero zY1KloxM}x+B51xu`b7-*+n|nsc?r0`@tb*A2aJb5;s3gm{-pbTvk=9gd9ue>et*T8 ztX+8yDI!o&;ZdQ7EtfG0f6{?i*TEEbcmQXqCr6LEJuB?_n@f&hI8(y(VS5)FVK~q^ zO|KqYq5dNKn6qg@Eh&Sy8(0|azs?J9pPh4)bQ_{inr(^4PyA|%|0aFYUPW}qqRtLK zkvi1xoQw4&1dUs3J0hws#=c_oVw-_so2+WFk<2EA90?3;QfNzBfg&xK@dF71Sq#$Q zsRA%bt!53@d!Mi6h3CO>FN>WYrGK1DNV6+zipm{mQ!+A?7#aA22za}4<3R|w z;p}w7==d7}%QKKn-*hmKYGw03ABs434yfgXUyg_ui$sKY@DX(|njpL&ybY|nGDanl zT^rB4vqV=MUU#<5y$G#=KrRCWR=x&85Nv7xE~LKx4gdfDyy>66#mK^Q7(4`;&Ua!O zsGYeuz8`V1DqZEMb`p@YoW~bIc?yVtE3nX1DF~YhSfaFjj}Q`Ubuh0o2TB9h^ZF>D zC|>-ptyQG zcl52CzpzQg3IxSs5FWrRac>Y7@isdH7`n^di3gIXSiJ+l%m&EAfcKr9V+~Y( z=6gfoR=Sby-q8Gf`N}<qc)N0w*HM2U>)xQFg1MLSL?K5)akgIq-(eGn)|PIm*57J>>0o zwAT$>Pg)Q%_=+FOy=N$bM1{b*^=4#je|YJ5Mlm|m2~U}(*R+q9Ht?VVUINh62b>?C zDq4C-Ouhr7d5sibBde4km$kW~t|~Cn_8LAz9pmql7Zju`41$ng)o~W!WNb1hIl*Mv z*PQJ??v)fHaO{yQ$?X@n`uNSIULgj@Nd54v>JjW~Ms;LNc z_FC>r^;X=?z^u;lDwW(Ke)%6@_+afxlAIdEsWd+}6>(92w8gVosE#NMNQGW8v$Fhh zI&Jd0(!{8;TdP>=AZ-}Cxs1c)n8X2l806NPv{|}OTFo1(cAytI@dkeo`fk%_3(F)@ z6bW;bZ``LRdm(U^Sp%IHn1>0@4j7oABl!tN)9Z4(_sCfk?ZK@v8oLcbj^uBm-f~%Q zC9<0deYF4avg6p}v^V7Xu;tDR8zN3O%ffWBb=DAKg+phoxY{a$T1^z+c!eFpjmTUkmGZQl)HY-e(@u4d zi}vohv?xmq(L1Y&m@Na*XUXDq8DZ6Y!(;%;$0m6kdW5mMH09Erz!@30+m}(uAKH5@ z7kGv!sMj+>eHkHB;S-;KP48Q$?^8J(%C20On$qdfkLb3A<;wbnz2UcGnM4kDKVtCDLkB3G%J@2(Z|=ciZ`On%LP5bUX`7 z1<;jOR&@Sct&3IeYm-6-1ccoj(E7PLfX)r(a;;)RKQfl$+NQ}yZ&{+hpm6fs_*u$! z%x=H3y>vB`zOb|AYd`$L-&HGxLazT1FyLah+5nkR&W+{b{#>`Ox5T9XwghMhvGq)1 z#|w%|OBH+R7O5X%ROvyi)l$V@kXb~+b4UDH3+77fctIp0gYjZ}lrh_?RIr18(s28A zNr^V-jQU6U|NKZspgvf+vx=EZMW0o@NQ?cRyo#mIGrhfLMZY&U5OO(UOJrVFM;B?V zZi>_J7<}N1S)aJnR{WixYZp3qoa?-P-4E!HGjaQ32a0bbvNfieYwujYy-TR|vdxNl zCsB>|@}}jA)>;bbGU++HMRwWq3F6&$j4r;ka7m&sWGomg^0~F2W271#kn0nV90{tw zPVM0=5YzvHu-9Mk@`4w=R(Dx1wtnBM){!H-B6*Hq5Ps3z;l8k{>Gp+LTMTLnjYu9d z@0oZjbHxo%E_!H5g4nA8aHddim$XUZUx2`348|vsT)#H))-5Ad!N(V5$Sq^50^Onf zn~D__%DU};&Kv{RPF{FEH736D5(vW#FSv>o3%!+43Q+T%uM_d!B^x{WZ)?oBcYeQX z`UKgENq)>ZT}$xZfZaT5aK?*_e&wUpkF+Xr?&+O1C;->YM zE^&joe(z*qyLK0XDV;v|${cTmoWA{9)}5(_$begnkhhzA$}dOt+iCISog85lUDXgjw$fzq>cKF? zk*S(S`(!o%un|DU`+>ZDyw-h5bf;j~yL(cm&%t4fIU>{}OFds^l z8Y%!g4w(Pg*CqE$3I(17^)eVb-xqZPQ$dN#%H_P>z7fFz_IAMd1}%-@MS`+%6rP>a zihw|JVX6cN(o?Gl8Z8O%6A^cA=8m5DRiNO8VQVlm7Y|jOPyyIF(-{12 zVBbV#bAdrzUhlus0dz>d+3v?;$k$IEekPt&`xe2@GCbs>nctWdpiOQQ0Ucb=Y3WlM zM56)zq!>tI12_^O>|m-M3N#UuX4n1JtolZ_HB@4#a#xYpcS*z?FJA{C_YT}2;0y8( zI+%MTQPFe2wZQNNEhQK4a3R%%xAEg152lgIV>cOXxh3&gowo6|V#HW4;RY)6+Ek&T zxOu%+(Nrg=^D9Bu{oHT80Oi0KHb7 zhC)m;qf)^T8T1giV#>Ux89U701nFFEP|?ejKANk>bdBdFk#!QJzXbq$y3p;3@d&x1 zQck+WhJY=AYDk4}WN%0o5kV4yHYUPThhz*@+M6f0*M-&P+L^yL1j0cLK@GgRQr0jy z_(iYQ#58yrbxtsg4Ml|AuY$sW2qtI&F2l7Aq*Vjxm==Kmt47EQ=iU%$Q<615hnCC! zU0hM0L4cE9B?%b7=ir2={gdW_bNxTkKNv>)+LS&xfvU;R46>uu-9ovEdi!za?v1Rn zu*%nM?gy7%4Owi?@Z-8w*L2G)p>(EUv#zTk$4Y;nbZnR6AoKoVITYBvv6Gjs&8zRZ zGnV?U&ip)50d+?3Gnf+=m6m1khCRL!&Oy-x-r;5O$UCtigAw0GGzwH>e!V$kp3>#{ z7bM;m)+%o=h}n|caY5I)lP2{y0Qg#fmog226+I}hxCFwoTx=g4fnKtsqW)mc>N%p# ztsmYtPq|;TW3Lo}F0Px_(Fg&ZpS(krFSHkdHLq0yoLY_sj5i zo*@xr*L67_9hQn}z3NxS+o8k5fAmjuhs6Z7Z$Dyr-Tt9kxVP93DG+b+podt6drtEn zIVE?ZnY)E=B}A9R01jB1&<}Yc}xogud!s zQvK{rZMvU_0J>`0rGY&q3A&1PljB4a3GdfFsi>| z{S~dtyB#;7llOkcOAS6mWj{|LFD#}O?O4!Nb?@den+=Nk2+~MN)$i zq|qt1v(%M_uhBu4tuqv-Y9XqlmfUWCF85jJg8TNW%24@>HAWuXnAOMCg0W*EM8`#? zXVOnGeTVYQ_C1%`Zwz9e8!F9$1Sp?$;Pf!WQ#GGnSDo+CxO|_M*mt#5z)_=A`X;aUV-wob8djpe?j*BtMb%>-@6gfhudS{Ft;O5 zPH9hN+3aO5%Ub$^MMbx!Rh+cW-Pd^OlzIE?ivV3Rkg-f3jHFzRd9+q>`BftRM8t7X zbjDt-ZTki?k{{(+RLs?eTq`V;d$LkhEGyAJ4dNJ&CK+4wnJFV66g|C~V@}t_ul+40 zaMNY0~iTEJ2r1KPR*OP04^SQY>QeaH%XURs`jTBSY6G~IUb|0S2R=4U;IFC^u zk4GlwTmMX&rAPdDZgolZs^?tnQ@5%Oj^tLT=VTQaovB7nUbY1THDF4^w*MaN0Uj(8N(MH#r?07(a zMSIV6xvw<;N_95D*60OU|IVK=k6&VRJO}LZJlPShVTh}}>VN%mQ@Io#6I(+j3IOOs z`=5MW3PC>=QZ`6ozyKKRz@4%A00~ROYWhk7m`Q=%p79`6_@C=4{CH*_ zj)c*uFQ!3%FTSt|1o%q01@Of=04~l9o08R4chsiF{kjxD$QFZW=6H!30GOc?aYY7b zVnFnbKs`=41n_`=8Y6!G$q=%-*kdZD0T8jG(5nu0I^RQW-yxbhqgBKV@E)rQk#P1u+Ph9edg6e*0O z^%P*w0xzZhKnTssEKR5>r&uk1Ji@iiK`cGiK=ZE4B-LnWX>2;Ka^5WJ4Oz8o!DPsO ztbGTp#sCK^+78^zJQr0dH(rrN7SGF`Y88Wo7@s}|R^f>iU~SnEv#ILhc#$stLBi(h zh+?NURz46rI@dt(To{qoWn#QWuVb`nsc-Y7V9W8>6c6fNg<;07m+X4)xf)IN(tcXD zNiRVK$-aTA81{Ns9W})@p}ig}@0b%<9jIfbmNK2(NZ1;it6xR^;3x&+^|>FGcx6?Hr^YS75?`nVK#&xOW-;N~5;n zz&Y#|KHXgtT6%O@dqLRkq(F7#sZvGrv%p2=X0872xZ0xA@y+3IT4rW8?jrLfvv7xT%LE1$UCp_s~UJEv`k?VOd+AYrqLF`7A8J5 z+Q4OfNolX^(Oq3gV#DvDiPz8AiZ>g6bX+hTccC+&*GsDK$^WJbUkU{i9`>fNoJ5V# z!UVij=UtkHZPuqJ$PXjOq-DngPQUq7I?)jD+WUu?p<1hQFFUd^GwNmxYkg9U-!Hox z%miM*_Hx0Zl(Kl_=R2I+S3RbLM{gOuA%wmj?g+HeoR&k8#lIobl9Ha|FSzlao3f2e ze|RagkB_y|f>LNNxPz;D8ata-2_!ezX76fLoz8#oMI)AP3TF8+i9z+~+`#qzjAN%; z-U_uM<9NmK*Q#fR%7yB?D@0^GtG~CGNl6r6VV0DnFf%>bMs3TahoX(W<10?86~2}r z^FJ&I*wu{`$O}Ac&pL&9Q>$o>>58=M5Lil8oR$T-KE>e>?j%c$rbw*f!Gx-D zokWFWQZQXN9>MnmhF2(c8h|`jxvaR)VGCaunLKvUG9f|l>rU{=3^I=DCaS9K0c3FXGq*CmPhiEQe<<;3BirhyX$ zWwhE&KV$`zfM?j=1}Y#r=;{VE_l!ie4OtH06y3?6qD*)(g!CN_h$LK^s$L?+cBo8W zkfCuWa#F#%w1q3a|7NzLji{|S4~?IwJovt1bL%l$)G9}j9)-g6onZj#5MzkPplWK4 zG)veU3jN54xw>PrT5kG;OF;ioXB}XXb#$>pEsWI>zdQVw+sA62axRmEb%?8IgnhyD zP_O$9PQFetp4qq};bIaRNKF!6@n13C1QVK7m4mNji}F>+CD zyUN8P5(tl0;EJ;zKb&Pgu)r9R7KF||jEO0Gi_qN|NqF{M;JY1f?kgmh?k!)SIOG1Z z5jU19T=-Y-%?d6kmQH}E4Q2DNfTgBf)V{Qgl}&LN4FK(4hz(a&S#TPFmMW6Sx>bdN z9)0s8gkQ^O<^6xJzd;)&{p?)6-mmZ6e5_C&n*ZqrFos+f6o}R)P*6Ow65fEj{&3wrFXW?izWfInfPWHPnS8CJ8tP6bzoOKC}~vDkQ6^Tk@uzOp?pLa%j9 z1H+8E8|JWWnW6QY2nWFD8Z*g6n$Zy=^tX%b}q*8!Lj zBzK{B27yt~&Q>bk#SBo7{irv103Xm=vY@M06g5(z0TR(-Ium)bkbz#+mf4)UCfGj zM=>dk4B5)k(9P1vKV!`ETs1t|;k)h6Dq7uyi5yZ-il5uafxf7g-EuPI5gM}s_Q!c_ zq$xMw^{|t+3v-)|TX8E$vubIDt~#y8G9`bg;z5!e(nU?=7L6!*Yp}L8$YM*;jcrwV zz-=9HcAi`v#?Ay4JL_K;YCMsH^Iu9wQPJ-qW*`AFOmq)uZS|IVF`2x*u6Tc_UdZ;DoLa*&>4|9=X5n2|Y?bxD-88iXKTX zD=KchU}^9x=zruLBOGeol@BRlr;v1~Ufth=3&QV{gb@-@*F0aAKvkR7G<%h*4 zFULEtAC0a*8Kg!_IF$f>ibvv3pYGWsX{7ntIskbP!(27B;kl^-9tzC>`}~yJD;S%y@l{=5d4D zp12FQ_^!fFoXbSI+A%4KUfD#kI%eKYe6S6aggC4Bm4&i^^VA!j>aG6Y8IIn39md7I z6+h+N$v=3zai*8qhDzc0s(CL=KW?$xXw&gsdoI-OkKgtBUd*Oay4uQ2idjry*rLIZ zAO06x-yX>H{>J~=W-be%DHC$H2^k}b8giT4Y)DfbnPe+vlw8u8OT}`(r6moUYbr&k zoI~YSk!GAOa)e0I6@YKW-t>Ic1tfeemvnYlSWfke4cyDSvKgq2 zhj{W|6tDt>5nA4>vH(}}mNi@GK7uY~ z(=MVEo-QmKc_bL|LBED%N7W1a<0=zS6xpvs>tX)MLVO?21)|JuGK;-D6R(o=P(ENuZPU$4N!eqcivNLlmPu z_QiDS+_xDozp4`^^O$X7!ouORPhTJ0MgEQc4|KQ*yG$b!zo|*7Aa3908{u%*;NjZ#n)0PT1AzC{Mjik5ES@JWhsceCA~ z{<)X|8F-y92TJgqRGxMDxHH-lpv!r2hIuK#c1=bTYh>?*CR_gV;P#?q#RHnL%rM7B zT+b|u{}JCni6@RI;wKW)1fVT}9y!??Cpc!!MqdT7aEWaqp?8b9U=lVp*b|m5RsTzb z?0;AK|JpMDy?uhm5{h62$mY-sjy~wIlCg|{;^wUN&Tsx4EtbD}`R>|#E*qEA5_qeE z^wh?y@U5)@FY5fw9#vc$sp4snb?(X9*ijh)PP(t-k4+&`r;_q4ks6}qmZhtb$Rz-7 zLIWJ(i?6fJF+iD01|uV6ypNrje+Lo7iOo;OALtw`9RmP9JV4AB$9)i%8-KP4#6Jkh zkhDfXgF$ivOhEu|WB4CdkM)k_AyN1~GaEhzQ@P)!6Ow0~1`<&JYopK!&ww;>J0Fl} zmrxe)Lek$MY8Xxd#|K=3JG|U$1unOxyQQmS-FxPUh}*Sj&hh9T>B`e@*@{EH#mzM6 zFqg&Q{A4*S^>w5rz=HT>i_boMARJi4ki=hOy!9Y3i-nb6mR740;e!>8+cDFGs4_%cXSB_cJtKZGZgudVpN5yspAH~rB-KNpTN{9kS}!;bkLfZ{^tVXR?ev;&rL&) zhT9L1*K0%mNF-2AX~jSh{4TFf*M7z)bSecV?PbY$>aANb`niJ_`bnGRrN3UvciGAw zx-i}EqHdD%jlDw*r4K2@$Pvo1X@dN(B-(Z$RL7H{4rOk!NI%3yv&RnfPwT{Em8Z`Dy!8E(tL*`H!4B)Vo8$^ zhVUD0u)Xtt->>Al0N0cF9;^qLyW|oQ=gLdt8uCBd4dUbg&W)$m)C-F_=Q_Qw*`#oM zCMrjBOy7qi0Kt89z6q%a<#GzqS?<*-A(^*gLdgJl;^yS`>}ArJq?JCt$5P14gMvUx-%)~=}Ug_>73;>;q}~==2dx&q%)Y? zwTUn1#xvPpex+3@{b`Z(aH@Vs^IHl$Q_M@Tb+zFKJ9H2bDY;IXV8A`I99(W^;wN&w z7}4!&s;dZ%iW9dAfgYrLFX8ddc_`Z52jl@dQW~JMN0n{I><5y7TG(as0*HGy&AHF{ zcOzla!vyD~;WF(k8LN#Aoz9rQ#{Y8Gv3OP0n}$^lkcRtq|2iFT0ERmkU!!O@^kwR_ zVd3Pfx~2qC%&mO}UrYWj+&NQtCdEUcJ=0oQ$TmzrT@iMG7J26hpySkA^&Uc{z{?nF z)jlMsC3RV(g7aS8n&77|FL>iiaU00U)*H!D75P3vh0X|!m8(p>z27DM7@o|HKApRi z&qCNSo9cuQ-sHZI4g~15{-iL9(cvD!iw+3rJ7+h}Hum*Cgu1N=O#6Uzxi0oipIwF` z5{b=0hQw0}v_m;12WP!v)VgUhA&TJ|x#wuOt#44WCYBM}D4%h3SMV=j-2Zjoj`n=1 z-$1JI~!LO zIsrdJ(OQ|Ke7Ia(CCpP^p%2$wur8BrbEO?Be}1y`Chyeg<*mGBYxll?oij!?NL{zK z$7=sGedAi(#YP*)I5gCtJBi(%Ac|0F>ewDB&1A8krFZ%y@&(v0_r^DG}69V~*0NPr9@uVMwS#DTf zq?E-w$b{;X!=XI1;$DBWa%0AF630q9?0|Ox%!YgRga6-4j_c>z%hU^U|*yN{4!* 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 dB#? GetWeakIOManager() const = 0; + virtual fml::WeakPtr GetResourceContext() const = 0; virtual fml::RefPtr GetSkiaUnrefQueue() const = 0; diff --git a/lib/ui/painting/codec.cc b/lib/ui/painting/codec.cc index d8418bd7455ca..b181837e3f51f 100644 --- a/lib/ui/painting/codec.cc +++ b/lib/ui/painting/codec.cc @@ -4,11 +4,15 @@ #include "flutter/lib/ui/painting/codec.h" +#include + #include "flutter/common/task_runners.h" #include "flutter/fml/logging.h" #include "flutter/fml/make_copyable.h" #include "flutter/fml/trace_event.h" #include "flutter/lib/ui/painting/frame_info.h" +#include "flutter/lib/ui/painting/multi_frame_codec.h" +#include "flutter/lib/ui/painting/single_frame_codec.h" #include "third_party/skia/include/codec/SkCodec.h" #include "third_party/skia/include/core/SkPixelRef.h" #include "third_party/tonic/dart_binding_macros.h" @@ -23,11 +27,6 @@ using tonic::ToDart; namespace flutter { -namespace { - -static constexpr const char* kInitCodecTraceTag = "InitCodec"; -static constexpr const char* kCodecNextFrameTraceTag = "CodecNextFrame"; - // This needs to be kept in sync with _kDoNotResizeDimension in painting.dart const int kDoNotResizeDimension = -1; @@ -37,284 +36,27 @@ enum PixelFormat { kBGRA8888, }; -struct ImageInfo { - SkImageInfo sk_info; - size_t row_bytes; -}; - -static void InvokeCodecCallback(fml::RefPtr codec, - std::unique_ptr callback, - size_t trace_id) { - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - return; - } - tonic::DartState::Scope scope(dart_state); - if (!codec) { - DartInvoke(callback->value(), {Dart_Null()}); - } else { - DartInvoke(callback->value(), {ToDart(codec)}); - } - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); -} - -static sk_sp DecodeImage(fml::WeakPtr context, - sk_sp buffer, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("flutter", "DecodeImage"); - - if (buffer == nullptr || buffer->isEmpty()) { - return nullptr; - } - - if (context) { - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - return SkImage::MakeCrossContextFromEncoded( - context.get(), std::move(buffer), true, dstColorSpace.get(), true); - } else { - // Defer decoding until time of draw later on the GPU thread. Can happen - // when GL operations are currently forbidden such as in the background - // on iOS. - return SkImage::MakeFromEncoded(std::move(buffer)); - } -} - -// Returns true if the image needs to be resized. -// -// newWidth and newHeight will reflect the dimensions that the image should -// be scaled to. -// -// The targetWidth and targetHeight arguments specify the size of the output -// image, in image pixels. If they are not equal to the intrinsic dimensions of -// the image, then the image will be scaled after being decoded. If exactly one -// of these two arguments is equal to kDoNotResizeDimension, then the aspect -// ratio will be maintained while forcing the image to match the other given -// dimension. If both are equal to kDoNotResizeDimension, then the image -// maintains its real size. -static bool needsResize(const int currentWidth, - const int currentHeight, - const int targetWidth, - const int targetHeight, - int& newWidth, - int& newHeight) { - newWidth = currentWidth; - newHeight = currentHeight; - if (targetWidth == kDoNotResizeDimension && - targetHeight == kDoNotResizeDimension) { - return false; - } - - if (currentWidth == targetWidth && currentHeight == targetHeight) { - return false; - } - - if (targetWidth == kDoNotResizeDimension) { - newHeight = targetHeight; - const double aspectRatio = (double)currentWidth / currentHeight; - newWidth = round(aspectRatio * newHeight); - return true; - } else if (targetHeight == kDoNotResizeDimension) { - newWidth = targetWidth; - const double invAspectRatio = (double)currentHeight / currentWidth; - newHeight = round(invAspectRatio * newWidth); - return true; - } else { - newWidth = targetWidth; - newHeight = targetHeight; - return true; - } -} - -static sk_sp ResizeImageToExactSize(fml::WeakPtr context, - sk_sp image, - SkImageInfo scaledImageInfo) { - if (image == nullptr || !image.get()) { - FML_LOG(ERROR) << "Failed to decode image."; - return nullptr; - } - - SkBitmap bitmap = SkBitmap(); - if (!bitmap.tryAllocPixels(scaledImageInfo)) { - FML_LOG(ERROR) << "Failed to allocate bitmap."; - return nullptr; - } - - if (!image->scalePixels(bitmap.pixmap(), kLow_SkFilterQuality)) { - FML_LOG(ERROR) << "Failed to scale pixels."; - return nullptr; - } - - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - GrContext* grContext = context ? context.get() : nullptr; - return SkImage::MakeCrossContextFromPixmap(grContext, bitmap.pixmap(), true, - dstColorSpace.get(), true); -} - -static sk_sp DecodeAndResizeImageToExactSize( - fml::WeakPtr context, - SkImageInfo scaledImageInfo, - sk_sp buffer, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("flutter", "DecodeAndResizeImageToExactSize"); - - // Do not create a cross context image here, since it can not be resized. - sk_sp image = SkImage::MakeFromEncoded(std::move(buffer)); - return ResizeImageToExactSize(context, image, scaledImageInfo); -} - -static sk_sp DecodeAndResizeImage(fml::WeakPtr context, - std::unique_ptr& skCodec, - sk_sp buffer, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - const SkImageInfo imageInfo = skCodec->getInfo(); - - const int width = imageInfo.width(); - const int height = imageInfo.height(); - - int newWidth, newHeight; - if (needsResize(width, height, targetWidth, targetHeight, newWidth, - newHeight)) { - return DecodeAndResizeImageToExactSize( - context, imageInfo.makeWH(newWidth, newHeight), buffer, trace_id); - } else { - return DecodeImage(context, buffer, trace_id); - } -} - -fml::RefPtr InitCodec(fml::WeakPtr context, - sk_sp buffer, - fml::RefPtr unref_queue, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("blink", "InitCodec"); - - if (buffer == nullptr || buffer->isEmpty()) { - FML_LOG(ERROR) << "InitCodec failed - buffer was empty "; - return nullptr; - } - - std::unique_ptr skCodec = SkCodec::MakeFromData(buffer); - if (!skCodec) { - FML_LOG(ERROR) << "Failed decoding image. Data is either invalid, or it is " - "encoded using an unsupported format."; - return nullptr; - } - if (skCodec->getFrameCount() > 1) { - return fml::MakeRefCounted(std::move(skCodec)); - } - - auto skImage = DecodeAndResizeImage(context, skCodec, buffer, targetWidth, - targetHeight, trace_id); - FML_DCHECK(skImage) << "Unable to resize the image to (w, h): " << targetWidth - << ", " << targetHeight << "."; - if (!skImage) { - return nullptr; - } - auto image = CanvasImage::Create(); - image->set_image({skImage, unref_queue}); - auto frameInfo = fml::MakeRefCounted(std::move(image), 0); - return fml::MakeRefCounted(std::move(frameInfo)); -} - -fml::RefPtr InitCodecUncompressed( - fml::WeakPtr context, - sk_sp buffer, - ImageInfo image_info, - fml::RefPtr unref_queue, - int targetWidth, - int targetHeight, - size_t trace_id) { - TRACE_FLOW_STEP("flutter", kInitCodecTraceTag, trace_id); - TRACE_EVENT0("blink", "InitCodecUncompressed"); - - if (buffer == nullptr || buffer->isEmpty()) { - FML_LOG(ERROR) << "InitCodecUncompressed failed - buffer was empty"; - return nullptr; - } - - sk_sp skImage; - int newWidth, newHeight; - if (needsResize(image_info.sk_info.width(), image_info.sk_info.height(), - targetWidth, targetHeight, newWidth, newHeight)) { - auto imageToResize = SkImage::MakeRasterData( - image_info.sk_info, std::move(buffer), image_info.row_bytes); - skImage = ResizeImageToExactSize( - context, imageToResize, image_info.sk_info.makeWH(newWidth, newHeight)); - } else if (context) { - SkPixmap pixmap(image_info.sk_info, buffer->data(), image_info.row_bytes); - skImage = SkImage::MakeCrossContextFromPixmap(context.get(), pixmap, true, - nullptr, true); - } else { - skImage = SkImage::MakeRasterData(image_info.sk_info, std::move(buffer), - image_info.row_bytes); - } - - auto image = CanvasImage::Create(); - image->set_image({skImage, unref_queue}); - auto frameInfo = fml::MakeRefCounted(std::move(image), 0); - return fml::MakeRefCounted(std::move(frameInfo)); -} - -void InitCodecAndInvokeCodecCallback( - fml::RefPtr ui_task_runner, - fml::WeakPtr context, - fml::RefPtr unref_queue, - std::unique_ptr callback, - sk_sp buffer, - std::unique_ptr image_info, - const int targetWidth, - const int targetHeight, - size_t trace_id) { - fml::RefPtr codec; - if (image_info) { - codec = InitCodecUncompressed(context, std::move(buffer), *image_info, - std::move(unref_queue), targetWidth, - targetHeight, trace_id); - } else { - codec = InitCodec(context, std::move(buffer), std::move(unref_queue), - targetWidth, targetHeight, trace_id); - } - ui_task_runner->PostTask( - fml::MakeCopyable([callback = std::move(callback), - codec = std::move(codec), trace_id]() mutable { - InvokeCodecCallback(std::move(codec), std::move(callback), trace_id); - })); -} - -bool ConvertImageInfo(Dart_Handle image_info_handle, - Dart_NativeArguments args, - ImageInfo* image_info) { +static std::variant ConvertImageInfo( + Dart_Handle image_info_handle, + Dart_NativeArguments args) { Dart_Handle width_handle = Dart_GetField(image_info_handle, ToDart("width")); if (!Dart_IsInteger(width_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.width must be an integer")); - return false; + return "ImageInfo.width must be an integer"; } Dart_Handle height_handle = Dart_GetField(image_info_handle, ToDart("height")); if (!Dart_IsInteger(height_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.height must be an integer")); - return false; + return "ImageInfo.height must be an integer"; } Dart_Handle format_handle = Dart_GetField(image_info_handle, ToDart("format")); if (!Dart_IsInteger(format_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.format must be an integer")); - return false; + return "ImageInfo.format must be an integer"; } Dart_Handle row_bytes_handle = Dart_GetField(image_info_handle, ToDart("rowBytes")); if (!Dart_IsInteger(row_bytes_handle)) { - Dart_SetReturnValue(args, ToDart("ImageInfo.rowBytes must be an integer")); - return false; + return "ImageInfo.rowBytes must be an integer"; } PixelFormat pixel_format = static_cast( @@ -329,70 +71,71 @@ bool ConvertImageInfo(Dart_Handle image_info_handle, break; } if (color_type == kUnknown_SkColorType) { - Dart_SetReturnValue(args, ToDart("Invalid pixel format")); - return false; + return "Invalid pixel format"; } int width = tonic::DartConverter::FromDart(width_handle); if (width <= 0) { - Dart_SetReturnValue(args, ToDart("width must be greater than zero")); - return false; + return "width must be greater than zero"; } int height = tonic::DartConverter::FromDart(height_handle); if (height <= 0) { - Dart_SetReturnValue(args, ToDart("height must be greater than zero")); - return false; + return "height must be greater than zero"; } - image_info->sk_info = + + ImageDecoder::ImageInfo image_info; + image_info.sk_info = SkImageInfo::Make(width, height, color_type, kPremul_SkAlphaType); - image_info->row_bytes = + image_info.row_bytes = tonic::DartConverter::FromDart(row_bytes_handle); - if (image_info->row_bytes < image_info->sk_info.minRowBytes()) { - Dart_SetReturnValue( - args, ToDart("rowBytes does not match the width of the image")); - return false; + if (image_info.row_bytes < image_info.sk_info.minRowBytes()) { + return "rowBytes does not match the width of the image"; } - return true; + return image_info; } -void InstantiateImageCodec(Dart_NativeArguments args) { - static size_t trace_counter = 1; - const size_t trace_id = trace_counter++; - TRACE_FLOW_BEGIN("flutter", kInitCodecTraceTag, trace_id); - +static void InstantiateImageCodec(Dart_NativeArguments args) { Dart_Handle callback_handle = Dart_GetNativeArgument(args, 1); if (!Dart_IsClosure(callback_handle)) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - Dart_SetReturnValue(args, ToDart("Callback must be a function")); + Dart_SetReturnValue(args, tonic::ToDart("Callback must be a function")); return; } Dart_Handle image_info_handle = Dart_GetNativeArgument(args, 2); - std::unique_ptr image_info; + + std::optional image_info; + if (!Dart_IsNull(image_info_handle)) { - image_info = std::make_unique(); - if (!ConvertImageInfo(image_info_handle, args, image_info.get())) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); + auto image_info_results = ConvertImageInfo(image_info_handle, args); + if (auto value = + std::get_if(&image_info_results)) { + image_info = *value; + } else if (auto error = std::get_if(&image_info_results)) { + Dart_SetReturnValue(args, tonic::ToDart(*error)); return; } } - Dart_Handle exception = nullptr; - tonic::Uint8List list = - tonic::DartConverter::FromArguments(args, 0, exception); - if (exception) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - Dart_SetReturnValue(args, exception); - return; + sk_sp buffer; + + { + Dart_Handle exception = nullptr; + tonic::Uint8List list = + tonic::DartConverter::FromArguments(args, 0, + exception); + if (exception) { + Dart_SetReturnValue(args, exception); + return; + } + buffer = SkData::MakeWithCopy(list.data(), list.num_elements()); } if (image_info) { - int expected_size = image_info->row_bytes * image_info->sk_info.height(); - if (list.num_elements() < expected_size) { - TRACE_FLOW_END("flutter", kInitCodecTraceTag, trace_id); - list.Release(); + const auto expected_size = + image_info->row_bytes * image_info->sk_info.height(); + if (buffer->size() < expected_size) { Dart_SetReturnValue( args, ToDart("Pixel buffer size does not match image size")); return; @@ -404,73 +147,34 @@ void InstantiateImageCodec(Dart_NativeArguments args) { const int targetHeight = tonic::DartConverter::FromDart(Dart_GetNativeArgument(args, 4)); - auto buffer = SkData::MakeWithCopy(list.data(), list.num_elements()); - - auto* dart_state = UIDartState::Current(); - - const auto& task_runners = dart_state->GetTaskRunners(); - task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( - [callback = std::make_unique( - tonic::DartState::Current(), callback_handle), - buffer = std::move(buffer), trace_id, image_info = std::move(image_info), - ui_task_runner = task_runners.GetUITaskRunner(), - context = dart_state->GetResourceContext(), - queue = UIDartState::Current()->GetSkiaUnrefQueue(), targetWidth, - targetHeight]() mutable { - InitCodecAndInvokeCodecCallback( - std::move(ui_task_runner), context, std::move(queue), - std::move(callback), std::move(buffer), std::move(image_info), - targetWidth, targetHeight, trace_id); - })); -} + auto codec = SkCodec::MakeFromData(buffer); -bool copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) { - SkPixmap srcPM; - if (!src.peekPixels(&srcPM)) { - return false; - } - - SkBitmap tmpDst; - SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); - if (!tmpDst.setInfo(dstInfo)) { - return false; - } - - if (!tmpDst.tryAllocPixels()) { - return false; + if (!codec) { + Dart_SetReturnValue(args, ToDart("Could not instantiate image codec.")); + return; } - SkPixmap dstPM; - if (!tmpDst.peekPixels(&dstPM)) { - return false; - } + fml::RefPtr ui_codec; - if (!srcPM.readPixels(dstPM)) { - return false; - } + if (codec->getFrameCount() == 1) { + ImageDecoder::ImageDescriptor descriptor; + descriptor.decompressed_image_info = image_info; - dst->swap(tmpDst); - return true; -} + if (targetWidth != kDoNotResizeDimension) { + descriptor.target_width = targetWidth; + } + if (targetHeight != kDoNotResizeDimension) { + descriptor.target_height = targetHeight; + } + descriptor.data = std::move(buffer); -void InvokeNextFrameCallback(fml::RefPtr frameInfo, - std::unique_ptr callback, - size_t trace_id) { - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); - return; - } - tonic::DartState::Scope scope(dart_state); - if (!frameInfo) { - DartInvoke(callback->value(), {Dart_Null()}); + ui_codec = fml::MakeRefCounted(std::move(descriptor)); } else { - DartInvoke(callback->value(), {ToDart(frameInfo)}); + ui_codec = fml::MakeRefCounted(std::move(codec)); } - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); -} -} // namespace + tonic::DartInvoke(callback_handle, {ToDart(ui_codec)}); +} IMPLEMENT_WRAPPERTYPEINFO(ui, Codec); @@ -486,166 +190,6 @@ void Codec::dispose() { ClearDartWrapper(); } -MultiFrameCodec::MultiFrameCodec(std::unique_ptr codec) - : codec_(std::move(codec)), - frameCount_(codec_->getFrameCount()), - repetitionCount_(codec_->getRepetitionCount()), - nextFrameIndex_(0) {} - -MultiFrameCodec::~MultiFrameCodec() {} - -int MultiFrameCodec::frameCount() const { - return frameCount_; -} - -int MultiFrameCodec::repetitionCount() const { - return repetitionCount_; -} - -sk_sp MultiFrameCodec::GetNextFrameImage( - fml::WeakPtr resourceContext) { - SkBitmap bitmap = SkBitmap(); - SkImageInfo info = codec_->getInfo().makeColorType(kN32_SkColorType); - if (info.alphaType() == kUnpremul_SkAlphaType) { - info = info.makeAlphaType(kPremul_SkAlphaType); - } - bitmap.allocPixels(info); - - SkCodec::Options options; - options.fFrameIndex = nextFrameIndex_; - SkCodec::FrameInfo frameInfo; - codec_->getFrameInfo(nextFrameIndex_, &frameInfo); - const int requiredFrameIndex = frameInfo.fRequiredFrame; - if (requiredFrameIndex != SkCodec::kNoFrame) { - if (lastRequiredFrame_ == nullptr) { - FML_LOG(ERROR) << "Frame " << nextFrameIndex_ << " depends on frame " - << requiredFrameIndex - << " and no required frames are cached."; - return NULL; - } else if (lastRequiredFrameIndex_ != requiredFrameIndex) { - FML_DLOG(INFO) << "Required frame " << requiredFrameIndex - << " is not cached. Using " << lastRequiredFrameIndex_ - << " instead"; - } - - if (lastRequiredFrame_->getPixels() && - copy_to(&bitmap, lastRequiredFrame_->colorType(), - *lastRequiredFrame_)) { - options.fPriorFrame = requiredFrameIndex; - } - } - - if (SkCodec::kSuccess != codec_->getPixels(info, bitmap.getPixels(), - bitmap.rowBytes(), &options)) { - FML_LOG(ERROR) << "Could not getPixels for frame " << nextFrameIndex_; - return NULL; - } - - // Hold onto this if we need it to decode future frames. - if (frameInfo.fDisposalMethod == SkCodecAnimation::DisposalMethod::kKeep) { - lastRequiredFrame_ = std::make_unique(bitmap); - lastRequiredFrameIndex_ = nextFrameIndex_; - } - - if (resourceContext) { - SkPixmap pixmap(bitmap.info(), bitmap.pixelRef()->pixels(), - bitmap.pixelRef()->rowBytes()); - // This indicates that we do not want a "linear blending" decode. - sk_sp dstColorSpace = nullptr; - return SkImage::MakeCrossContextFromPixmap(resourceContext.get(), pixmap, - true, dstColorSpace.get()); - } else { - // Defer decoding until time of draw later on the GPU thread. Can happen - // when GL operations are currently forbidden such as in the background - // on iOS. - return SkImage::MakeFromBitmap(bitmap); - } -} - -void MultiFrameCodec::GetNextFrameAndInvokeCallback( - std::unique_ptr callback, - fml::RefPtr ui_task_runner, - fml::WeakPtr resourceContext, - fml::RefPtr unref_queue, - size_t trace_id) { - fml::RefPtr frameInfo = NULL; - sk_sp skImage = GetNextFrameImage(resourceContext); - if (skImage) { - fml::RefPtr image = CanvasImage::Create(); - image->set_image({skImage, std::move(unref_queue)}); - SkCodec::FrameInfo skFrameInfo; - codec_->getFrameInfo(nextFrameIndex_, &skFrameInfo); - frameInfo = - fml::MakeRefCounted(std::move(image), skFrameInfo.fDuration); - } - nextFrameIndex_ = (nextFrameIndex_ + 1) % frameCount_; - - ui_task_runner->PostTask(fml::MakeCopyable( - [callback = std::move(callback), frameInfo, trace_id]() mutable { - InvokeNextFrameCallback(frameInfo, std::move(callback), trace_id); - })); - - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); -} - -Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) { - static size_t trace_counter = 1; - const size_t trace_id = trace_counter++; - TRACE_FLOW_BEGIN("flutter", kCodecNextFrameTraceTag, trace_id); - - if (!Dart_IsClosure(callback_handle)) { - TRACE_FLOW_END("flutter", kCodecNextFrameTraceTag, trace_id); - return ToDart("Callback must be a function"); - } - - auto* dart_state = UIDartState::Current(); - - const auto& task_runners = dart_state->GetTaskRunners(); - - task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( - [callback = std::make_unique( - tonic::DartState::Current(), callback_handle), - this, trace_id, ui_task_runner = task_runners.GetUITaskRunner(), - queue = UIDartState::Current()->GetSkiaUnrefQueue(), - context = dart_state->GetResourceContext()]() mutable { - GetNextFrameAndInvokeCallback(std::move(callback), - std::move(ui_task_runner), context, - std::move(queue), trace_id); - })); - - return Dart_Null(); -} - -SingleFrameCodec::SingleFrameCodec(fml::RefPtr frame) - : frame_(std::move(frame)) {} - -SingleFrameCodec::~SingleFrameCodec() {} - -int SingleFrameCodec::frameCount() const { - return 1; -} - -int SingleFrameCodec::repetitionCount() const { - return 0; -} - -Dart_Handle SingleFrameCodec::getNextFrame(Dart_Handle callback_handle) { - if (!Dart_IsClosure(callback_handle)) { - return ToDart("Callback must be a function"); - } - - auto callback = std::make_unique( - tonic::DartState::Current(), callback_handle); - std::shared_ptr dart_state = callback->dart_state().lock(); - if (!dart_state) { - return ToDart("Invalid dart state"); - } - - tonic::DartState::Scope scope(dart_state); - DartInvoke(callback->value(), {ToDart(frame_)}); - return Dart_Null(); -} - void Codec::RegisterNatives(tonic::DartLibraryNatives* natives) { natives->Register({ {"instantiateImageCodec", InstantiateImageCodec, 5, true}, diff --git a/lib/ui/painting/codec.h b/lib/ui/painting/codec.h index 776e97cc58c53..2e0c746eac2d6 100644 --- a/lib/ui/painting/codec.h +++ b/lib/ui/painting/codec.h @@ -27,63 +27,16 @@ class Codec : public RefCountedDartWrappable { public: virtual int frameCount() const = 0; + virtual int repetitionCount() const = 0; + virtual Dart_Handle getNextFrame(Dart_Handle callback_handle) = 0; + void dispose(); static void RegisterNatives(tonic::DartLibraryNatives* natives); }; -class MultiFrameCodec : public Codec { - public: - int frameCount() const override; - int repetitionCount() const override; - Dart_Handle getNextFrame(Dart_Handle args) override; - - private: - MultiFrameCodec(std::unique_ptr codec); - - ~MultiFrameCodec() override; - - sk_sp GetNextFrameImage(fml::WeakPtr resourceContext); - - void GetNextFrameAndInvokeCallback( - std::unique_ptr callback, - fml::RefPtr ui_task_runner, - fml::WeakPtr resourceContext, - fml::RefPtr unref_queue, - size_t trace_id); - - const std::unique_ptr codec_; - const int frameCount_; - const int repetitionCount_; - int nextFrameIndex_; - - // The last decoded frame that's required to decode any subsequent frames. - std::unique_ptr lastRequiredFrame_; - // The index of the last decoded required frame. - int lastRequiredFrameIndex_ = -1; - - FML_FRIEND_MAKE_REF_COUNTED(MultiFrameCodec); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(MultiFrameCodec); -}; - -class SingleFrameCodec : public Codec { - public: - int frameCount() const override; - int repetitionCount() const override; - Dart_Handle getNextFrame(Dart_Handle args) override; - - private: - SingleFrameCodec(fml::RefPtr frame); - ~SingleFrameCodec() override; - - fml::RefPtr frame_; - - FML_FRIEND_MAKE_REF_COUNTED(SingleFrameCodec); - FML_FRIEND_REF_COUNTED_THREAD_SAFE(SingleFrameCodec); -}; - } // namespace flutter #endif // FLUTTER_LIB_UI_PAINTING_CODEC_H_ diff --git a/lib/ui/painting/frame_info.h b/lib/ui/painting/frame_info.h index 2637d3e66d182..184b132d17791 100644 --- a/lib/ui/painting/frame_info.h +++ b/lib/ui/painting/frame_info.h @@ -8,10 +8,6 @@ #include "flutter/lib/ui/dart_wrapper.h" #include "flutter/lib/ui/painting/image.h" -namespace tonic { -class DartLibraryNatives; -} // namespace tonic - namespace flutter { // A single animation frame. diff --git a/lib/ui/painting/image.cc b/lib/ui/painting/image.cc index a0a4bfcb02737..8ee65790924bf 100644 --- a/lib/ui/painting/image.cc +++ b/lib/ui/painting/image.cc @@ -42,7 +42,10 @@ void CanvasImage::dispose() { size_t CanvasImage::GetAllocationSize() { if (auto image = image_.get()) { - return image->width() * image->height() * 4; + const auto& info = image->imageInfo(); + const auto kMipmapOverhead = 4.0 / 3.0; + const size_t image_byte_size = info.computeMinByteSize() * kMipmapOverhead; + return image_byte_size + sizeof(this); } else { return sizeof(CanvasImage); } diff --git a/lib/ui/painting/image_decoder.cc b/lib/ui/painting/image_decoder.cc new file mode 100644 index 0000000000000..200349eb4b636 --- /dev/null +++ b/lib/ui/painting/image_decoder.cc @@ -0,0 +1,336 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/lib/ui/painting/image_decoder.h" + +#include "flutter/fml/make_copyable.h" +#include "flutter/fml/trace_event.h" +#include "third_party/skia/include/codec/SkCodec.h" + +namespace flutter { + +ImageDecoder::ImageDecoder( + TaskRunners runners, + std::shared_ptr concurrent_task_runner, + fml::WeakPtr io_manager) + : runners_(std::move(runners)), + concurrent_task_runner_(std::move(concurrent_task_runner)), + io_manager_(std::move(io_manager)), + weak_factory_(this) { + FML_DCHECK(runners_.IsValid()); + FML_DCHECK(runners_.GetUITaskRunner()->RunsTasksOnCurrentThread()) + << "The image decoder must be created & collected on the UI thread."; +} + +ImageDecoder::~ImageDecoder() = default; + +// Get the updated dimensions of the image. If both dimensions are specified, +// use them. If one of them is specified, respect the one that is and use the +// aspect ratio to calculate the other. If neither dimension is specified, use +// intrinsic dimensions of the image. +static SkISize GetResizedDimensions(SkISize current_size, + std::optional target_width, + std::optional target_height) { + if (current_size.isEmpty()) { + return SkISize::MakeEmpty(); + } + + if (target_width && target_height) { + return SkISize::Make(target_width.value(), target_height.value()); + } + + const auto aspect_ratio = + static_cast(current_size.width()) / current_size.height(); + + if (target_width) { + return SkISize::Make(target_width.value(), + target_width.value() / aspect_ratio); + } + + if (target_height) { + return SkISize::Make(target_height.value() * aspect_ratio, + target_height.value()); + } + + return current_size; +} + +static sk_sp ResizeRasterImage(sk_sp image, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + FML_DCHECK(!image->isTextureBacked()); + + const auto resized_dimensions = + GetResizedDimensions(image->dimensions(), target_width, target_height); + + if (resized_dimensions.isEmpty()) { + FML_LOG(ERROR) << "Could not resize to empty dimensions."; + return nullptr; + } + + if (resized_dimensions == image->dimensions()) { + // The resized dimesions are the same as the intrinsic dimensions of the + // image. There is nothing to do. + return image; + } + + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + const auto scaled_image_info = image->imageInfo().makeWH( + resized_dimensions.width(), resized_dimensions.height()); + + SkBitmap scaled_bitmap; + if (!scaled_bitmap.tryAllocPixels(scaled_image_info)) { + FML_LOG(ERROR) << "Could not allocate bitmap when attempting to scale."; + return nullptr; + } + + if (!image->scalePixels(scaled_bitmap.pixmap(), kLow_SkFilterQuality, + SkImage::kDisallow_CachingHint)) { + FML_LOG(ERROR) << "Could not scale pixels"; + return nullptr; + } + + // Marking this as immutable makes the MakeFromBitmap call share the pixels + // instead of copying. + scaled_bitmap.setImmutable(); + + auto scaled_image = SkImage::MakeFromBitmap(scaled_bitmap); + if (!scaled_image) { + FML_LOG(ERROR) << "Could not create a scaled image from a scaled bitmap."; + return nullptr; + } + + return scaled_image; +} + +static sk_sp ImageFromDecompressedData( + sk_sp data, + ImageDecoder::ImageInfo info, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + auto image = SkImage::MakeRasterData(info.sk_info, data, info.row_bytes); + + if (!image) { + FML_LOG(ERROR) << "Could not create image from decompressed bytes."; + return nullptr; + } + + return ResizeRasterImage(std::move(image), target_width, target_height, flow); +} + +static sk_sp ImageFromCompressedData( + sk_sp data, + std::optional target_width, + std::optional target_height, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + auto codec = SkCodec::MakeFromData(data); + + if (!codec) { + return nullptr; + } + + const auto encoded_info = codec->getInfo(); + + if (encoded_info.dimensions().isEmpty()) { + return nullptr; + } + + const double desired_width = + target_width.value_or(encoded_info.dimensions().width()); + const double desired_height = + target_height.value_or(encoded_info.dimensions().height()); + + const auto scale_x = desired_width / encoded_info.dimensions().width(); + const auto scale_y = desired_height / encoded_info.dimensions().height(); + + const double scale = std::min({scale_x, scale_y, 1.0}); + + if (scale <= 0.0) { + return nullptr; + } + + // We ask the codec for one of the natively supported dimensions. This may not + // be exactly what we need, but it will also be smaller than 1:1. We will + // still have to perform a resize, but from a smaller intermediate buffer. In + // case no resize needs to be performed, ResizeRasterImage will just return + // the original image. + const auto scaled_dimensions = codec->getScaledDimensions(scale); + + if (scaled_dimensions.isEmpty()) { + return nullptr; + } + + const auto decoded_info = encoded_info.makeWH(scaled_dimensions.width(), + scaled_dimensions.height()); + + SkBitmap decoded_bitmap; + if (!decoded_bitmap.tryAllocPixels(decoded_info)) { + FML_LOG(ERROR) << "Could not perform allocation for image decoding."; + return nullptr; + } + + const auto decompression_result = codec->getPixels(decoded_bitmap.pixmap()); + if (decompression_result != SkCodec::Result::kSuccess) { + FML_LOG(ERROR) << "Could not perform image decompression. Error: " + << SkCodec::ResultToString(decompression_result); + return nullptr; + } + + decoded_bitmap.setImmutable(); + + auto decoded_image = SkImage::MakeFromBitmap(decoded_bitmap); + + if (!decoded_image) { + return nullptr; + } + + return ResizeRasterImage(decoded_image, target_width, target_height, flow); +} + +static SkiaGPUObject UploadRasterImage( + sk_sp image, + fml::WeakPtr context, + fml::RefPtr queue, + const fml::tracing::TraceFlow& flow) { + TRACE_EVENT0("flutter", __FUNCTION__); + flow.Step(__FUNCTION__); + + // Should not already be a texture image because that is the entire point of + // the this method. + FML_DCHECK(!image->isTextureBacked()); + + if (!context || !queue) { + FML_LOG(ERROR) + << "Could not acquire context of release queue for texture upload."; + return {}; + } + + SkPixmap pixmap; + if (!image->peekPixels(&pixmap)) { + FML_LOG(ERROR) << "Could not peek pixels of image for texture upload."; + return {}; + } + + auto texture_image = + SkImage::MakeCrossContextFromPixmap(context.get(), // context + pixmap, // pixmap + true, // buildMips, + nullptr, // dstColorSpace, + true // limitToMaxTextureSize + ); + + if (!texture_image) { + FML_LOG(ERROR) << "Could not make x-context image."; + return {}; + } + + return {texture_image, queue}; +} + +void ImageDecoder::Decode(ImageDescriptor descriptor, ImageResult callback) { + TRACE_EVENT0("flutter", __FUNCTION__); + fml::tracing::TraceFlow flow(__FUNCTION__); + + FML_DCHECK(callback); + FML_DCHECK(runners_.GetUITaskRunner()->RunsTasksOnCurrentThread()); + + // Always service the callback on the UI thread. + auto result = [callback, ui_runner = runners_.GetUITaskRunner()]( + SkiaGPUObject image, + fml::tracing::TraceFlow flow) { + ui_runner->PostTask(fml::MakeCopyable( + [callback, image = std::move(image), flow = std::move(flow)]() mutable { + // We are going to terminate the trace flow here. Flows cannot + // terminate without a base trace. Add one explicitly. + TRACE_EVENT0("flutter", "ImageDecodeCallback"); + flow.End(); + callback(std::move(image)); + })); + }; + + if (!descriptor.data || descriptor.data->size() == 0) { + result({}, std::move(flow)); + return; + } + + concurrent_task_runner_->PostTask( + fml::MakeCopyable([descriptor, // + io_manager = io_manager_, // + io_runner = runners_.GetIOTaskRunner(), // + result, // + flow = std::move(flow) // + ]() mutable { + // Step 1: Decompress the image. + // On Worker. + + auto decompressed = + descriptor.decompressed_image_info + ? ImageFromDecompressedData( + std::move(descriptor.data), // + descriptor.decompressed_image_info.value(), // + descriptor.target_width, // + descriptor.target_height, // + flow // + ) + : ImageFromCompressedData(std::move(descriptor.data), // + descriptor.target_width, // + descriptor.target_height, // + flow); + + if (!decompressed) { + FML_LOG(ERROR) << "Could not decompress image."; + result({}, std::move(flow)); + return; + } + + // Step 2: Update the image to the GPU. + // On IO Thread. + + io_runner->PostTask(fml::MakeCopyable([io_manager, decompressed, result, + flow = + std::move(flow)]() mutable { + if (!io_manager) { + FML_LOG(ERROR) << "Could not acquire IO manager."; + return result({}, std::move(flow)); + } + + // If the IO manager does not have a resource context, the caller + // might not have set one or a software backend could be in use. + // Either way, just return the image as-is. + if (!io_manager->GetResourceContext()) { + result({std::move(decompressed), io_manager->GetSkiaUnrefQueue()}, + std::move(flow)); + return; + } + + auto uploaded = UploadRasterImage( + std::move(decompressed), io_manager->GetResourceContext(), + io_manager->GetSkiaUnrefQueue(), flow); + + if (!uploaded.get()) { + FML_LOG(ERROR) << "Could not upload image to the GPU."; + result({}, std::move(flow)); + return; + } + + // Finally, all done. + result(std::move(uploaded), std::move(flow)); + })); + })); +} + +fml::WeakPtr ImageDecoder::GetWeakPtr() const { + return weak_factory_.GetWeakPtr(); +} + +} // namespace flutter diff --git a/lib/ui/painting/image_decoder.h b/lib/ui/painting/image_decoder.h new file mode 100644 index 0000000000000..202dff569e1a5 --- /dev/null +++ b/lib/ui/painting/image_decoder.h @@ -0,0 +1,73 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ +#define FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ + +#include +#include + +#include "flutter/common/task_runners.h" +#include "flutter/flow/skia_gpu_object.h" +#include "flutter/fml/concurrent_message_loop.h" +#include "flutter/fml/macros.h" +#include "flutter/fml/mapping.h" +#include "flutter/lib/ui/io_manager.h" +#include "third_party/skia/include/core/SkData.h" +#include "third_party/skia/include/core/SkImage.h" +#include "third_party/skia/include/core/SkImageInfo.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkSize.h" + +namespace flutter { + +// An object that coordinates image decompression and texture upload across +// multiple threads/components in the shell. This object must be created, +// accessed and collected on the UI thread (typically the engine or its runtime +// controller). None of the expensive operations performed by this component +// occur in a frame pipeline. +class ImageDecoder { + public: + ImageDecoder( + TaskRunners runners, + std::shared_ptr concurrent_task_runner, + fml::WeakPtr io_manager); + + ~ImageDecoder(); + + struct ImageInfo { + SkImageInfo sk_info = {}; + size_t row_bytes = 0; + }; + + struct ImageDescriptor { + sk_sp data; + std::optional decompressed_image_info; + std::optional target_width; + std::optional target_height; + }; + + using ImageResult = std::function)>; + + // Takes an image descriptor and returns a handle to a texture resident on the + // GPU. All image decompression and resizes are done on a worker thread + // concurrently. Texture upload is done on the IO thread and the result + // returned back on the UI thread. On error, the texture is null but the + // callback is guaranteed to return on the UI thread. + void Decode(ImageDescriptor descriptor, ImageResult result); + + fml::WeakPtr GetWeakPtr() const; + + private: + TaskRunners runners_; + std::shared_ptr concurrent_task_runner_; + fml::WeakPtr io_manager_; + fml::WeakPtrFactory weak_factory_; + + FML_DISALLOW_COPY_AND_ASSIGN(ImageDecoder); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_IMAGE_DECODER_H_ diff --git a/lib/ui/painting/image_decoder_unittests.cc b/lib/ui/painting/image_decoder_unittests.cc new file mode 100644 index 0000000000000..6b4dbb370918c --- /dev/null +++ b/lib/ui/painting/image_decoder_unittests.cc @@ -0,0 +1,373 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/common/task_runners.h" +#include "flutter/fml/mapping.h" +#include "flutter/fml/synchronization/waitable_event.h" +#include "flutter/lib/ui/painting/image_decoder.h" +#include "flutter/testing/test_gl_surface.h" +#include "flutter/testing/testing.h" +#include "flutter/testing/thread_test.h" + +namespace flutter { +namespace testing { + +using ImageDecoderFixtureTest = ThreadTest; + +class TestIOManager final : public IOManager { + public: + TestIOManager(fml::RefPtr task_runner, + bool has_gpu_context = true) + : gl_context_(has_gpu_context ? gl_surface_.CreateContext() : nullptr), + weak_gl_context_factory_( + has_gpu_context ? std::make_unique>( + gl_context_.get()) + : nullptr), + unref_queue_(fml::MakeRefCounted( + task_runner, + fml::TimeDelta::FromNanoseconds(0))), + runner_(task_runner), + weak_factory_(this) { + FML_CHECK(task_runner->RunsTasksOnCurrentThread()) + << "The IO manager must be initialized its primary task runner. The " + "test harness may not be setup correctly/safely."; + weak_prototype_ = weak_factory_.GetWeakPtr(); + } + + ~TestIOManager() override { + fml::AutoResetWaitableEvent latch; + fml::TaskRunner::RunNowOrPostTask(runner_, + [&latch, queue = unref_queue_]() { + queue->Drain(); + latch.Signal(); + }); + latch.Wait(); + } + + // |IOManager| + fml::WeakPtr GetWeakIOManager() const override { + return weak_prototype_; + } + + // |IOManager| + fml::WeakPtr GetResourceContext() const override { + return weak_gl_context_factory_ ? weak_gl_context_factory_->GetWeakPtr() + : fml::WeakPtr{}; + } + + // |IOManager| + fml::RefPtr GetSkiaUnrefQueue() const override { + return unref_queue_; + } + + private: + TestGLSurface gl_surface_; + sk_sp gl_context_; + std::unique_ptr> weak_gl_context_factory_; + fml::RefPtr unref_queue_; + fml::WeakPtr weak_prototype_; + fml::RefPtr runner_; + fml::WeakPtrFactory weak_factory_; + + FML_DISALLOW_COPY_AND_ASSIGN(TestIOManager); +}; + +TEST_F(ImageDecoderFixtureTest, CanCreateImageDecoder) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + GetThreadTaskRunner(), // gpu + GetThreadTaskRunner(), // ui + GetThreadTaskRunner() // io + + ); + + fml::AutoResetWaitableEvent latch; + runners.GetIOTaskRunner()->PostTask([&]() { + TestIOManager manager(runners.GetIOTaskRunner()); + ImageDecoder decoder(std::move(runners), loop->GetTaskRunner(), + manager.GetWeakIOManager()); + latch.Signal(); + }); + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, InvalidImageResultsError) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + GetThreadTaskRunner(), // gpu + GetThreadTaskRunner(), // ui + GetThreadTaskRunner() // io + ); + + fml::AutoResetWaitableEvent latch; + GetThreadTaskRunner()->PostTask([&]() { + TestIOManager manager(runners.GetIOTaskRunner()); + ImageDecoder decoder(runners, loop->GetTaskRunner(), + manager.GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = + SkData::MakeFromFD(OpenFixture("ThisDoesNotExist.jpg").get()); + + ASSERT_FALSE(image_descriptor.data); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_FALSE(image.get()); + latch.Signal(); + }; + decoder.Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, ValidImageResultsInSuccess) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + auto decode_image = [&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = + SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }; + + auto setup_io_manager_and_decode = [&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + runners.GetUITaskRunner()->PostTask(decode_image); + }; + + runners.GetIOTaskRunner()->PostTask(setup_io_manager_and_decode); + + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, CanDecodeWithoutAGPUContext) { + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + auto decode_image = [&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.data = + SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }; + + auto setup_io_manager_and_decode = [&]() { + io_manager = + std::make_unique(runners.GetIOTaskRunner(), false); + runners.GetUITaskRunner()->PostTask(decode_image); + }; + + runners.GetIOTaskRunner()->PostTask(setup_io_manager_and_decode); + + latch.Wait(); +} + +TEST_F(ImageDecoderFixtureTest, CanDecodeWithResizes) { + const auto image_dimensions = + SkImage::MakeFromEncoded( + SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get())) + ->dimensions(); + + ASSERT_FALSE(image_dimensions.isEmpty()); + + ASSERT_NE(image_dimensions.width(), image_dimensions.height()); + + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + // Setup the IO manager. + runners.GetIOTaskRunner()->PostTask([&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + latch.Signal(); + }); + latch.Wait(); + + // Setup the image decoder. + runners.GetUITaskRunner()->PostTask([&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + latch.Signal(); + }); + latch.Wait(); + + // Setup a generic decoding utility that gives us the final decoded size. + auto decoded_size = [&](std::optional target_width, + std::optional target_height) -> SkISize { + SkISize final_size = SkISize::MakeEmpty(); + runners.GetUITaskRunner()->PostTask([&]() { + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.target_width = target_width; + image_descriptor.target_height = target_height; + image_descriptor.data = + SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + final_size = image.get()->dimensions(); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); + return final_size; + }; + + ASSERT_EQ(SkISize::Make(3024, 4032), image_dimensions); + ASSERT_EQ(decoded_size({}, {}), image_dimensions); + ASSERT_EQ(decoded_size(100, {}), SkISize::Make(100, 133)); + ASSERT_EQ(decoded_size({}, 100), SkISize::Make(75, 100)); + ASSERT_EQ(decoded_size(100, 100), SkISize::Make(100, 100)); +} + +TEST_F(ImageDecoderFixtureTest, CanResizeWithoutDecode) { + ImageDecoder::ImageInfo info = {}; + sk_sp decompressed_data; + SkISize image_dimensions = SkISize::MakeEmpty(); + { + auto image = + SkImage::MakeFromEncoded( + SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get())) + ->makeRasterImage(); + image_dimensions = image->dimensions(); + SkPixmap pixmap; + ASSERT_TRUE(image->peekPixels(&pixmap)); + info.sk_info = SkImageInfo::MakeN32Premul(image_dimensions); + info.row_bytes = pixmap.rowBytes(); + decompressed_data = + SkData::MakeWithCopy(pixmap.writable_addr(), pixmap.computeByteSize()); + } + + // This is not susecptible to changes in the underlying image decoder. + ASSERT_EQ(decompressed_data->size(), 48771072u); + ASSERT_EQ(decompressed_data->size(), + image_dimensions.width() * image_dimensions.height() * 4u); + ASSERT_EQ(info.row_bytes, image_dimensions.width() * 4u); + ASSERT_FALSE(image_dimensions.isEmpty()); + ASSERT_NE(image_dimensions.width(), image_dimensions.height()); + + auto loop = fml::ConcurrentMessageLoop::Create(); + TaskRunners runners(GetCurrentTestName(), // label + GetThreadTaskRunner(), // platform + CreateNewThread("gpu"), // gpu + CreateNewThread("ui"), // ui + CreateNewThread("io") // io + ); + + fml::AutoResetWaitableEvent latch; + std::unique_ptr io_manager; + std::unique_ptr image_decoder; + + // Setup the IO manager. + runners.GetIOTaskRunner()->PostTask([&]() { + io_manager = std::make_unique(runners.GetIOTaskRunner()); + latch.Signal(); + }); + latch.Wait(); + + // Setup the image decoder. + runners.GetUITaskRunner()->PostTask([&]() { + image_decoder = std::make_unique( + runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); + + latch.Signal(); + }); + latch.Wait(); + + // Setup a generic decoding utility that gives us the final decoded size. + auto decoded_size = [&](std::optional target_width, + std::optional target_height) -> SkISize { + SkISize final_size = SkISize::MakeEmpty(); + runners.GetUITaskRunner()->PostTask([&]() { + ImageDecoder::ImageDescriptor image_descriptor; + image_descriptor.target_width = target_width; + image_descriptor.target_height = target_height; + image_descriptor.data = decompressed_data; + image_descriptor.decompressed_image_info = info; + + ASSERT_TRUE(image_descriptor.data); + ASSERT_GE(image_descriptor.data->size(), 0u); + + ImageDecoder::ImageResult callback = [&](SkiaGPUObject image) { + ASSERT_TRUE(runners.GetUITaskRunner()->RunsTasksOnCurrentThread()); + ASSERT_TRUE(image.get()); + final_size = image.get()->dimensions(); + latch.Signal(); + }; + image_decoder->Decode(std::move(image_descriptor), callback); + }); + latch.Wait(); + return final_size; + }; + + ASSERT_EQ(SkISize::Make(3024, 4032), image_dimensions); + ASSERT_EQ(decoded_size({}, {}), image_dimensions); + ASSERT_EQ(decoded_size(100, {}), SkISize::Make(100, 133)); + ASSERT_EQ(decoded_size({}, 100), SkISize::Make(75, 100)); + ASSERT_EQ(decoded_size(100, 100), SkISize::Make(100, 100)); +} + +} // namespace testing +} // namespace flutter diff --git a/lib/ui/painting/multi_frame_codec.cc b/lib/ui/painting/multi_frame_codec.cc new file mode 100644 index 0000000000000..0cd29b6623e02 --- /dev/null +++ b/lib/ui/painting/multi_frame_codec.cc @@ -0,0 +1,191 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/lib/ui/painting/multi_frame_codec.h" + +#include "flutter/fml/make_copyable.h" +#include "third_party/dart/runtime/include/dart_api.h" +#include "third_party/skia/include/core/SkPixelRef.h" +#include "third_party/tonic/logging/dart_invoke.h" + +namespace flutter { + +MultiFrameCodec::MultiFrameCodec(std::unique_ptr codec) + : codec_(std::move(codec)), + frameCount_(codec_->getFrameCount()), + repetitionCount_(codec_->getRepetitionCount()), + nextFrameIndex_(0) {} + +MultiFrameCodec::~MultiFrameCodec() = default; + +static void InvokeNextFrameCallback( + fml::RefPtr frameInfo, + std::unique_ptr callback, + size_t trace_id) { + std::shared_ptr dart_state = callback->dart_state().lock(); + if (!dart_state) { + FML_DLOG(ERROR) << "Could not acquire Dart state while attempting to fire " + "next frame callback."; + return; + } + tonic::DartState::Scope scope(dart_state); + if (!frameInfo) { + tonic::DartInvoke(callback->value(), {Dart_Null()}); + } else { + tonic::DartInvoke(callback->value(), {ToDart(frameInfo)}); + } +} + +// Copied the source bitmap to the destination. If this cannot occur due to +// running out of memory or the image info not being compatible, returns false. +static bool CopyToBitmap(SkBitmap* dst, + SkColorType dstColorType, + const SkBitmap& src) { + SkPixmap srcPM; + if (!src.peekPixels(&srcPM)) { + return false; + } + + SkBitmap tmpDst; + SkImageInfo dstInfo = srcPM.info().makeColorType(dstColorType); + if (!tmpDst.setInfo(dstInfo)) { + return false; + } + + if (!tmpDst.tryAllocPixels()) { + return false; + } + + SkPixmap dstPM; + if (!tmpDst.peekPixels(&dstPM)) { + return false; + } + + if (!srcPM.readPixels(dstPM)) { + return false; + } + + dst->swap(tmpDst); + return true; +} + +sk_sp MultiFrameCodec::GetNextFrameImage( + fml::WeakPtr resourceContext) { + SkBitmap bitmap = SkBitmap(); + SkImageInfo info = codec_->getInfo().makeColorType(kN32_SkColorType); + if (info.alphaType() == kUnpremul_SkAlphaType) { + info = info.makeAlphaType(kPremul_SkAlphaType); + } + bitmap.allocPixels(info); + + SkCodec::Options options; + options.fFrameIndex = nextFrameIndex_; + SkCodec::FrameInfo frameInfo; + codec_->getFrameInfo(nextFrameIndex_, &frameInfo); + const int requiredFrameIndex = frameInfo.fRequiredFrame; + if (requiredFrameIndex != SkCodec::kNoFrame) { + if (lastRequiredFrame_ == nullptr) { + FML_LOG(ERROR) << "Frame " << nextFrameIndex_ << " depends on frame " + << requiredFrameIndex + << " and no required frames are cached."; + return nullptr; + } else if (lastRequiredFrameIndex_ != requiredFrameIndex) { + FML_DLOG(INFO) << "Required frame " << requiredFrameIndex + << " is not cached. Using " << lastRequiredFrameIndex_ + << " instead"; + } + + if (lastRequiredFrame_->getPixels() && + CopyToBitmap(&bitmap, lastRequiredFrame_->colorType(), + *lastRequiredFrame_)) { + options.fPriorFrame = requiredFrameIndex; + } + } + + if (SkCodec::kSuccess != codec_->getPixels(info, bitmap.getPixels(), + bitmap.rowBytes(), &options)) { + FML_LOG(ERROR) << "Could not getPixels for frame " << nextFrameIndex_; + return nullptr; + } + + // Hold onto this if we need it to decode future frames. + if (frameInfo.fDisposalMethod == SkCodecAnimation::DisposalMethod::kKeep) { + lastRequiredFrame_ = std::make_unique(bitmap); + lastRequiredFrameIndex_ = nextFrameIndex_; + } + + if (resourceContext) { + SkPixmap pixmap(bitmap.info(), bitmap.pixelRef()->pixels(), + bitmap.pixelRef()->rowBytes()); + // This indicates that we do not want a "linear blending" decode. + sk_sp dstColorSpace = nullptr; + return SkImage::MakeCrossContextFromPixmap(resourceContext.get(), pixmap, + true, dstColorSpace.get()); + } else { + // Defer decoding until time of draw later on the GPU thread. Can happen + // when GL operations are currently forbidden such as in the background + // on iOS. + return SkImage::MakeFromBitmap(bitmap); + } +} + +void MultiFrameCodec::GetNextFrameAndInvokeCallback( + std::unique_ptr callback, + fml::RefPtr ui_task_runner, + fml::WeakPtr resourceContext, + fml::RefPtr unref_queue, + size_t trace_id) { + fml::RefPtr frameInfo = NULL; + sk_sp skImage = GetNextFrameImage(resourceContext); + if (skImage) { + fml::RefPtr image = CanvasImage::Create(); + image->set_image({skImage, std::move(unref_queue)}); + SkCodec::FrameInfo skFrameInfo; + codec_->getFrameInfo(nextFrameIndex_, &skFrameInfo); + frameInfo = + fml::MakeRefCounted(std::move(image), skFrameInfo.fDuration); + } + nextFrameIndex_ = (nextFrameIndex_ + 1) % frameCount_; + + ui_task_runner->PostTask(fml::MakeCopyable( + [callback = std::move(callback), frameInfo, trace_id]() mutable { + InvokeNextFrameCallback(frameInfo, std::move(callback), trace_id); + })); +} + +Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) { + static size_t trace_counter = 1; + const size_t trace_id = trace_counter++; + + if (!Dart_IsClosure(callback_handle)) { + return tonic::ToDart("Callback must be a function"); + } + + auto* dart_state = UIDartState::Current(); + + const auto& task_runners = dart_state->GetTaskRunners(); + + task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable( + [callback = std::make_unique( + tonic::DartState::Current(), callback_handle), + this, trace_id, ui_task_runner = task_runners.GetUITaskRunner(), + queue = UIDartState::Current()->GetSkiaUnrefQueue(), + context = dart_state->GetResourceContext()]() mutable { + GetNextFrameAndInvokeCallback(std::move(callback), + std::move(ui_task_runner), context, + std::move(queue), trace_id); + })); + + return Dart_Null(); +} + +int MultiFrameCodec::frameCount() const { + return frameCount_; +} + +int MultiFrameCodec::repetitionCount() const { + return repetitionCount_; +} + +} // namespace flutter diff --git a/lib/ui/painting/multi_frame_codec.h b/lib/ui/painting/multi_frame_codec.h new file mode 100644 index 0000000000000..0be63c2a57582 --- /dev/null +++ b/lib/ui/painting/multi_frame_codec.h @@ -0,0 +1,54 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ +#define FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ + +#include "flutter/fml/macros.h" +#include "flutter/lib/ui/painting/codec.h" + +namespace flutter { + +class MultiFrameCodec : public Codec { + public: + MultiFrameCodec(std::unique_ptr codec); + + ~MultiFrameCodec() override; + + // |Codec| + int frameCount() const override; + + // |Codec| + int repetitionCount() const override; + + // |Codec| + Dart_Handle getNextFrame(Dart_Handle args) override; + + private: + const std::unique_ptr codec_; + const int frameCount_; + const int repetitionCount_; + int nextFrameIndex_; + + // The last decoded frame that's required to decode any subsequent frames. + std::unique_ptr lastRequiredFrame_; + // The index of the last decoded required frame. + int lastRequiredFrameIndex_ = -1; + + sk_sp GetNextFrameImage(fml::WeakPtr resourceContext); + + void GetNextFrameAndInvokeCallback( + std::unique_ptr callback, + fml::RefPtr ui_task_runner, + fml::WeakPtr resourceContext, + fml::RefPtr unref_queue, + size_t trace_id); + + FML_FRIEND_MAKE_REF_COUNTED(MultiFrameCodec); + FML_FRIEND_REF_COUNTED_THREAD_SAFE(MultiFrameCodec); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_MUTLI_FRAME_CODEC_H_ diff --git a/lib/ui/painting/single_frame_codec.cc b/lib/ui/painting/single_frame_codec.cc new file mode 100644 index 0000000000000..8036f767ead7b --- /dev/null +++ b/lib/ui/painting/single_frame_codec.cc @@ -0,0 +1,79 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/lib/ui/painting/single_frame_codec.h" + +#include "flutter/lib/ui/painting/frame_info.h" +#include "flutter/lib/ui/ui_dart_state.h" +#include "third_party/tonic/logging/dart_invoke.h" + +namespace flutter { + +SingleFrameCodec::SingleFrameCodec(ImageDecoder::ImageDescriptor descriptor) + : descriptor_(std::move(descriptor)) {} + +SingleFrameCodec::~SingleFrameCodec() = default; + +int SingleFrameCodec::frameCount() const { + return 1; +} + +int SingleFrameCodec::repetitionCount() const { + return 0; +} + +Dart_Handle SingleFrameCodec::getNextFrame(Dart_Handle callback_handle) { + if (!Dart_IsClosure(callback_handle)) { + return tonic::ToDart("Callback must be a function"); + } + + // This has to be valid because this method is called from Dart. + auto dart_state = UIDartState::Current(); + + auto decoder = dart_state->GetImageDecoder(); + + if (!decoder) { + return tonic::ToDart("Image decoder not available."); + } + + auto raw_callback = new DartPersistentValue(dart_state, callback_handle); + + // We dont want to to put the raw callback in a lambda capture because we have + // to mutate (i.e destroy) it in the callback. Using MakeCopyable will create + // a shared pointer for the captures which can be destroyed on any thread. But + // we have to ensure that the DartPersistentValue is only destroyed on the UI + // thread. + decoder->Decode(descriptor_, [raw_callback](auto image) { + std::unique_ptr callback(raw_callback); + + auto state = callback->dart_state().lock(); + + if (!state) { + // This is probably because the isolate has been terminated before the + // image could be decoded. + + return; + } + + tonic::DartState::Scope scope(state.get()); + + auto canvas_image = fml::MakeRefCounted(); + canvas_image->set_image(std::move(image)); + + auto frame_info = fml::MakeRefCounted(std::move(canvas_image), + 0 /* duration */); + + tonic::DartInvoke(callback->value(), {tonic::ToDart(frame_info)}); + }); + + return Dart_Null(); +} + +size_t SingleFrameCodec::GetAllocationSize() { + const auto& data = descriptor_.data; + auto data_byte_size = data ? data->size() : 0; + return data_byte_size + sizeof(this); +} + +} // namespace flutter diff --git a/lib/ui/painting/single_frame_codec.h b/lib/ui/painting/single_frame_codec.h new file mode 100644 index 0000000000000..9684eef11219b --- /dev/null +++ b/lib/ui/painting/single_frame_codec.h @@ -0,0 +1,41 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ +#define FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ + +#include "flutter/fml/macros.h" +#include "flutter/lib/ui/painting/codec.h" +#include "flutter/lib/ui/painting/image_decoder.h" + +namespace flutter { + +class SingleFrameCodec : public Codec { + public: + SingleFrameCodec(ImageDecoder::ImageDescriptor descriptor); + + ~SingleFrameCodec() override; + + // |Codec| + int frameCount() const override; + + // |Codec| + int repetitionCount() const override; + + // |Codec| + Dart_Handle getNextFrame(Dart_Handle args) override; + + // |DartWrappable| + size_t GetAllocationSize() override; + + private: + ImageDecoder::ImageDescriptor descriptor_; + + FML_FRIEND_MAKE_REF_COUNTED(SingleFrameCodec); + FML_FRIEND_REF_COUNTED_THREAD_SAFE(SingleFrameCodec); +}; + +} // namespace flutter + +#endif // FLUTTER_LIB_UI_PAINTING_SINGLE_FRAME_CODEC_H_ diff --git a/lib/ui/ui_dart_state.cc b/lib/ui/ui_dart_state.cc index b26e01afb1625..8b84d18921957 100644 --- a/lib/ui/ui_dart_state.cc +++ b/lib/ui/ui_dart_state.cc @@ -19,6 +19,7 @@ UIDartState::UIDartState( TaskObserverRemove remove_callback, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::string logger_prefix, @@ -29,6 +30,7 @@ UIDartState::UIDartState( remove_callback_(std::move(remove_callback)), snapshot_delegate_(std::move(snapshot_delegate)), io_manager_(std::move(io_manager)), + image_decoder_(std::move(image_decoder)), advisory_script_uri_(std::move(advisory_script_uri)), advisory_script_entrypoint_(std::move(advisory_script_entrypoint)), logger_prefix_(std::move(logger_prefix)), @@ -124,6 +126,10 @@ fml::WeakPtr UIDartState::GetResourceContext() const { return io_manager_->GetResourceContext(); } +fml::WeakPtr UIDartState::GetImageDecoder() const { + return image_decoder_; +} + std::shared_ptr UIDartState::GetIsolateNameServer() const { return isolate_name_server_; } diff --git a/lib/ui/ui_dart_state.h b/lib/ui/ui_dart_state.h index 4f9c33387ec13..550c72ff98178 100644 --- a/lib/ui/ui_dart_state.h +++ b/lib/ui/ui_dart_state.h @@ -16,6 +16,7 @@ #include "flutter/fml/memory/weak_ptr.h" #include "flutter/lib/ui/io_manager.h" #include "flutter/lib/ui/isolate_name_server/isolate_name_server.h" +#include "flutter/lib/ui/painting/image_decoder.h" #include "flutter/lib/ui/snapshot_delegate.h" #include "third_party/dart/runtime/include/dart_api.h" #include "third_party/skia/include/gpu/GrContext.h" @@ -53,6 +54,8 @@ class UIDartState : public tonic::DartState { fml::WeakPtr GetResourceContext() const; + fml::WeakPtr GetImageDecoder() const; + std::shared_ptr GetIsolateNameServer() const; tonic::DartErrorHandleType GetLastError(); @@ -77,6 +80,7 @@ class UIDartState : public tonic::DartState { TaskObserverRemove remove_callback, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::string logger_prefix, @@ -99,6 +103,7 @@ class UIDartState : public tonic::DartState { const TaskObserverRemove remove_callback_; fml::WeakPtr snapshot_delegate_; fml::WeakPtr io_manager_; + fml::WeakPtr image_decoder_; const std::string advisory_script_uri_; const std::string advisory_script_entrypoint_; const std::string logger_prefix_; diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc index 96ac6facd333a..91f39b3aebda1 100644 --- a/runtime/dart_isolate.cc +++ b/runtime/dart_isolate.cc @@ -37,6 +37,7 @@ std::weak_ptr DartIsolate::CreateRootIsolate( std::unique_ptr window, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, Dart_IsolateFlags* flags, @@ -62,6 +63,7 @@ std::weak_ptr DartIsolate::CreateRootIsolate( task_runners, // task runners std::move(snapshot_delegate), // snapshot delegate std::move(io_manager), // IO manager + std::move(image_decoder), // Image Decoder advisory_script_uri, // advisory URI advisory_script_entrypoint, // advisory entrypoint nullptr, // child isolate preparer @@ -106,6 +108,7 @@ DartIsolate::DartIsolate(const Settings& settings, TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, ChildIsolatePreparer child_isolate_preparer, @@ -116,6 +119,7 @@ DartIsolate::DartIsolate(const Settings& settings, settings.task_observer_remove, std::move(snapshot_delegate), std::move(io_manager), + std::move(image_decoder), advisory_script_uri, advisory_script_entrypoint, settings.log_tag, @@ -597,6 +601,7 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate( nullptr, // window {}, // snapshot delegate {}, // IO Manager + {}, // Image Decoder DART_VM_SERVICE_ISOLATE_NAME, // script uri DART_VM_SERVICE_ISOLATE_NAME, // script entrypoint flags, // flags @@ -709,6 +714,7 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair( null_task_runners, // task_runners fml::WeakPtr{}, // snapshot_delegate fml::WeakPtr{}, // io_manager + fml::WeakPtr{}, // io_manager advisory_script_uri, // advisory_script_uri advisory_script_entrypoint, // advisory_script_entrypoint (*raw_embedder_isolate)->child_isolate_preparer_, // preparer diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h index 60412972abc93..20f53a9a402bf 100644 --- a/runtime/dart_isolate.h +++ b/runtime/dart_isolate.h @@ -49,6 +49,7 @@ class DartIsolate : public UIDartState { std::unique_ptr window, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, Dart_IsolateFlags* flags, @@ -61,6 +62,7 @@ class DartIsolate : public UIDartState { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, ChildIsolatePreparer child_isolate_preparer, diff --git a/runtime/dart_isolate_unittests.cc b/runtime/dart_isolate_unittests.cc index e752582cc99aa..ae14042ecc743 100644 --- a/runtime/dart_isolate_unittests.cc +++ b/runtime/dart_isolate_unittests.cc @@ -43,6 +43,7 @@ TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) { nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint, nullptr, // flags @@ -76,6 +77,7 @@ TEST_F(DartIsolateTest, IsolateShutdownCallbackIsInIsolateScope) { nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint nullptr, // flags @@ -186,6 +188,7 @@ static void RunDartCodeInIsolate(DartVMRef& vm_ref, nullptr, // window {}, // snapshot delegate {}, // io manager + {}, // image decoder "main.dart", // advisory uri "main", // advisory entrypoint nullptr, // flags diff --git a/runtime/dart_lifecycle_unittests.cc b/runtime/dart_lifecycle_unittests.cc index a6de7f792f1cd..eec7aa6c9c4d5 100644 --- a/runtime/dart_lifecycle_unittests.cc +++ b/runtime/dart_lifecycle_unittests.cc @@ -58,6 +58,7 @@ static std::shared_ptr CreateAndRunRootIsolate( {}, // window {}, // snapshot_delegate {}, // io_manager + {}, // image_decoder "main.dart", // advisory_script_uri entrypoint.c_str(), // advisory_script_entrypoint nullptr, // flags diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index 903e74b1591f7..0e4109051e040 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -253,6 +253,7 @@ size_t DartVM::GetVMLaunchCount() { DartVM::DartVM(std::shared_ptr vm_data, std::shared_ptr isolate_name_server) : settings_(vm_data->GetSettings()), + concurrent_message_loop_(fml::ConcurrentMessageLoop::Create()), vm_data_(vm_data), isolate_name_server_(std::move(isolate_name_server)), service_protocol_(std::make_shared()) { @@ -451,4 +452,9 @@ std::shared_ptr DartVM::GetIsolateNameServer() const { return isolate_name_server_; } +std::shared_ptr +DartVM::GetConcurrentWorkerTaskRunner() const { + return concurrent_message_loop_->GetTaskRunner(); +} + } // namespace flutter diff --git a/runtime/dart_vm.h b/runtime/dart_vm.h index b88c033b6ef02..9cc2d811ac3a7 100644 --- a/runtime/dart_vm.h +++ b/runtime/dart_vm.h @@ -15,6 +15,7 @@ #include "flutter/fml/memory/ref_counted.h" #include "flutter/fml/memory/ref_ptr.h" #include "flutter/fml/memory/weak_ptr.h" +#include "flutter/fml/message_loop.h" #include "flutter/lib/ui/isolate_name_server/isolate_name_server.h" #include "flutter/runtime/dart_isolate.h" #include "flutter/runtime/dart_snapshot.h" @@ -40,8 +41,12 @@ class DartVM { std::shared_ptr GetIsolateNameServer() const; + std::shared_ptr GetConcurrentWorkerTaskRunner() + const; + private: const Settings settings_; + std::shared_ptr concurrent_message_loop_; std::shared_ptr vm_data_; const std::shared_ptr isolate_name_server_; const std::shared_ptr service_protocol_; diff --git a/runtime/runtime_controller.cc b/runtime/runtime_controller.cc index c0d9c3efda892..e457f5986e1e7 100644 --- a/runtime/runtime_controller.cc +++ b/runtime/runtime_controller.cc @@ -22,6 +22,7 @@ RuntimeController::RuntimeController( TaskRunners p_task_runners, fml::WeakPtr p_snapshot_delegate, fml::WeakPtr p_io_manager, + fml::WeakPtr p_image_decoder, std::string p_advisory_script_uri, std::string p_advisory_script_entrypoint, std::function p_idle_notification_callback, @@ -34,6 +35,7 @@ RuntimeController::RuntimeController( std::move(p_task_runners), std::move(p_snapshot_delegate), std::move(p_io_manager), + std::move(p_image_decoder), std::move(p_advisory_script_uri), std::move(p_advisory_script_entrypoint), p_idle_notification_callback, @@ -49,6 +51,7 @@ RuntimeController::RuntimeController( TaskRunners p_task_runners, fml::WeakPtr p_snapshot_delegate, fml::WeakPtr p_io_manager, + fml::WeakPtr p_image_decoder, std::string p_advisory_script_uri, std::string p_advisory_script_entrypoint, std::function idle_notification_callback, @@ -62,6 +65,7 @@ RuntimeController::RuntimeController( task_runners_(p_task_runners), snapshot_delegate_(p_snapshot_delegate), io_manager_(p_io_manager), + image_decoder_(p_image_decoder), advisory_script_uri_(p_advisory_script_uri), advisory_script_entrypoint_(p_advisory_script_entrypoint), idle_notification_callback_(idle_notification_callback), @@ -79,6 +83,7 @@ RuntimeController::RuntimeController( std::make_unique(this), // snapshot_delegate_, // io_manager_, // + image_decoder_, // p_advisory_script_uri, // p_advisory_script_entrypoint, // nullptr, // @@ -139,6 +144,7 @@ std::unique_ptr RuntimeController::Clone() const { task_runners_, // snapshot_delegate_, // io_manager_, // + image_decoder_, // advisory_script_uri_, // advisory_script_entrypoint_, // idle_notification_callback_, // diff --git a/runtime/runtime_controller.h b/runtime/runtime_controller.h index 5a125013ea484..c3b3e35fa064c 100644 --- a/runtime/runtime_controller.h +++ b/runtime/runtime_controller.h @@ -35,6 +35,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr iamge_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::function idle_notification_callback, @@ -130,6 +131,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners_; fml::WeakPtr snapshot_delegate_; fml::WeakPtr io_manager_; + fml::WeakPtr image_decoder_; std::string advisory_script_uri_; std::string advisory_script_entrypoint_; std::function idle_notification_callback_; @@ -146,6 +148,7 @@ class RuntimeController final : public WindowClient { TaskRunners task_runners, fml::WeakPtr snapshot_delegate, fml::WeakPtr io_manager, + fml::WeakPtr image_decoder, std::string advisory_script_uri, std::string advisory_script_entrypoint, std::function idle_notification_callback, diff --git a/shell/common/engine.cc b/shell/common/engine.cc index 5147789d7067c..d2c752a4747df 100644 --- a/shell/common/engine.cc +++ b/shell/common/engine.cc @@ -49,6 +49,9 @@ Engine::Engine(Delegate& delegate, animator_(std::move(animator)), activity_running_(false), have_surface_(false), + image_decoder_(task_runners, + vm.GetConcurrentWorkerTaskRunner(), + io_manager), weak_factory_(this) { // Runtime controller is initialized here because it takes a reference to this // object as its delegate. The delegate may be called in the constructor and @@ -61,6 +64,7 @@ Engine::Engine(Delegate& delegate, std::move(task_runners), // task runners std::move(snapshot_delegate), // snapshot delegate std::move(io_manager), // io manager + image_decoder_.GetWeakPtr(), // image decoder settings_.advisory_script_uri, // advisory script uri settings_.advisory_script_entrypoint, // advisory script entrypoint settings_.idle_notification_callback, // idle notification callback diff --git a/shell/common/engine.h b/shell/common/engine.h index 293d78c1a7178..95739c9b2bf61 100644 --- a/shell/common/engine.h +++ b/shell/common/engine.h @@ -12,6 +12,7 @@ #include "flutter/common/task_runners.h" #include "flutter/fml/macros.h" #include "flutter/fml/memory/weak_ptr.h" +#include "flutter/lib/ui/painting/image_decoder.h" #include "flutter/lib/ui/semantics/custom_accessibility_action.h" #include "flutter/lib/ui/semantics/semantics_node.h" #include "flutter/lib/ui/snapshot_delegate.h" @@ -138,6 +139,7 @@ class Engine final : public RuntimeDelegate { bool activity_running_; bool have_surface_; FontCollection font_collection_; + ImageDecoder image_decoder_; fml::WeakPtrFactory weak_factory_; // |RuntimeDelegate| diff --git a/shell/common/shell_io_manager.cc b/shell/common/shell_io_manager.cc index f1155c2e883a0..76db8505c9be1 100644 --- a/shell/common/shell_io_manager.cc +++ b/shell/common/shell_io_manager.cc @@ -52,7 +52,7 @@ ShellIOManager::ShellIOManager( : nullptr), unref_queue_(fml::MakeRefCounted( std::move(unref_queue_task_runner), - fml::TimeDelta::FromMilliseconds(250))), + fml::TimeDelta::FromMilliseconds(8))), weak_factory_(this) { if (!resource_context_) { #ifndef OS_FUCHSIA @@ -69,12 +69,6 @@ ShellIOManager::~ShellIOManager() { unref_queue_->Drain(); } -fml::WeakPtr ShellIOManager::GetResourceContext() const { - return resource_context_weak_factory_ - ? resource_context_weak_factory_->GetWeakPtr() - : fml::WeakPtr(); -} - void ShellIOManager::NotifyResourceContextAvailable( sk_sp resource_context) { // The resource context needs to survive as long as we have Dart objects @@ -93,11 +87,25 @@ void ShellIOManager::UpdateResourceContext(sk_sp resource_context) { : nullptr; } +fml::WeakPtr ShellIOManager::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + +// |IOManager| +fml::WeakPtr ShellIOManager::GetResourceContext() const { + return resource_context_weak_factory_ + ? resource_context_weak_factory_->GetWeakPtr() + : fml::WeakPtr(); +} + +// |IOManager| fml::RefPtr ShellIOManager::GetSkiaUnrefQueue() const { return unref_queue_; } -fml::WeakPtr ShellIOManager::GetWeakPtr() { +// |IOManager| +fml::WeakPtr ShellIOManager::GetWeakIOManager() const { return weak_factory_.GetWeakPtr(); } + } // namespace flutter diff --git a/shell/common/shell_io_manager.h b/shell/common/shell_io_manager.h index 11efd343437b7..066937f53bdaa 100644 --- a/shell/common/shell_io_manager.h +++ b/shell/common/shell_io_manager.h @@ -29,8 +29,6 @@ class ShellIOManager final : public IOManager { ~ShellIOManager() override; - fml::WeakPtr GetResourceContext() const override; - // This method should be called when a resource_context first becomes // available. It is safe to call multiple times, and will only update // the held resource context if it has not already been set. @@ -42,10 +40,17 @@ class ShellIOManager final : public IOManager { // resource context, but may be called if the Dart VM is restarted. void UpdateResourceContext(sk_sp resource_context); - fml::RefPtr GetSkiaUnrefQueue() const override; - fml::WeakPtr GetWeakPtr(); + // |IOManager| + fml::WeakPtr GetWeakIOManager() const override; + + // |IOManager| + fml::WeakPtr GetResourceContext() const override; + + // |IOManager| + fml::RefPtr GetSkiaUnrefQueue() const override; + private: // Resource context management. sk_sp resource_context_; diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index 1173a4f778715..c875d981162f4 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -67,10 +67,7 @@ if (current_toolchain == host_toolchain) { executable("embedder_unittests") { testonly = true - configs += [ - "$flutter_root:export_dynamic_symbols", - "//third_party/swiftshader_flutter:swiftshader_config", - ] + configs += [ "$flutter_root:export_dynamic_symbols" ] include_dirs = [ "." ] @@ -82,8 +79,6 @@ if (current_toolchain == host_toolchain) { "tests/embedder_context.h", "tests/embedder_test.cc", "tests/embedder_test.h", - "tests/embedder_test_gl_surface.cc", - "tests/embedder_test_gl_surface.h", "tests/embedder_unittests.cc", ] @@ -93,8 +88,8 @@ if (current_toolchain == host_toolchain) { "$flutter_root/lib/ui", "$flutter_root/runtime", "$flutter_root/testing:dart", + "$flutter_root/testing:opengl", "//third_party/skia", - "//third_party/swiftshader_flutter:swiftshader", "//third_party/tonic", ] } diff --git a/shell/platform/embedder/tests/embedder_context.cc b/shell/platform/embedder/tests/embedder_context.cc index ae759d667315f..5b8297547c66b 100644 --- a/shell/platform/embedder/tests/embedder_context.cc +++ b/shell/platform/embedder/tests/embedder_context.cc @@ -124,7 +124,7 @@ EmbedderContext::GetUpdateSemanticsCustomActionCallbackHook() { } void EmbedderContext::SetupOpenGLSurface() { - gl_surface_ = std::make_unique(); + gl_surface_ = std::make_unique(); } bool EmbedderContext::GLMakeCurrent() { diff --git a/shell/platform/embedder/tests/embedder_context.h b/shell/platform/embedder/tests/embedder_context.h index 7e9754e096233..02f617411a220 100644 --- a/shell/platform/embedder/tests/embedder_context.h +++ b/shell/platform/embedder/tests/embedder_context.h @@ -14,8 +14,8 @@ #include "flutter/fml/macros.h" #include "flutter/fml/mapping.h" #include "flutter/shell/platform/embedder/embedder.h" -#include "flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h" #include "flutter/testing/test_dart_native_resolver.h" +#include "flutter/testing/test_gl_surface.h" namespace flutter { namespace testing { @@ -65,8 +65,8 @@ class EmbedderContext { std::shared_ptr native_resolver_; SemanticsNodeCallback update_semantics_node_callback_; SemanticsActionCallback update_semantics_custom_action_callback_; - std::unique_ptr gl_surface_; // lazy std::function platform_message_callback_; + std::unique_ptr gl_surface_; static VoidCallback GetIsolateCreateCallbackHook(); diff --git a/testing/BUILD.gn b/testing/BUILD.gn index f1cf5b7afebbd..82107d7f4e075 100644 --- a/testing/BUILD.gn +++ b/testing/BUILD.gn @@ -45,3 +45,25 @@ source_set("dart") { "//third_party/tonic", ] } + +if (current_toolchain == host_toolchain) { + source_set("opengl") { + testonly = true + + configs += [ "//third_party/swiftshader_flutter:swiftshader_config" ] + + sources = [ + "$flutter_root/testing/test_gl_surface.cc", + "$flutter_root/testing/test_gl_surface.h", + ] + + deps = [ + "//$flutter_root/fml", + "//third_party/swiftshader_flutter:swiftshader", + ] + + public_deps = [ + "//third_party/skia", + ] + } +} diff --git a/testing/run_tests.sh b/testing/run_tests.sh index 36946316ced09..68f353de9893c 100755 --- a/testing/run_tests.sh +++ b/testing/run_tests.sh @@ -54,6 +54,9 @@ echo "Running client_wrapper_glfw_unittests..." echo "Running txt_unittests..." "$HOST_DIR/txt_unittests" --font-directory="$BUILDROOT_DIR/flutter/third_party/txt/third_party/fonts" +echo "Running ui_unittests..." +"$HOST_DIR/ui_unittests" + echo "Running txt_benchmarks..." "$HOST_DIR/txt_benchmarks" --font-directory="$BUILDROOT_DIR/flutter/third_party/txt/third_party/fonts" diff --git a/shell/platform/embedder/tests/embedder_test_gl_surface.cc b/testing/test_gl_surface.cc similarity index 81% rename from shell/platform/embedder/tests/embedder_test_gl_surface.cc rename to testing/test_gl_surface.cc index 54c2d6e6ff961..ec8394078cef9 100644 --- a/shell/platform/embedder/tests/embedder_test_gl_surface.cc +++ b/testing/test_gl_surface.cc @@ -2,16 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "flutter/shell/platform/embedder/tests/embedder_test_gl_surface.h" +#include "flutter/testing/test_gl_surface.h" #include +#include #include #include #include "flutter/fml/logging.h" +#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h" namespace flutter { +namespace testing { static std::string GetEGLError() { std::stringstream stream; @@ -74,7 +77,7 @@ static std::string GetEGLError() { return stream.str(); } -EmbedderTestGLSurface::EmbedderTestGLSurface() { +TestGLSurface::TestGLSurface() { display_ = ::eglGetDisplay(EGL_DEFAULT_DISPLAY); FML_CHECK(display_ != EGL_NO_DISPLAY); @@ -151,7 +154,7 @@ EmbedderTestGLSurface::EmbedderTestGLSurface() { } } -EmbedderTestGLSurface::~EmbedderTestGLSurface() { +TestGLSurface::~TestGLSurface() { auto result = ::eglDestroyContext(display_, onscreen_context_); FML_CHECK(result == EGL_TRUE) << GetEGLError(); @@ -168,7 +171,7 @@ EmbedderTestGLSurface::~EmbedderTestGLSurface() { FML_CHECK(result == EGL_TRUE); } -bool EmbedderTestGLSurface::MakeCurrent() { +bool TestGLSurface::MakeCurrent() { auto result = ::eglMakeCurrent(display_, onscreen_surface_, onscreen_surface_, onscreen_context_); @@ -179,7 +182,7 @@ bool EmbedderTestGLSurface::MakeCurrent() { return result == EGL_TRUE; } -bool EmbedderTestGLSurface::ClearCurrent() { +bool TestGLSurface::ClearCurrent() { auto result = ::eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -190,7 +193,7 @@ bool EmbedderTestGLSurface::ClearCurrent() { return result == EGL_TRUE; } -bool EmbedderTestGLSurface::Present() { +bool TestGLSurface::Present() { auto result = ::eglSwapBuffers(display_, onscreen_surface_); if (result == EGL_FALSE) { @@ -200,12 +203,12 @@ bool EmbedderTestGLSurface::Present() { return result == EGL_TRUE; } -uint32_t EmbedderTestGLSurface::GetFramebuffer() { +uint32_t TestGLSurface::GetFramebuffer() { // Return FBO0 return 0; } -bool EmbedderTestGLSurface::MakeResourceCurrent() { +bool TestGLSurface::MakeResourceCurrent() { auto result = ::eglMakeCurrent(display_, offscreen_surface_, offscreen_surface_, offscreen_context_); @@ -217,7 +220,10 @@ bool EmbedderTestGLSurface::MakeResourceCurrent() { return result == EGL_TRUE; } -void* EmbedderTestGLSurface::GetProcAddress(const char* name) { +void* TestGLSurface::GetProcAddress(const char* name) { + if (name == nullptr) { + return nullptr; + } auto symbol = ::eglGetProcAddress(name); if (symbol == NULL) { FML_LOG(ERROR) << "Could not fetch symbol for name: " << name; @@ -225,4 +231,40 @@ void* EmbedderTestGLSurface::GetProcAddress(const char* name) { return reinterpret_cast(symbol); } +sk_sp TestGLSurface::CreateContext() { + if (!MakeCurrent()) { + return nullptr; + } + + auto get_string = + reinterpret_cast(GetProcAddress("glGetString")); + + if (!get_string) { + return nullptr; + } + + auto c_version = reinterpret_cast(get_string(GL_VERSION)); + + if (c_version == NULL) { + return nullptr; + } + + GrGLGetProc get_proc = [](void* context, const char name[]) -> GrGLFuncPtr { + return reinterpret_cast( + reinterpret_cast(context)->GetProcAddress(name)); + }; + + std::string version(c_version); + auto interface = version.find("OpenGL ES") == std::string::npos + ? GrGLMakeAssembledGLInterface(this, get_proc) + : GrGLMakeAssembledGLESInterface(this, get_proc); + + if (!interface) { + return nullptr; + } + + return GrContext::MakeGL(interface); +} + +} // namespace testing } // namespace flutter diff --git a/shell/platform/embedder/tests/embedder_test_gl_surface.h b/testing/test_gl_surface.h similarity index 58% rename from shell/platform/embedder/tests/embedder_test_gl_surface.h rename to testing/test_gl_surface.h index 0d7da604310ff..3357ce56fe1bc 100644 --- a/shell/platform/embedder/tests/embedder_test_gl_surface.h +++ b/testing/test_gl_surface.h @@ -2,19 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ -#define FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ +#ifndef FLUTTER_TESTING_TEST_GL_SURFACE_H_ +#define FLUTTER_TESTING_TEST_GL_SURFACE_H_ + +#include #include "flutter/fml/macros.h" -#include "flutter/shell/platform/embedder/embedder.h" +#include "third_party/skia/include/gpu/GrContext.h" namespace flutter { +namespace testing { -class EmbedderTestGLSurface { +class TestGLSurface { public: - EmbedderTestGLSurface(); + TestGLSurface(); - ~EmbedderTestGLSurface(); + ~TestGLSurface(); bool MakeCurrent(); @@ -28,11 +31,13 @@ class EmbedderTestGLSurface { void* GetProcAddress(const char* name); + sk_sp CreateContext(); + private: // Importing the EGL.h pulls in platform headers which are problematic - // (especially X11 which #defineds types like Bool). Any TUs importing this - // header then become susceptible to failures because of platform specific - // craziness. Don't expose EGL internals via this header. + // (especially X11 which #defineds types like Bool). Any TUs importing + // this header then become susceptible to failures because of platform + // specific craziness. Don't expose EGL internals via this header. using EGLDisplay = void*; using EGLContext = void*; using EGLSurface = void*; @@ -43,9 +48,10 @@ class EmbedderTestGLSurface { EGLSurface onscreen_surface_; EGLSurface offscreen_surface_; - FML_DISALLOW_COPY_AND_ASSIGN(EmbedderTestGLSurface); + FML_DISALLOW_COPY_AND_ASSIGN(TestGLSurface); }; +} // namespace testing } // namespace flutter -#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_TESTS_EMBEDDER_TEST_GL_SURFACE_H_ +#endif // FLUTTER_TESTING_TEST_GL_SURFACE_H_ diff --git a/testing/testing.cc b/testing/testing.cc index 2e2225a568036..270d6f00b7e93 100644 --- a/testing/testing.cc +++ b/testing/testing.cc @@ -4,6 +4,8 @@ #include "testing.h" +#include "flutter/fml/file.h" + namespace flutter { namespace testing { @@ -11,5 +13,36 @@ std::string GetCurrentTestName() { return ::testing::UnitTest::GetInstance()->current_test_info()->name(); } +fml::UniqueFD OpenFixture(std::string fixture_name) { + if (fixture_name.size() == 0) { + FML_LOG(ERROR) << "Invalid fixture name."; + return {}; + } + + auto fixtures_directory = + OpenDirectory(GetFixturesPath(), // path + false, // create + fml::FilePermission::kRead // permission + ); + + if (!fixtures_directory.is_valid()) { + FML_LOG(ERROR) << "Could not open fixtures directory."; + return {}; + } + + auto fixture_fd = fml::OpenFile(fixtures_directory, // base directory + fixture_name.c_str(), // path + false, // create + fml::FilePermission::kRead // permission + ); + if (!fixture_fd.is_valid()) { + FML_LOG(ERROR) << "Could not open fixture for path: " << fixture_name + << "."; + return {}; + } + + return fixture_fd; +} + } // namespace testing } // namespace flutter diff --git a/testing/testing.h b/testing/testing.h index 00fe3806488dc..fc4fe6a4d8e66 100644 --- a/testing/testing.h +++ b/testing/testing.h @@ -7,6 +7,7 @@ #include +#include "flutter/fml/file.h" #include "gtest/gtest.h" namespace flutter { @@ -17,6 +18,8 @@ namespace testing { // error. const char* GetFixturesPath(); +fml::UniqueFD OpenFixture(std::string fixture_name); + std::string GetCurrentTestName(); } // namespace testing diff --git a/testing/thread_test.cc b/testing/thread_test.cc index 986afd4e62fbb..deb371e63b472 100644 --- a/testing/thread_test.cc +++ b/testing/thread_test.cc @@ -23,6 +23,7 @@ void ThreadTest::TearDown() { thread_task_runner_ = nullptr; thread_ = nullptr; current_task_runner_ = nullptr; + extra_threads_.clear(); } fml::RefPtr ThreadTest::GetCurrentTaskRunner() { @@ -33,5 +34,12 @@ fml::RefPtr ThreadTest::GetThreadTaskRunner() { return thread_task_runner_; } +fml::RefPtr ThreadTest::CreateNewThread(std::string name) { + auto thread = std::make_unique(name); + auto runner = thread->GetTaskRunner(); + extra_threads_.emplace_back(std::move(thread)); + return runner; +} + } // namespace testing } // namespace flutter diff --git a/testing/thread_test.h b/testing/thread_test.h index 6d168b0d0c01a..270628b114276 100644 --- a/testing/thread_test.h +++ b/testing/thread_test.h @@ -6,6 +6,7 @@ #define FLUTTER_TESTING_THREAD_TEST_H_ #include +#include #include "flutter/fml/macros.h" #include "flutter/fml/message_loop.h" @@ -22,6 +23,8 @@ class ThreadTest : public ::testing::Test { fml::RefPtr GetThreadTaskRunner(); + fml::RefPtr CreateNewThread(std::string name = ""); + protected: // |testing::Test| void SetUp() override; @@ -33,6 +36,7 @@ class ThreadTest : public ::testing::Test { std::unique_ptr thread_; fml::RefPtr thread_task_runner_; fml::RefPtr current_task_runner_; + std::vector> extra_threads_; }; } // namespace testing From 0e39907b263227fc60596e81b18d75403346c149 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 9 Jul 2019 16:39:53 -0400 Subject: [PATCH 2/4] Licenses --- ci/licenses_golden/licenses_flutter | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 8d3693f1cc4cf..9b6ea9ff88dd7 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -316,6 +316,8 @@ FILE: ../../../flutter/lib/ui/dart_runtime_hooks.h FILE: ../../../flutter/lib/ui/dart_ui.cc FILE: ../../../flutter/lib/ui/dart_ui.h FILE: ../../../flutter/lib/ui/dart_wrapper.h +FILE: ../../../flutter/lib/ui/fixtures/DashInNooglerHat.jpg +FILE: ../../../flutter/lib/ui/fixtures/ui_test.dart FILE: ../../../flutter/lib/ui/geometry.dart FILE: ../../../flutter/lib/ui/hash_codes.dart FILE: ../../../flutter/lib/ui/hooks.dart @@ -342,6 +344,9 @@ FILE: ../../../flutter/lib/ui/painting/gradient.cc FILE: ../../../flutter/lib/ui/painting/gradient.h FILE: ../../../flutter/lib/ui/painting/image.cc FILE: ../../../flutter/lib/ui/painting/image.h +FILE: ../../../flutter/lib/ui/painting/image_decoder.cc +FILE: ../../../flutter/lib/ui/painting/image_decoder.h +FILE: ../../../flutter/lib/ui/painting/image_decoder_unittests.cc FILE: ../../../flutter/lib/ui/painting/image_encoding.cc FILE: ../../../flutter/lib/ui/painting/image_encoding.h FILE: ../../../flutter/lib/ui/painting/image_filter.cc @@ -350,6 +355,8 @@ FILE: ../../../flutter/lib/ui/painting/image_shader.cc FILE: ../../../flutter/lib/ui/painting/image_shader.h FILE: ../../../flutter/lib/ui/painting/matrix.cc FILE: ../../../flutter/lib/ui/painting/matrix.h +FILE: ../../../flutter/lib/ui/painting/multi_frame_codec.cc +FILE: ../../../flutter/lib/ui/painting/multi_frame_codec.h FILE: ../../../flutter/lib/ui/painting/paint.cc FILE: ../../../flutter/lib/ui/painting/paint.h FILE: ../../../flutter/lib/ui/painting/path.cc @@ -364,6 +371,8 @@ FILE: ../../../flutter/lib/ui/painting/rrect.cc FILE: ../../../flutter/lib/ui/painting/rrect.h FILE: ../../../flutter/lib/ui/painting/shader.cc FILE: ../../../flutter/lib/ui/painting/shader.h +FILE: ../../../flutter/lib/ui/painting/single_frame_codec.cc +FILE: ../../../flutter/lib/ui/painting/single_frame_codec.h FILE: ../../../flutter/lib/ui/painting/vertices.cc FILE: ../../../flutter/lib/ui/painting/vertices.h FILE: ../../../flutter/lib/ui/plugins.dart From 125e0569fb13acbeb236d047f5d2b6d8b670f14e Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 9 Jul 2019 14:28:05 -0700 Subject: [PATCH 3/4] Dont use MakeFromFD --- lib/ui/painting/image_decoder_unittests.cc | 41 +++++++++++++++------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/ui/painting/image_decoder_unittests.cc b/lib/ui/painting/image_decoder_unittests.cc index 6b4dbb370918c..7fb08ff50e496 100644 --- a/lib/ui/painting/image_decoder_unittests.cc +++ b/lib/ui/painting/image_decoder_unittests.cc @@ -73,6 +73,29 @@ class TestIOManager final : public IOManager { FML_DISALLOW_COPY_AND_ASSIGN(TestIOManager); }; +static sk_sp OpenFixtureAsSkData(const char* name) { + auto fixtures_directory = + fml::OpenFile(GetFixturesPath(), false, fml::FilePermission::kRead); + if (!fixtures_directory.is_valid()) { + return nullptr; + } + + auto fixture_mapping = + fml::FileMapping::CreateReadOnly(fixtures_directory, name); + + if (!fixture_mapping) { + return nullptr; + } + + SkData::ReleaseProc on_release = [](const void* ptr, void* context) -> void { + delete reinterpret_cast(context); + }; + + return SkData::MakeWithProc(fixture_mapping->GetMapping(), + fixture_mapping->GetSize(), on_release, + fixture_mapping.release()); +} + TEST_F(ImageDecoderFixtureTest, CanCreateImageDecoder) { auto loop = fml::ConcurrentMessageLoop::Create(); TaskRunners runners(GetCurrentTestName(), // label @@ -109,8 +132,7 @@ TEST_F(ImageDecoderFixtureTest, InvalidImageResultsError) { manager.GetWeakIOManager()); ImageDecoder::ImageDescriptor image_descriptor; - image_descriptor.data = - SkData::MakeFromFD(OpenFixture("ThisDoesNotExist.jpg").get()); + image_descriptor.data = OpenFixtureAsSkData("ThisDoesNotExist.jpg"); ASSERT_FALSE(image_descriptor.data); @@ -143,8 +165,7 @@ TEST_F(ImageDecoderFixtureTest, ValidImageResultsInSuccess) { runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); ImageDecoder::ImageDescriptor image_descriptor; - image_descriptor.data = - SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); ASSERT_TRUE(image_descriptor.data); ASSERT_GE(image_descriptor.data->size(), 0u); @@ -186,8 +207,7 @@ TEST_F(ImageDecoderFixtureTest, CanDecodeWithoutAGPUContext) { runners, loop->GetTaskRunner(), io_manager->GetWeakIOManager()); ImageDecoder::ImageDescriptor image_descriptor; - image_descriptor.data = - SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); ASSERT_TRUE(image_descriptor.data); ASSERT_GE(image_descriptor.data->size(), 0u); @@ -213,8 +233,7 @@ TEST_F(ImageDecoderFixtureTest, CanDecodeWithoutAGPUContext) { TEST_F(ImageDecoderFixtureTest, CanDecodeWithResizes) { const auto image_dimensions = - SkImage::MakeFromEncoded( - SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get())) + SkImage::MakeFromEncoded(OpenFixtureAsSkData("DashInNooglerHat.jpg")) ->dimensions(); ASSERT_FALSE(image_dimensions.isEmpty()); @@ -257,8 +276,7 @@ TEST_F(ImageDecoderFixtureTest, CanDecodeWithResizes) { ImageDecoder::ImageDescriptor image_descriptor; image_descriptor.target_width = target_width; image_descriptor.target_height = target_height; - image_descriptor.data = - SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get()); + image_descriptor.data = OpenFixtureAsSkData("DashInNooglerHat.jpg"); ASSERT_TRUE(image_descriptor.data); ASSERT_GE(image_descriptor.data->size(), 0u); @@ -288,8 +306,7 @@ TEST_F(ImageDecoderFixtureTest, CanResizeWithoutDecode) { SkISize image_dimensions = SkISize::MakeEmpty(); { auto image = - SkImage::MakeFromEncoded( - SkData::MakeFromFD(OpenFixture("DashInNooglerHat.jpg").get())) + SkImage::MakeFromEncoded(OpenFixtureAsSkData("DashInNooglerHat.jpg")) ->makeRasterImage(); image_dimensions = image->dimensions(); SkPixmap pixmap; From d3281f3a75f8fcbe1c859804687a35add9c04d76 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Tue, 9 Jul 2019 14:33:08 -0700 Subject: [PATCH 4/4] PR --- lib/ui/fixtures/ui_test.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/ui/fixtures/ui_test.dart b/lib/ui/fixtures/ui_test.dart index 7f38cc0cf5cf7..f9b0dd79fed95 100644 --- a/lib/ui/fixtures/ui_test.dart +++ b/lib/ui/fixtures/ui_test.dart @@ -2,6 +2,4 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -void main() { - -} +void main() {}