From b3bb59e4b50c24dfeef06c0d6b65dfe167d76e76 Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Tue, 29 Aug 2023 16:04:22 -0700 Subject: [PATCH] Refactor `Stopwatch` into `StopwatchVisualizer` and `SkStopwatchVisualizer` (flutter/engine#45200) Partial work towards https://github.com/flutter/flutter/issues/126009. Still working as before: Screenshot 2023-08-28 at 6 32 45 PM (There are some `PerformanceOverlayLayerDefault.*` tests that don't run locally, so I guess I'll let CI run those) --- .../ci/licenses_golden/licenses_flutter | 4 + engine/src/flutter/flow/BUILD.gn | 2 + .../flow/layers/performance_overlay_layer.cc | 7 +- engine/src/flutter/flow/stopwatch.cc | 186 ++--------------- engine/src/flutter/flow/stopwatch.h | 51 +++-- engine/src/flutter/flow/stopwatch_sk.cc | 187 ++++++++++++++++++ engine/src/flutter/flow/stopwatch_sk.h | 40 ++++ .../src/flutter/flow/stopwatch_unittests.cc | 15 ++ .../performance_overlay_gold_120fps.png | Bin 16287 -> 16293 bytes .../performance_overlay_gold_60fps.png | Bin 16560 -> 16569 bytes .../performance_overlay_gold_90fps.png | Bin 16293 -> 16298 bytes 11 files changed, 302 insertions(+), 190 deletions(-) create mode 100644 engine/src/flutter/flow/stopwatch_sk.cc create mode 100644 engine/src/flutter/flow/stopwatch_sk.h diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index 11251d2098..3ae421ecf5 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -846,6 +846,8 @@ ORIGIN: ../../../flutter/flow/raster_cache_util.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/skia_gpu_object.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/stopwatch.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/stopwatch.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/flow/stopwatch_sk.cc + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/flow/stopwatch_sk.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/surface.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/surface.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/flow/surface_frame.cc + ../../../flutter/LICENSE @@ -3592,6 +3594,8 @@ FILE: ../../../flutter/flow/raster_cache_util.h FILE: ../../../flutter/flow/skia_gpu_object.h FILE: ../../../flutter/flow/stopwatch.cc FILE: ../../../flutter/flow/stopwatch.h +FILE: ../../../flutter/flow/stopwatch_sk.cc +FILE: ../../../flutter/flow/stopwatch_sk.h FILE: ../../../flutter/flow/surface.cc FILE: ../../../flutter/flow/surface.h FILE: ../../../flutter/flow/surface_frame.cc diff --git a/engine/src/flutter/flow/BUILD.gn b/engine/src/flutter/flow/BUILD.gn index f52d3251c4..5d69ae2e16 100644 --- a/engine/src/flutter/flow/BUILD.gn +++ b/engine/src/flutter/flow/BUILD.gn @@ -77,6 +77,8 @@ source_set("flow") { "skia_gpu_object.h", "stopwatch.cc", "stopwatch.h", + "stopwatch_sk.cc", + "stopwatch_sk.h", "surface.cc", "surface.h", "surface_frame.cc", diff --git a/engine/src/flutter/flow/layers/performance_overlay_layer.cc b/engine/src/flutter/flow/layers/performance_overlay_layer.cc index 2b693b2700..4275a996fd 100644 --- a/engine/src/flutter/flow/layers/performance_overlay_layer.cc +++ b/engine/src/flutter/flow/layers/performance_overlay_layer.cc @@ -8,6 +8,7 @@ #include #include +#include "flow/stopwatch_sk.h" #include "third_party/skia/include/core/SkFont.h" #include "third_party/skia/include/core/SkTextBlob.h" @@ -29,7 +30,11 @@ void VisualizeStopWatch(DlCanvas* canvas, if (show_graph) { SkRect visualization_rect = SkRect::MakeXYWH(x, y, width, height); - stopwatch.Visualize(canvas, visualization_rect); + + // TODO(matanlurey): Select a visualizer based on the current backend. + // https://github.com/flutter/flutter/issues/126009 + SkStopwatchVisualizer visualizer = SkStopwatchVisualizer(stopwatch); + visualizer.Visualize(canvas, visualization_rect); } if (show_labels) { diff --git a/engine/src/flutter/flow/stopwatch.cc b/engine/src/flutter/flow/stopwatch.cc index 4d28f375a4..b8e8d3007a 100644 --- a/engine/src/flutter/flow/stopwatch.cc +++ b/engine/src/flutter/flow/stopwatch.cc @@ -4,14 +4,9 @@ #include "flutter/flow/stopwatch.h" -#include "include/core/SkCanvas.h" -#include "third_party/skia/include/core/SkPath.h" -#include "third_party/skia/include/core/SkSurface.h" - namespace flutter { static const size_t kMaxSamples = 120; -static const size_t kMaxFrameMarkers = 8; Stopwatch::Stopwatch(const RefreshRateUpdater& updater) : refresh_rate_updater_(updater), @@ -19,8 +14,6 @@ Stopwatch::Stopwatch(const RefreshRateUpdater& updater) current_sample_(0) { const fml::TimeDelta delta = fml::TimeDelta::Zero(); laps_.resize(kMaxSamples, delta); - cache_dirty_ = true; - prev_drawn_sample_index_ = 0; } Stopwatch::~Stopwatch() = default; @@ -51,12 +44,20 @@ const fml::TimeDelta& Stopwatch::LastLap() const { return laps_[(current_sample_ - 1) % kMaxSamples]; } -double Stopwatch::UnitFrameInterval(double raster_time_ms) const { - return raster_time_ms / GetFrameBudget().count(); +const fml::TimeDelta& Stopwatch::GetLap(size_t index) const { + return laps_[index]; } -double Stopwatch::UnitHeight(double raster_time_ms, - double max_unit_interval) const { +size_t Stopwatch::GetCurrentSample() const { + return current_sample_; +} + +double StopwatchVisualizer::UnitFrameInterval(double raster_time_ms) const { + return raster_time_ms / stopwatch_.GetFrameBudget().count(); +} + +double StopwatchVisualizer::UnitHeight(double raster_time_ms, + double max_unit_interval) const { double unit_height = UnitFrameInterval(raster_time_ms) / max_unit_interval; if (unit_height > 1.0) { unit_height = 1.0; @@ -82,169 +83,6 @@ fml::TimeDelta Stopwatch::AverageDelta() const { return sum / kMaxSamples; } -// Initialize the SkSurface for drawing into. Draws the base background and any -// timing data from before the initial Visualize() call. -void Stopwatch::InitVisualizeSurface(SkISize size) const { - // Mark as dirty if the size has changed. - if (visualize_cache_surface_) { - if (size.width() != visualize_cache_surface_->width() || - size.height() != visualize_cache_surface_->height()) { - cache_dirty_ = true; - }; - } - - if (!cache_dirty_) { - return; - } - cache_dirty_ = false; - - // TODO(garyq): Use a GPU surface instead of a CPU surface. - visualize_cache_surface_ = - SkSurfaces::Raster(SkImageInfo::MakeN32Premul(size)); - - SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); - - // Establish the graph position. - const SkScalar x = 0; - const SkScalar y = 0; - const SkScalar width = size.width(); - const SkScalar height = size.height(); - - SkPaint paint; - paint.setColor(0x99FFFFFF); - cache_canvas->drawRect(SkRect::MakeXYWH(x, y, width, height), paint); - - // Scale the graph to show frame times up to those that are 3 times the frame - // time. - const double one_frame_ms = GetFrameBudget().count(); - const double max_interval = one_frame_ms * 3.0; - const double max_unit_interval = UnitFrameInterval(max_interval); - - // Draw the old data to initially populate the graph. - // Prepare a path for the data. We start at the height of the last point, so - // it looks like we wrap around - SkPath path; - path.setIsVolatile(true); - path.moveTo(x, height); - path.lineTo(x, y + height * (1.0 - UnitHeight(laps_[0].ToMillisecondsF(), - max_unit_interval))); - double unit_x; - double unit_next_x = 0.0; - for (size_t i = 0; i < kMaxSamples; i += 1) { - unit_x = unit_next_x; - unit_next_x = (static_cast(i + 1) / kMaxSamples); - const double sample_y = - y + height * (1.0 - UnitHeight(laps_[i].ToMillisecondsF(), - max_unit_interval)); - path.lineTo(x + width * unit_x, sample_y); - path.lineTo(x + width * unit_next_x, sample_y); - } - path.lineTo( - width, - y + height * (1.0 - UnitHeight(laps_[kMaxSamples - 1].ToMillisecondsF(), - max_unit_interval))); - path.lineTo(width, height); - path.close(); - - // Draw the graph. - paint.setColor(0xAA0000FF); - cache_canvas->drawPath(path, paint); -} - -void Stopwatch::Visualize(DlCanvas* canvas, const SkRect& rect) const { - // Initialize visualize cache if it has not yet been initialized. - InitVisualizeSurface(SkISize::Make(rect.width(), rect.height())); - - SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); - SkPaint paint; - - // Establish the graph position. - const SkScalar x = 0; - const SkScalar y = 0; - const SkScalar width = visualize_cache_surface_->width(); - const SkScalar height = visualize_cache_surface_->height(); - - // Scale the graph to show frame times up to those that are 3 times the frame - // time. - const double one_frame_ms = GetFrameBudget().count(); - const double max_interval = one_frame_ms * 3.0; - const double max_unit_interval = UnitFrameInterval(max_interval); - - const double sample_unit_width = (1.0 / kMaxSamples); - - // Draw vertical replacement bar to erase old/stale pixels. - paint.setColor(0x99FFFFFF); - paint.setStyle(SkPaint::Style::kFill_Style); - paint.setBlendMode(SkBlendMode::kSrc); - double sample_x = - x + width * (static_cast(prev_drawn_sample_index_) / kMaxSamples); - const auto eraser_rect = SkRect::MakeLTRB( - sample_x, y, sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(eraser_rect, paint); - - // Draws blue timing bar for new data. - paint.setColor(0xAA0000FF); - paint.setBlendMode(SkBlendMode::kSrcOver); - const auto bar_rect = SkRect::MakeLTRB( - sample_x, - y + height * (1.0 - - UnitHeight(laps_[current_sample_ == 0 ? kMaxSamples - 1 - : current_sample_ - 1] - .ToMillisecondsF(), - max_unit_interval)), - sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(bar_rect, paint); - - // Draw horizontal frame markers. - paint.setStrokeWidth(0); // hairline - paint.setStyle(SkPaint::Style::kStroke_Style); - paint.setColor(0xCC000000); - - if (max_interval > one_frame_ms) { - // Paint the horizontal markers - size_t frame_marker_count = - static_cast(max_interval / one_frame_ms); - - // Limit the number of markers displayed. After a certain point, the graph - // becomes crowded - if (frame_marker_count > kMaxFrameMarkers) { - frame_marker_count = 1; - } - - for (size_t frame_index = 0; frame_index < frame_marker_count; - frame_index++) { - const double frame_height = - height * (1.0 - (UnitFrameInterval((frame_index + 1) * one_frame_ms) / - max_unit_interval)); - cache_canvas->drawLine(x, y + frame_height, width, y + frame_height, - paint); - } - } - - // Paint the vertical marker for the current frame. - // We paint it over the current frame, not after it, because when we - // paint this we don't yet have all the times for the current frame. - paint.setStyle(SkPaint::Style::kFill_Style); - paint.setBlendMode(SkBlendMode::kSrcOver); - if (UnitFrameInterval(LastLap().ToMillisecondsF()) > 1.0) { - // budget exceeded - paint.setColor(SK_ColorRED); - } else { - // within budget - paint.setColor(SK_ColorGREEN); - } - sample_x = x + width * (static_cast(current_sample_) / kMaxSamples); - const auto marker_rect = SkRect::MakeLTRB( - sample_x, y, sample_x + width * sample_unit_width, height); - cache_canvas->drawRect(marker_rect, paint); - prev_drawn_sample_index_ = current_sample_; - - // Draw the cached surface onto the output canvas. - auto image = DlImage::Make(visualize_cache_surface_->makeImageSnapshot()); - canvas->DrawImage(image, {rect.x(), rect.y()}, - DlImageSampling::kNearestNeighbor); -} - fml::Milliseconds Stopwatch::GetFrameBudget() const { return refresh_rate_updater_.GetFrameBudget(); } diff --git a/engine/src/flutter/flow/stopwatch.h b/engine/src/flutter/flow/stopwatch.h index 005697dd9a..d6e8f0da7f 100644 --- a/engine/src/flutter/flow/stopwatch.h +++ b/engine/src/flutter/flow/stopwatch.h @@ -12,8 +12,6 @@ #include "flutter/fml/time/time_delta.h" #include "flutter/fml/time/time_point.h" -#include "third_party/skia/include/core/SkSurface.h" - namespace flutter { class Stopwatch { @@ -32,16 +30,16 @@ class Stopwatch { ~Stopwatch(); + const fml::TimeDelta& GetLap(size_t index) const; + + size_t GetCurrentSample() const; + const fml::TimeDelta& LastLap() const; fml::TimeDelta MaxDelta() const; fml::TimeDelta AverageDelta() const; - void InitVisualizeSurface(SkISize size) const; - - void Visualize(DlCanvas* canvas, const SkRect& rect) const; - void Start(); void Stop(); @@ -52,20 +50,11 @@ class Stopwatch { fml::Milliseconds GetFrameBudget() const; private: - inline double UnitFrameInterval(double time_ms) const; - inline double UnitHeight(double time_ms, double max_height) const; - const RefreshRateUpdater& refresh_rate_updater_; fml::TimePoint start_; std::vector laps_; size_t current_sample_; - // Mutable data cache for performance optimization of the graphs. Prevents - // expensive redrawing of old data. - mutable bool cache_dirty_; - mutable sk_sp visualize_cache_surface_; - mutable size_t prev_drawn_sample_index_; - FML_DISALLOW_COPY_AND_ASSIGN(Stopwatch); }; @@ -91,6 +80,38 @@ class FixedRefreshRateStopwatch : public Stopwatch { FixedRefreshRateUpdater fixed_delegate_; }; +//------------------------------------------------------------------------------ +/// @brief Abstract class for visualizing (i.e. drawing) a stopwatch. +/// +/// @note This was originally folded into the |Stopwatch| class, but +/// was separated out to make it easier to change the underlying +/// implementation (which relied directly on Skia, not showing on +/// Impeller: https://github.com/flutter/flutter/issues/126009). +class StopwatchVisualizer { + public: + explicit StopwatchVisualizer(const Stopwatch& stopwatch) + : stopwatch_(stopwatch) {} + + virtual ~StopwatchVisualizer() = default; + + /// @brief Renders the stopwatch as a graph. + /// + /// @param canvas The canvas to draw on. + /// @param[in] rect The rectangle to draw in. + virtual void Visualize(DlCanvas* canvas, const SkRect& rect) const = 0; + + FML_DISALLOW_COPY_AND_ASSIGN(StopwatchVisualizer); + + protected: + /// @brief Converts a raster time to a unit interval. + double UnitFrameInterval(double time_ms) const; + + /// @brief Converts a raster time to a unit height. + double UnitHeight(double time_ms, double max_height) const; + + const Stopwatch& stopwatch_; +}; + } // namespace flutter #endif // FLUTTER_FLOW_INSTRUMENTATION_H_ diff --git a/engine/src/flutter/flow/stopwatch_sk.cc b/engine/src/flutter/flow/stopwatch_sk.cc new file mode 100644 index 0000000000..16a3411fdf --- /dev/null +++ b/engine/src/flutter/flow/stopwatch_sk.cc @@ -0,0 +1,187 @@ +// 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/flow/stopwatch_sk.h" +#include "include/core/SkCanvas.h" +#include "include/core/SkImageInfo.h" +#include "include/core/SkPaint.h" +#include "include/core/SkPath.h" +#include "include/core/SkSize.h" +#include "include/core/SkSurface.h" + +namespace flutter { + +static const size_t kMaxSamples = 120; +static const size_t kMaxFrameMarkers = 8; + +void SkStopwatchVisualizer::InitVisualizeSurface(SkISize size) const { + // Mark as dirty if the size has changed. + if (visualize_cache_surface_) { + if (size.width() != visualize_cache_surface_->width() || + size.height() != visualize_cache_surface_->height()) { + cache_dirty_ = true; + }; + } + + if (!cache_dirty_) { + return; + } + cache_dirty_ = false; + + // TODO(garyq): Use a GPU surface instead of a CPU surface. + visualize_cache_surface_ = + SkSurfaces::Raster(SkImageInfo::MakeN32Premul(size)); + + SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); + + // Establish the graph position. + const SkScalar x = 0; + const SkScalar y = 0; + const SkScalar width = size.width(); + const SkScalar height = size.height(); + + SkPaint paint; + paint.setColor(0x99FFFFFF); + cache_canvas->drawRect(SkRect::MakeXYWH(x, y, width, height), paint); + + // Scale the graph to show frame times up to those that are 3 times the frame + // time. + const double one_frame_ms = stopwatch_.GetFrameBudget().count(); + const double max_interval = one_frame_ms * 3.0; + const double max_unit_interval = UnitFrameInterval(max_interval); + + // Draw the old data to initially populate the graph. + // Prepare a path for the data. We start at the height of the last point, so + // it looks like we wrap around + SkPath path; + path.setIsVolatile(true); + path.moveTo(x, height); + path.lineTo( + x, y + height * (1.0 - UnitHeight(stopwatch_.GetLap(0).ToMillisecondsF(), + max_unit_interval))); + double unit_x; + double unit_next_x = 0.0; + for (size_t i = 0; i < kMaxSamples; i += 1) { + unit_x = unit_next_x; + unit_next_x = (static_cast(i + 1) / kMaxSamples); + const double sample_y = + y + height * (1.0 - UnitHeight(stopwatch_.GetLap(i).ToMillisecondsF(), + max_unit_interval)); + path.lineTo(x + width * unit_x, sample_y); + path.lineTo(x + width * unit_next_x, sample_y); + } + path.lineTo( + width, + y + height * + (1.0 - + UnitHeight(stopwatch_.GetLap(kMaxSamples - 1).ToMillisecondsF(), + max_unit_interval))); + path.lineTo(width, height); + path.close(); + + // Draw the graph. + paint.setColor(0xAA0000FF); + cache_canvas->drawPath(path, paint); +} + +void SkStopwatchVisualizer::Visualize(DlCanvas* canvas, + const SkRect& rect) const { + // Initialize visualize cache if it has not yet been initialized. + InitVisualizeSurface(SkISize::Make(rect.width(), rect.height())); + + SkCanvas* cache_canvas = visualize_cache_surface_->getCanvas(); + SkPaint paint; + + // Establish the graph position. + const SkScalar x = 0; + const SkScalar y = 0; + const SkScalar width = visualize_cache_surface_->width(); + const SkScalar height = visualize_cache_surface_->height(); + + // Scale the graph to show frame times up to those that are 3 times the frame + // time. + const double one_frame_ms = stopwatch_.GetFrameBudget().count(); + const double max_interval = one_frame_ms * 3.0; + const double max_unit_interval = UnitFrameInterval(max_interval); + + const double sample_unit_width = (1.0 / kMaxSamples); + + // Draw vertical replacement bar to erase old/stale pixels. + paint.setColor(0x99FFFFFF); + paint.setStyle(SkPaint::Style::kFill_Style); + paint.setBlendMode(SkBlendMode::kSrc); + double sample_x = + x + width * (static_cast(prev_drawn_sample_index_) / kMaxSamples); + const auto eraser_rect = SkRect::MakeLTRB( + sample_x, y, sample_x + width * sample_unit_width, height); + cache_canvas->drawRect(eraser_rect, paint); + + // Draws blue timing bar for new data. + paint.setColor(0xAA0000FF); + paint.setBlendMode(SkBlendMode::kSrcOver); + const auto bar_rect = SkRect::MakeLTRB( + sample_x, + y + height * + (1.0 - + UnitHeight(stopwatch_ + .GetLap(stopwatch_.GetCurrentSample() == 0 + ? kMaxSamples - 1 + : stopwatch_.GetCurrentSample() - 1) + .ToMillisecondsF(), + max_unit_interval)), + sample_x + width * sample_unit_width, height); + cache_canvas->drawRect(bar_rect, paint); + + // Draw horizontal frame markers. + paint.setStrokeWidth(0); // hairline + paint.setStyle(SkPaint::Style::kStroke_Style); + paint.setColor(0xCC000000); + + if (max_interval > one_frame_ms) { + // Paint the horizontal markers + size_t frame_marker_count = + static_cast(max_interval / one_frame_ms); + + // Limit the number of markers displayed. After a certain point, the graph + // becomes crowded + if (frame_marker_count > kMaxFrameMarkers) { + frame_marker_count = 1; + } + + for (size_t frame_index = 0; frame_index < frame_marker_count; + frame_index++) { + const double frame_height = + height * (1.0 - (UnitFrameInterval((frame_index + 1) * one_frame_ms) / + max_unit_interval)); + cache_canvas->drawLine(x, y + frame_height, width, y + frame_height, + paint); + } + } + + // Paint the vertical marker for the current frame. + // We paint it over the current frame, not after it, because when we + // paint this we don't yet have all the times for the current frame. + paint.setStyle(SkPaint::Style::kFill_Style); + paint.setBlendMode(SkBlendMode::kSrcOver); + if (UnitFrameInterval(stopwatch_.LastLap().ToMillisecondsF()) > 1.0) { + // budget exceeded + paint.setColor(SK_ColorRED); + } else { + // within budget + paint.setColor(SK_ColorGREEN); + } + sample_x = x + width * (static_cast(stopwatch_.GetCurrentSample()) / + kMaxSamples); + const auto marker_rect = SkRect::MakeLTRB( + sample_x, y, sample_x + width * sample_unit_width, height); + cache_canvas->drawRect(marker_rect, paint); + prev_drawn_sample_index_ = stopwatch_.GetCurrentSample(); + + // Draw the cached surface onto the output canvas. + auto image = DlImage::Make(visualize_cache_surface_->makeImageSnapshot()); + canvas->DrawImage(image, {rect.x(), rect.y()}, + DlImageSampling::kNearestNeighbor); +} + +} // namespace flutter diff --git a/engine/src/flutter/flow/stopwatch_sk.h b/engine/src/flutter/flow/stopwatch_sk.h new file mode 100644 index 0000000000..c1dfb24307 --- /dev/null +++ b/engine/src/flutter/flow/stopwatch_sk.h @@ -0,0 +1,40 @@ +// 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_FLOW_STOPWATCH_SK_H_ +#define FLUTTER_FLOW_STOPWATCH_SK_H_ + +#include "flow/stopwatch.h" +#include "include/core/SkSurface.h" + +namespace flutter { + +//------------------------------------------------------------------------------ +/// A stopwatch visualizer that uses Skia (|SkCanvas|) to draw the stopwatch. +/// +/// @see DlStopwatchVisualizer for the newer non-backend specific version. +class SkStopwatchVisualizer : public StopwatchVisualizer { + public: + explicit SkStopwatchVisualizer(const Stopwatch& stopwatch) + : StopwatchVisualizer(stopwatch) {} + + void Visualize(DlCanvas* canvas, const SkRect& rect) const override; + + private: + /// Initializes the |SkSurface| used for drawing the stopwatch. + /// + /// Draws the base background and any timing data from before the initial + /// call to |Visualize|. + void InitVisualizeSurface(SkISize size) const; + + // Mutable data cache for performance optimization of the graphs. + // Prevents expensive redrawing of old data. + mutable bool cache_dirty_ = true; + mutable sk_sp visualize_cache_surface_; + mutable size_t prev_drawn_sample_index_ = 0; +}; + +} // namespace flutter + +#endif // FLUTTER_FLOW_STOPWATCH_SK_H_ diff --git a/engine/src/flutter/flow/stopwatch_unittests.cc b/engine/src/flutter/flow/stopwatch_unittests.cc index 76893c7089..3ded5142a9 100644 --- a/engine/src/flutter/flow/stopwatch_unittests.cc +++ b/engine/src/flutter/flow/stopwatch_unittests.cc @@ -42,5 +42,20 @@ TEST(Instrumentation, GetFrameBudgetFromUpdaterTest) { EXPECT_EQ(frame_budget_90fps, actual_frame_budget); } +TEST(Instrumentation, GetLapByIndexTest) { + fml::Milliseconds frame_budget_90fps = fml::RefreshRateToFrameBudget(90); + FixedRefreshRateStopwatch stopwatch(frame_budget_90fps); + stopwatch.SetLapTime(fml::TimeDelta::FromMilliseconds(10)); + EXPECT_EQ(stopwatch.GetLap(1), fml::TimeDelta::FromMilliseconds(10)); +} + +TEST(Instrumentation, GetCurrentSampleTest) { + fml::Milliseconds frame_budget_90fps = fml::RefreshRateToFrameBudget(90); + FixedRefreshRateStopwatch stopwatch(frame_budget_90fps); + stopwatch.Start(); + stopwatch.Stop(); + EXPECT_EQ(stopwatch.GetCurrentSample(), size_t(1)); +} + } // namespace testing } // namespace flutter diff --git a/engine/src/flutter/testing/resources/performance_overlay_gold_120fps.png b/engine/src/flutter/testing/resources/performance_overlay_gold_120fps.png index c19d1eb7208e1ee768b0031404592fa26e65ffd5..9677724230ad25a4580c7c0309d6af49b2952ad1 100644 GIT binary patch literal 16293 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 literal 16560 zcmeAS@N?(olHy`uVBq!ia0y~yV15C@9Bd2>48Du6JYis9U@3O;4B_D5;Hcq9>0n?` zVDNNt45^s&=I+np(DXX>f6wD$-)4wAH3q&BFAMKZB)Y>D+O|M}11 z2^)`)o6hlXuR~oE?-#$boL@YzIRE3m^Of_2nHcbb15cBh*BT@qYPr09vA~0GnHf22 zC7=9e< zIGR*%a^cgDw^}R=3=BKW7-bn47?d0w*cliaI0P;*GB7AGv6L_{Fmy1CN>LCRLgl*{ z_E}BS=jZ3$QggU%!@IJppM00=GB7-N?apt-z`)?r(7?yQz#yowfSG~8fraA*0|SEq zBNMXJ1HoM#*I}Ao(ik`WbB=|i-DmbJ3A*w#_qx=$Kwn7Wo{NEE_iy(FMj^|!xCTC zA2zIs<+&!-oYliCaY0&2s?Ko9TV@7^c!6%-JMQnq$}y9}2bmH(^CyL81rz4jFfe=w zUCK^cI&HJmeYo)8wVN9h*X)+v%D})-bM=KIW)^73KO*tvwWKsJ0|P_(BsnbE;)hp{ zqkIm}&h%_%P%tdV77Y7@k}v%HWiX$Cf#JZ_msqT!Pfi1+$h>(^Pak$>*1Zq%c1+wRJSWKbpsh68W0 zMq!WReor=OXHWn!U&IzpDESuE4icqQ-jy)ku{%Azz5QJYDBZ=(#g^_2*ygSmdHjNr zp<%r?dAR~)Pt9iESzC7IJUX)WX{Sqm&D~x0c4AH+=jwGvzj(X-{=B{A@9*ubt*x!J z|MQUlzkg+A<@dSkI2jlgJzB={CBOdn`s2@@l|63}a59tTUK!%}>(5U?+uz^sSDUrm zn!T|*zvs{)Zp-3ldqQIaFNR3;rypwNHnpw(W>cfqGVA>HlPN|Uw`N~Imz$9>ywQJWlp1fTaFg;?^ zlcj<$OXAXge^d9LK6UF8-`U^lu6}&HS>MF;?28v~b-nI)&f2HNCu0%t`_=08c7|17 zUL01msXqHPX=Ba|qtxV|FD~wv3yY{wEI&OhJ<4ysT)lhKhx2vcHn$fQ6$RPPt``>K+jvYJ7SKOX&`1o$uuV1mL`TKs#_w($%^&)E5m*>jK8*^@Ke0*~9 z%MvB)+F#XEy{G>>-BI$3|FNZ|;FD}4AHVL{@th3;<89RF1B_}#_4JA z&DsT=O21w_B=G2_ZMB@`>%Z{Iv^{j3rz+4|pax9^{NHZ8e%?e3J5-pW~7eIl~f zW~={RS;?7xe%{*M%8ol$uh!nabLY-~ACJq|E4K(pNlCf23T*PX|NCXxzidech9AAN z#V-8*#bxyTT<<$h#g^jdZr`_T5C5tg|L@NWW_G@ws2v3luUm!O*HKknyVKS6x$y06 zwzZ$GtmM3_*s`Jgz4Kb_us`c}wY9aq(hOcU=hl|Y%S)a;dsg`UZu$LPOTDL?@ohVM z>z4E3KKc2z4_{o|DXZABA^EuQ^00M(Jpaxx{N2SbA9tZ{b^pttuV1U%zJ3u|`m6f= z=TDP9mRPA*XIjMXv#}|$&i=Kk;_uh%;>$0;oO9{YrOnK1!{hg-NBH_Ce_R*aKi8(N zChYm!RqwO5<=ix~w71`%eQQgmu42msAGOcLMMXh}EEyPL?&?Z6-@6_@fm5+1#b~Cu z6GuD0{JN<9b$?@@pPRe7^Jvn|Q>RW%?zj8(f?e6ICxc(H#W?+($liayUTgc!x3e{B z5m>!ujm^%itE+goZrv)bx3~3Qr~16v1s@)C8MpJ@t+f+7-4?m|TG-$1|F?ZF-+VL2 zFEaAxOm_L2g2z8TK0eQVc3b-QccIIzt+m0Sd3NsZWofs!EsvfxdwJQ>$1iU%^Z)rf zBW07y*2Kf_W6Gkds;f)yOXvSte!A|=i}wa^U%&Ql5jfPy%)TrvG<0i>zlFYz&HNK* z-*#@_+WY2Zz3xmMPxZ;JFDFg9Tp9oDNAgCWoL5))wLX8|UA$}8sbAmTRQ~vU`w2JK zt>S0rVvYA~+O$$Z>~!0`}6rl$SQ-qnV0joe_6l3=I3W+6)2QrR~E#%NHp8`ELJv^M)^bzdIfN^73I$XsE=sdvfpUANLmI zU0#+Q_nx^nO#kjb_4zeMm4AMGoZlvJ$iM#A<>S%O(eAAUAB!Wy!>|8%v-$kG*Z+IW z%+0T>3U%(2|NFw-UjD`IMVmJpzt8{wE&u=7FE1~b&$lRCv~Tg^#cLKUSdjhl($d++ zGkyLdW^Ye>^jNUgfi^$K~t)^rjd^ez}#s{_gev^TOk6zwYbn>$?=XI&AM&P{}>{ zWXi?U`uqPBa44>c{_cKUT3UST*RN00@6~+v@2mOs@)EaVi$VRrR}Z&toiB2~`u*Pb z_J6-zUR_*VTpeHg^=jzJluw`K<@#i;%^n`FZ10-}!mt<>sq_L6>G(SAV

C@i-o~YaZJXimB{r|7u|3AzB_l#ZIJa10X*6+`smL7NJSh#)r zhfQ*)L$vHCPoKUg?RNazAL{=9HYEN3_xpU#?QbF8X42fn&-PgEssGE$9k*Ij&u;#W zZEvl0qqo~#o;3gd)XfziPb=%)O)LDk(t(+C@6Pdhnm$eE=k$q| zmbJ|Hoa`cO&z`+(rKRmJ@-1K8++0#$KVLH=Yt}u%?$pDJT=&aNoIJVj?TwE&R@VN0 zXCEBCeSOM;zo|wuZ$#(sEzOUOjXgZavY72pqh^bMmv{8%s%q}b-|zkIUo2n!M*sNw zn4k8?dSrJOAE=d?VQa1P|LXcf-~Ydy?{u=2`{CF3wfZrytN0TioX^@nS>1oy9P9GD zACpwQ`C0@HZ9Z@J`xz*mstR@9`~N}y-(mau@4N5UZm++ae7w(hhE3(C##V0ey#4du zcL_LI6g@f7a6(I<-fl6-fa4mDPNXce)%KV-*)S=ZQH)p1O^7ib12GKm%X|0 z?(S~!uj}vMyB8N08d_R)tVi;!V#|d2^Z(!5SNr=|y3x!Ct*P@*rWJ2e{Ie|G&VIjf z`jr*Uhs)kZmA<|UT>t*9`qg#O(YNoNoo&9}Lv3>BojZ5VfSmX2dwuX1%(&n4j-YxUjN|7 zweA1XV>uL;1Xa%Ton5zkXMLpB)Km7gzrMWq`T2SN+SRMAw^o0Dmnm(Yw`cpVUB7BL zg7t6v+05%}{V+T3$LZ8{k}m7Z{;>0}v$%c5WU+CJ02lY|^XKR6%&YM8i`SWZ?yQ*T z)~9hh0xlQ-`m!U1L-Eb6t*^eU2xRX{-uUMEZ#nZk_sr~nN5fNEZR8(|Hv8CYY9FfiG=kNXeaG3u+-@``{ zzYp%ycH&69x2MutTtBYHqNUqDX-(wjXBUrNU$JxhcJsm~Cnlc!e!u?z?Z2nje~V>g zU?{((J5wd^-k$5(RaIWU&&`p%EbPPqY6a$)NmoB?6%U(dUA}JD`t|D-S_G0dMwqp9 zKkifa*|9qP*O%|d|KFVd_s941b63Cq_h$3Txo6M%m;F5&-@?9r+y1VuWq%@cWM|vg zf9-faFZyr$biLp0^)I47EU%YRv-#-4ao#@O(6FW8Vb<*()6S^g+`9k!&;5U<-;!Lr zHqnVgu}3mE(k4I7?Awjxm+aM5T$e;efBy8I_QyLl^5)AuE=oUt=6w4*>Exs@2b=F( z8E0R+^)NSAxr$GA*Y7_LzxNj`T=sr$d0oYx4IiA6K0Wb$dV1R4klWY3?QU&tZQXk_ z$ILAI+M2oiHXjb$6L6YglzM9A{-3k=OKvTGe(q&B+n0YE@BXivwLW56@mbHC>&pI| ze6rzudW8SdPevOf%v6N-ek`#vzk6fHj@(~gzOR<6dU5>g-`wr__nW8pPL(r#74UKS ze7#)h7d!Ot{>#tW8S#9Q>VKn0QP01hzE<;ct8x9mSEsiHhg_Lv9gy36_44)b36|B{ z*6rT*?ZJk{?$67vT&oMZbIWR*_S|!4r%l=NY-v#C%zp)PP8=^w9?g1N@aMdcFSd_5c39zP_KY ztPGZ(U-Rjt?)1FRFD@Eq6Q(`)VWq|CW{(kI%@Obulu0`}!Tbeq}stVqNXN zW!t-V|6VM9zdfdUy<*PYUp~d|?y0XXU9YO@%D?@1S5figkEy5QR^{f(Uf!E{c=PzA6puJ7jErMG*ot+~16``5cGjd$>0 zD>F6iZQZ%^uI2H*v+sUvy1nn-=W6A=C%1OatC}@yS^1e+Ti03XueXj1ycn`0`S@dX z=N&iJT{qGB{>aTj27uRn_PCIq}{i&VrWceTM`~B{=eg3^Yhpo%s%>ku~i~0Niemm7~|L@0< z_y69#-zVzC@%!6b>8rPINAE~EImv(jn{Df#?|$UAHfrmu-dVF|ovvG>t*QBOg*gL* z(&K48`)!I+>V6;ToUOgg_jZ8bq5Sr?wzgUO_U&sD)eg&%H%{}3=GZ^;i%v`T_SNU- z{awAv-#)f#-@?R`t!-_p;>Y^$2O5Dgp{r|d=el*Du1r0+Y;A6eznL_5YO4C@=qR;% zyPaV+^ZH^X1M-%hI<@SNi_*;E4-dME-@d(CtJpHZBgU?;^2P?^os-pa*X88ITnUTc zzr5tvmvZfI@9Q6MZ!Wxk#Y9Xm?oZKMcKJVkms`0_r{86pGkf-IF2$Bhmo62bJ$qK! znWOsG^wN@&Dc7!DGiw$2q+jb_ULLt>{dxmX@Bc#m?Xtv&KV9PD!XN$lIZM(0mtM>3 z?A^b9-Bn%g*ZbaUdGY>|-7)8X{@v78^ft!dR^9K+n>mKbwO{90=7%j0s+{@k*~(bO zmJ9ddu1=qQTUcM$c5d~c<&TH3x&Hg0wg+PkX!b z|G(egTLr%D{r~UxWwYE{U)BaM_v2l?a^=e#d#k^1nW*e8r>mjy!>P7e^3Co?ZauQr z+f2o}Q)kbfy;@)P`2FkGr%#?eyZUzB8D@rtgLfu1%sYGR&_reKbN;ix)rBS}Czs~t z=0@v?o!;~PUUm2L^Yiz=-+bO~^}X%+_wVGGNqaB9{PEtsMJ1J$#RunD=0E-S>-zV( zzDqwDnVQZQTOP#v@}Iz^%fVCjS(N>_e)Rdd-d8W*>3N%)`@fuFQRrQ1HTT3kJKJ^D zKRzh8PFBm+{Qsc&e&(w;YkpjM_`nU+B~RUKc{B6!z122FDF<6OZJJ#9_;|i{|Itkg z_b;#c_vdJg}b@Axr?jxYTtj|Qm!_6 zvTbcu%=Hz4?CrAlcE3N%-Cnj#a_;42d+%>Ac&M$+Cl^y^HoLbq^RnHFKS{0PQ>RZa zZx_(xzP2$!XRe1zkgTk@^_%rM@BQr}uWc)MsJ+!VeP8g!OGYcR-`t2@`t#@9&SS?~ zLpul{HwvP@j3qV&k7RQ8bc$S?g~(9Ev?Ml^ZIKbhIt{ms|Jeo-Q|d~;{k{mzq+x3X7yey&{2+KiQJYyvM_*s$YmTKi`Krybw#)l1#IWVG}1kseH;XQK0+pLx=9#cZ>`Vo^>B(d#Bug ze;H_|u7MHTyd6d3|Dy(iVped%j?1hcu5PTUtjJjKRNAbibo=UQ`Bu4%3=Hx1Rm4tH z_ebvbwGrcHU}$JWo!&#FfuFm)mlhSVMa}bAa(VmeY0_UyE!x(z#qO+xtp(^_xXsl+ z|9!*Z=ue+N1(^qlGcXk7?%lh0C$p}63D2)bM{SR@MdiKu^7W@xkK=#vaX*;`x=3e8M&wG$*{?3R^IIm@3hH?t1%A(AtG{ ze%P#`OZEXJ&VtW6@p5uf89%`uU!}T=&DuS1g`+hi!vXWj*rx0xK1q~3&SYd@NO+Od zyjGxJJgse0vy0MPxl_NLITWX!Iw^U|j;;FtSBY1JJYOa9j@#uOtCU(5T{|zoExJ~2 z{c{}0iEz1bFp*_BEc zrQ^51>+k>iMP&K=65l&kx2Ngz%ipce_Yf0l`Tu_BbEiP}<8$>m85s6m%=2=H-}&kN ztMhYKzQ4Eeap&df`}QRq%s%}8)q1J__w9d9wy(5n5%~9W{{PBQqnSEC9^3zWJU#zd zUH(?&sns9T>u3Jk{`Be7<>BjMc5d9a?_bP+tC>D(+sfYF+R1NIux8zc4^Ho<>7L&* z$If=&@2uP1$1iVWA;0z1AXSrFT0) z?Og92M{60pr~j)-3B368j;!@Oo1Z@(_wS#0HZ6Jmo=>NgUzYs({Q29T&*#_Q*<1a6 zk#YK~N!DdHb)Vkc+?Cz-*0T8CDk-}?8!P_*V~;Y={Z&_-pPyLu@lkxAhe}mmwY7?n z?Z;QIl3m^V&*kzfw!C_^xK;7U=IU=YMa#C9<`~WHz58y`KBGq;OLD%w+1_?M>89iL zSkSC;@Uom$JLbK99JXuI-hSUX5=k?CDhj^73Ml`Q(UEFYzDS3G;ek+I;r_Nsldj!a zwCHnZ?(KPYm9MU}yjvN3_~f2Fd-&sPJ|2Bpv%I=O^{A$;aMk+tpM!{$6Xp>i&xL_l?&q zU#@ZWe)at6(|bVUpgCrC6|eTRg38>xC;!IxOB&x>dE%t!Q7fxeRqRpg_tl->Fl*Ma zN3px*tSkTgSaa@n=>4r(JGbne?CPqxeZBq>)?x;Rj-C^2U(TI7w`c#~+x!2TUtaEi z|L*~2_19fp=bnH2BC?EMX2*9QooSuEbALIe*435!g@;GpZ)DcaTJAghnvfIrsn4TF z{nM?iiI_R8DSP?v_U+Zb?^Qgum)-egYsH_Winpk9hdQylwivb;Bsk!nK@49vfA;L2 z`ro(fP2YWZ*qUo<+TQ)|k^Z^A8<6I_YB1+LE?xNVYfG@ zpI2TB8jPBrw|`yU{|(QcWy&hH6r8uUmyV3ATx8H9Ft6g#PEK`yzc+U_J>BkS_wh)v z@T^&BTf#$SwSAU|SDrJt{PA}#qQXzKFr?(n(q-mLM6jr{D8 zyDk0v;raJ($#1v)ceP%r@J+ ze*e#??F*-aRFu7Ww<-7byu6uaZ}*-;nT-5%srdV2dHG*)?(Xh49p1_w+9GhMcl-CY zQ{DTUZN5LRms?i%r?BEzx;^*#zdz@)ib3SOnTfoc((}Lv3>B-fy?Ey``n3mZfaIIcL+RO~(9oKOP+W`1tsI$u~BP z3=F5T5mJ3&|gn-J!YAtL zWKsSuCNwTC?vuLx&y(eH$dg)|pJcs1fBJP_yMR-E{=?MRX)8nO)b#Z$&z7xNYisi6 z!ouC>ZGXL3oXy3}ZEgSKLG$lz`SGrnwTR@|x-gR~1=N=u^@83}}`{>cx^624V{`wC$-R1v=flT%L|8wuA zXN|XV&do7z|GwTHHrHDJ=cDu5*=B#sinXTBkKFVm-tF0wFT54=|0aAjG53GHVvSAU zjs0`)+)3H9XV20FD>JLyb*Axli~TKf@$<9VmV7*U`M0;b|NF$=-M4yM?EVNH>1Su7 zjrS}~EjoU3vM{@>dtB75S=Vnz&)E0XRiJ}i_Lm10*^kH zMC|z?uFNkNQ@Cwqrdv9PqKMeG`TClX;d6b|gm>=TIdl2Esx05!+_yg$En2h>lwRK4 zSh#JQt@rQk+l!wsUjBaf`{l{c&O`>=R(&~`2%3DpdG6e)eXHNwwrtuoZBKsf>-uZ9 z|7&JU@KCAR|9S5FHSgl5c`g0qKi|%_>ffKA(f@zf&%b1ycjw%to13rmy??Rdm38s5 zf15TQ`&eNm=EM;$e|zrEG=bcVh_ZJ_I%m$^oYuO`M@=|-bK2R(-QxQ9b`?B4q^#I- z;o7xr<)5FO)z)j9-4qaVWm@$^C*SigFF&57*s>w}`l`!|-DEZTj&7R&zWUA%*`=U4 zmtDI~1uM2p@Oz%N`R1JZz19m9ihur_zD3rm#6SAKVa=C|<f2S7ym!p;ppC?bBUU+@?`?jU;_lh6dRoeTq#Hw!V z`OBcG+t^?8DnCDa8?&e4;{sFl$tPX%^Yb5_n5aDY{r>;|w*Q`f{o1v4|99{Iz5D*{ zz18J^_uuPfVqm!MF_Gg%xODlP*|UZJf7|Z-9Yd{?mM>j;FlMkF~~|)7Hw~yJoiNIjCgd54qjSZCd+& z&*#IBTU*72CadRb{lEXe`fKp}J)hatLBk%4`_qztf7j2g|M~RkR>hWiD3eB08Q0Y3 ze7~wD_L~2A_~e}`yTwIBzO)HAMMmCy9-R05`Sb5-n{P(s=jSW6G+jWM2z!3+YH9tq zn^(@&{+6?;ere|3YZdb6<#O-aY*z2;R)*Yr-e@~{Cv-~e(&y@@{e07})vPt^KDtS9 z;)~w!5R<3JlV0BV^K-TPnfd#FZF(yry7ehv$nAu$U%rZ_oSV1y^}4mT7H?i$+$jrM z#j$-`-&?Qc#hX=C*H*3!iCbn58Zxw+yCcnd%9Jh7{AO%eTl4(faldc>B@8CanX@lK zXBsarulFsxza=++3OGr;`1RwgVQhT0I%G<(cJpoP_md9Hn>=~)$+XQI#p5axpYAMv zzUud{UtCTcie*P#=S-gb`R7lGH&VGdIWqIkragXreSQ4Sy1&0pf4h6_T3D5>DHFqi z>sNg_U(EFJGZXW!Unp)N=YKS537e~n?1Yd`&VAMAM3)CA3x&u^) zS=p&8z2l|dSiZR)>>qsjOJC&XYoVYuC)!%GxXRyD{7K;uzy0;}nGpNbQ*B)pHloox zK1{vU${qjn&(}+rF8}nm`FN*g`~825lmFUYQH*)B^qwAZg$ zwRUapuY2G3eSftgaIxN=-|u!CZ_mHKFK0#RdgvS#_w;>XK|w|CX*<{%8dmJkOun#t zw|8)AYW$oRYqo4LUB6|^mt9rw^4icRly2tO%*LEi3b-(DhTY%0U8{3fFI%?p!^Y$P zifS@nuGE(aulLV}P0x5w7ZsoHUs67O$+{Yp>7)NqNV7+d>dw36e*Tbck=Yvw)FOPcXxj}WBvZmhaXGpK`rm-=;Nh(KcD08FE5{7yYTG(GhYjp^Gd7D zO-!zQ`TA9KO~l5e-!lx8Zxt048T}Pjxwm3t^6_oQk~ZcP7Z;c2=DuzHXCE3GI``<& zqvlVG85kJiL(P}6@7-8<@uzEdUF7bPm*?HT*r)H@SLg3pSQz~-w%m5-+2Eu#)A;_%jLex=Ov~P^yY%PJIhW+ehd?X3QcoTGbnaZ&zJD99 zo;^F+`t_@CQ|H*nU%q`Y@Tz(4Eq2kBA&$H1e+GR0CbsnS>Dk=R&QxlDzrKIp`y8#Q z(^szixy53tmPdK{^rb~bzmg8O%WK{Ot&26^^!MPo_q{pBGj%-8@lSBQ)I6mV@!{47 z=k|Ab+1b)pi(gi+U%uCP=A1V#FF)Sp)@x<)=EujI^S|FPGd=raj@jG4`&zlpC`4wmpz}d9T8%wNeo$cR+hJ=*#OBz4Bytn%Mx$|ew`ufhX__(>P ztt}8d!2f3R`F%D?M>=l*+TqB+&@pNDrRIB=jFx7D)+RlFUas=&eEr_EgH2bJKYiX^ zWS0Lg4zvIuUqj|j2WT>Po-O};Jzd+W`zt=4-m2^_CsFq1#-7iLF*P#Rmw3)Ted<&c zmmR40z@bBp?T z9)14fy+QApT?R&!Y;{kVH zeOtG3<;#eTNk?~sRx!tIPCL7uU*689@YR)-)y^CbUtCVyocZ_nce-BGmW=KKK86G4cNgrP_x;Y~T!~YBW;q6zmCw&#|MKqc@~7d?DlaD=tFg&>cV~Os|5xGv|Gk*nze0MI%Odr;W()rXJWXkolR=j^}33AaH5P;(&DF8xPz-rbRtHn+Q7 zvpoC9CeZRd6BC`h-8UcFv(v=dBifpF&T^7UDJLvP>P{{G-KkfJ{M{hM{Bo;p3p(%5Qe`uXkoH~%p(Ft8~t z_}qK-lF`oHOH+$3&t1pNz@X4F+r(3bfq}um1hRSIfbRaIcX{4|L@aC}voH_|$mke> zDVM=3{o((1c6RWlyQV*D!zC7gnS=|7J z^PN>${Fs|ihiY!UonT*)=I4}uM)Ri}x(}jR7+_#>m6@o1!})IB?M`~re=m;?JaPT* ztE-7`15QgzA3hcxdiv`xE1ARBkFGebB=&o=;`HZ5|7#{OiZLcl7H90@zw?f1QNq_( z8_IT+N=Y9+HhBZ%N`WJ9^%~aqUtN9p*28O=IXu#nGno>ZLG)Rs0O6ob3YJ$s{rWX; zopkuQ>Dk%Zy3&&knC0XA-~T(baGL*ov$eG*x7isO_N~~tv+_>B>GoWq?I|bsOZ^Z8`okG^4Lf`P}6U*M~Ou-@Jb7*7J46@vP#UTLIm(XU(cJUGRk2kT%bsn zfgc0IhqEb@56CO>CR~ZVQ@VtWfuZ4|ar5L4%nAYquk_x1@HM_Oo11}wVO_iAoCu`|Pt~%Y|!UQD(DhdA|RgxI^@}#MyuDL5JVkwM~?G`&FnlSz@iU z;kCmrU*3(kxbo@cj~Eyj?)XgPcu`Y) zxAOV5u9ug$_xq}_J(4#6_p|fgze{J{uIrrreC_soQ3VeUG`g+~S@odZ{?EhzQr2ZT z_usDLWMEkIsEy^z`nWl7+(M@M)4b8dfUE${TV_r_6kx5C2o zdxu){uZ7fyZ4){E_~wP1k+=8f-#`4^X~o~1xjAOiw>KmnUbJl4GReJr_olwSwzfL? z-k!?&bvM5~`skDM@=|#AvEFRGv!_oV*|l3cn4ND;Zhrp!NqbV+OJ|B|$E`V?!nMh| z+^%xlqD5;HzP-f5#Pu11x{pS4e^?>+6%3K57$Z8$Z9h zYO41CwR)3(Zmx)ni!*BxsQb2gzU`H3*RC1V{`zv?cedHvCtqG(J|B}?%`Lt!(l#%q z_~k-p{%z&u;mgv`X03_Y_vd=4wAr7ZCrfr2RKM=iX>nO(9~WG_DCPFH^k`>}h0C7R zR}^x5ytA*if6nQrk9I~!o(}g_o7}no>$T|nr=AvVe0VK((u!o1bsYJalN@k%x!d)$gpRt*^N|b?VmV)2GDv$k_aNu+unw z+1I(&*C*H%B;-~H2By~q2M7CdDCXSU^z_`dYu8qOzgvEPS^E6ivd@!Lz5PT)MVGGM zcJ|k=#mRp2VlGtv`LXC-@pGw3yUT0~)h0@G_|L1^@a3B9O;ujr-^adupT2}W{XI9= zq>nyo`s#D|-*3GhS06p^WXh*gr%#{f-x}w9c%R|ct!I~3e_La{x%~aEZ`ZCx?w#rL zFV}Ma?QOZU10y1CSXY00vrWLsLv3F*@jD6@nu&EkUA1bJpZ%{Fi{D?rdbPAwz$q{={N5th*T+Lc>$i#=P1~x|^^ZEAFPF94^z6>X#ouFkjus{U`@?%xSY1v|xPN(aY^*8s z@9*|k?p-vjODMQIZQ9P*t5?;#jAu5zS?2ry;gtZ>=g-w2-~V~;zR%w$lT&54Zk<16 z%9NNh@89d6ld-G0zcWHddba87zpD-%+E>5l-o36X`)c{?%Vz($v2iWy=V!UA)XM7B@9*zo%eO6GZgls;hWs;&TwiCGzp2=@c57)^zRkQ&+aC|?ef`u@Nr;p{V_*}i$l)wBfPwI-QYioX9?|fNOn09*F`|Z5z_E&v9e=L1-=N)$W zKMQi--0Yi`6va`?4v$eKs5m>!y zmDS$7yStA4`t|GF>Fxh7*1OA}-SN23+Kx}LW&Xb}%lo%)-|o+$*z$aS{lD{SzO%0U zxl?>Tx8~o^=l^qVZOLqpj*eDW73#dwU;pQEJm1&ti zs)f6E?_RWG#ftK$r=~`4zM1nU%QSuS%^TY5_iWmKc7;lIr?i@1ys&)o=gpo+gbm?*n9fEpy;S7!;Q(u<+tSC|K}5(n3#X>(^LJctpbOR_1atA zyi*hIt`$0?_Hplii*Fx~Yg;>WB%YiUe*Eh7`udPv_5W{u(~aJDf0mzkTKJkD+do!T zt~{T|yl(aH9bc}j{241>Tk^ei;~I5AF#r2!__CGz{+hXlkDE_9x64^< zPd*-;yE8^dC+5eo9Rhl`kN0L>)jyuT`QwL!?Djvt9OnPOVeN(u=J_Wlg=af+JUr6b zdiU+y;OhG4=W2Ib$(=v)>`dkIO$!tx@9+J+ar5D;fnnF??N2z^HtXHHSB(eL&*;bO z2#5^`nDFO#{h#CZKl1;--T(LZ{@=Uz|33Ka?CkWqo6otqemzobF)#@Dvs3bP$u5KF zfC+nE-H1Q^vEAUy4PGtXy%RL_?V~H++<3H3!0E=WuhqF{&z6_gFS*Qm)BN6#?qut7 zyRSEMe@*YdS@8UORkqy8t)EldRxjULT2>BD{%@Z=SAU#*e4FUjEoWZ#9W8peZg*Ym z^y$+(-`@IqV`ekEyoGt@rGuLmew%(aEjfSR&u6uh)qJy}b`(6E5O2^b;8a;zeei%o z;j?|e{~bSaT<-U4Yq_cy`|JJZ8Kr)o@Y`Zff@8$r+xOev|2@6GWz)HHA8wWJmo9sE zXXl%H)$jj4nCLE7X)Mudn@fGyT3~%=h{u zox+#X&deyRxVb6S+WpgZr51rcS!=W0pP!yu%hi6l`1R<~qqgt&|Nr;b`RboX-THN} ze|&s=`Q7gK`@YYs`}H#X^XJd(adkhRmYz%rTI|EXp!B%y@9|9M!}~t9wbedt{=a|s zZlkTWzc;T({T}9}yHZiA%A*MOfWW=I-wD_p!~dr%x$)QeJlL z+k9JVQ%NTdP&Htkchj}VKo`a&FSZN8SCm6S37Ye z9`9Rz&gRpJ`+jo`9(tU7z>^ewxvOun`}?;$rX^=)MU_6hva-@vu|=Ri{m`eU`=#oi zoS5~w`M0KC{kvTj`S*?$R#vWz&=cpEultb`9UktR^V0Uvqw7JkJWs+c=vgA)vBQQec!#~3u<0R|1S>WPz0qW-ROPyt#;_l^%I|G zTV3{OlB)MM|5+w4&)nNvot}Sh&(D3cX3gqWJoD>L*`tp>lg$JL>d*6Fyp|pa1?w35Q~e(a)XQ$G?34{r~TbqmO6aD0u!oD%($m?UC}%vUO=Is`}*P@0ey^ zd$!7RGT&4=`+X~_KRsz)I@2fa-IbL)ZH3k4v~=~}dF}arZ~mNJ6&vdkKHLajTlH{N zf8(B?&t`kGv9Wc{tNC>Dtn*cqdX0%5&qBlJ>)2I&naBP7yuX*<++DkC4mR;V-nDym z@bhz~H7_^6DBu6LY)0t=2M)!S92>d1kMIB2M(nNm`7QPIG+A!NmcG6|=IHHtv6Fq& zgk4=-U#?rXuItsSSDTBUpUdS{Y&mr3P&vPxO@+JJ?B1h~r^|)^_;8s2c}QsJ+;wZ~ z*S_UbY+1BuQAu1}oLY;(x;LI16Am`r<+uOy;hun=ZMOZL`&|M~5ql~=zI%FldcDx0 zrTT`~*2n*U@oDuH8v}z07G-a4^sviSJXm}1>DRAcXV-n2Jpa$hdwZ*;-HOb)7#Qww znJ@Lc^XTaMtKYs)Uw&@x>^t&K9F>)oH)Hg~s~@)3i_7gQcN9o}BnI7IKL6Y+%Zd-T!)xzt+q7w^f!OII({w7g=AE1rZohra zk|oOZAMRg%*_2&(&$K$SOm?`>%$E%+d8w znKZw2v-}jFX{mknGC!~F{Q23u=k<#fukEY8%8xQ{kro>w&gz`HGAVp8)q9l%y@ZRe!a{^an*J{Jg(abZqUaj8|7| zQ^UDmRNlP*zf0s>?5@-M7A;!zee-oeL^% z)O@WXqJoR}RJ^FJp6uZ-M;Gr+w$v|ZQZ^5Rk81-yr;XjeEvN7BPiPP z^XK2We&ffT<#+FfzI=Ik`_%LE{>FWs`npxXNoiu=(fXvDHv)Pu7VWH9w|lqM)w{8C zt?KK7itg^(KXX^@?{AX)wqGvnb5SxB=s#}%ed*yDhRIfwPo@-dJSXYS-SDd--#(-1XwOJxk_In`U|U^Yi>Q zni?;MuJz24Uxvo_Q(+qkjNQ*E+m&W#NZC-O?0)qMNhEw0~J{iyT# z;pqIoFOEErrL8zu?*w06r@@Nl%avjyZp=1+B+LK!-|zSKTPi+2@-KUT&-U$; zlaqz-SG``_{_Xw!`d9t`fArtyQEX{u=l7G4kkE+Rm~`~`^<8f#{#m=DJ`U8u+`Dbt zx8n0Br%#<)c~zQ$VPawMy!|$1IiA#D_5>Go9ZRHHga>?^Cu@K zTRZ)zy}VgK@9w&N2?z66+yAS0dUV+`(Ye09+E(v(B!}Pp^HciR)F~w@Rn^Crt>-b5 zm3{oXcxS|l6&A5Ku9-dF{4DBYg<4sCs>9Bit5!vE33sO4o2Zhb8ACEtpyX4H`?=!pU(xgc>Wx^%eZyx*`ueY?+^L^?|1!`OE)8b@4Vgc z`Sa(?iY)99KzFzIIJm~1mQ>UgaI(U0q zcXz$M8W&fUu(a|=4ZGWc`VvvYSt zHWxgUHho#*xDC_`;7}|n4PE}}^Y6z`pQeAdwm!bpi9=CezxHZ!(@WxzWcknY8Bh6Reoaa^#$M4%QL4;i}TsC-Tcmk?+ePy z%Eb2mdbRrdny9T=_nG-^3Jh8bKJ5K|Z}#5Q)6??jS{A4I-$mM<}SVtumFRfV8Y zf!VWXXTN&=y52fzW5l<+<@aOvrJS79JiqQ&=GlYI?BY+0c1Ea8?&Rm0l5(ssS2t?M zhqHg~|9$uGGsy4TzCFHFvP;8Q!s*vn+WdFs!Y~>dI_4}9BrL}8~cQ5z9Z)P^x z^U1k+b8ngF-P!oa`u!cVZ-2l4U$J!g@=vo4AN=~_)hfTIMU^{m)^EPQ)~YNgGu`#* z%O>l0Hw?|hPPZPM`AO9~PWt-w@Of4hA8tQqXY(@JoR+)p*O$wdcf-qg?920tHtpYU zvAN=7_G3QzeeY|mVkgW671SkG6G3J3M**iDuh;D^%Liqp@c7!V>t-6K&%3d^{QaAK z`}P@Xhpn-YaEh=he)g<>qpj`Kl?T&TM@OfB@tIY!;mxC?w;JEQdv)c_&G+HUF1yY= z_;j)9of}V|E=_uTOji5m*4HO5U*G)q;kox;bBt%|oaQNg`{n!el<9i4sh|#PNlA&% zi~WB#D@(r5G1D*q_U6hxPT{^D%gUmI>BieYC0N?|I{mFVH}hZh$wb!L)lctky}9}R z`d>+{(|csCx9PWh*qI>PeblJaMd|L{+RQ`$PJR6MVsWVK>1ltL)!o~(UHkT}cW>qz zrTSMUCi*YhSsD3U{CmOMV?C0W@87!@x4rQ3G1Kq&s^7OCJ$jV+c%SU-N%QB=U$b)M z%a`xppU=+C&8_(Hu-%+z|5kmeclk%Z=G1TAv}sfRrza=n_y4!kW3-nFB>;N`aGA*(Dd-?*`3&9-gZs?W|ceLu&(eqY+( zUtjP4d@|X8+4)(fuN^oPW$f$rXie{K<+uM6mu(e0BX-}PrN64*{k$*C#a;brTkh}X z%gx5m>(%}BUc7s?>Sg?{FI#VQ3fG5Aff}DSWuOf9eQtT4^zO8?=hggXZd(55#Kf!5 z^FuB86ppv7-^KTwKkxtS?TwFDULIsi2c;h0StSWRR^*p<|XO9(oPu~}1 zo_{aebpQOD|0cOHDi=Jh*uL%DE8CJ6jo&zh`KGRo`r6GYD!QDz{9VnXFHg_!?RT@0 zJ8%2@&F1ybpFihc6TknT_5NR1*U$4&n|!q2_S=owA1iFO*Z%%y{rPkKXLd22hzmuw zx8*_U;o9Fb#^?83zi{Eh$9cBZ)AoHh#C=}IswCrHZ28@-z835Z3SMn<8~1#_7jrqI z?7|HRGrsNTKtu8w-#+?&2(|71e((3^kK+2*_+%_TTnK+wdwH_@d-=^77iT}N`+fU= z#h+8*S9-&gF3Ru!b9!Q1TWzvfy>3+e?!?3W{pyobXA0zde87|*{wZ4cV2sVy=&U4Rl%;lzNfA8 zNaBtmu z_C7Zf!d~@3c?jLt%FfcH5%$j}es4N2mgM{VehisCQOU&fMI~Lq1(0)?1 zvwoLoYt3EI05sp$JsS;k_JnSYS-<|UVNGmLl}^$|d+DM|z3=C*$B8m97)*)K`L=lB zwBz}qiVO@42d=8NMIT(FS@V_WcXjn@E=C3hw=s`dl_t}*^VP|0YQ8c-bNu*xE><*Wz zD)%I3-Sz9=zuZ;$v}WhFZI?D(ykY>EIkCKzyhAkaNTt+TjXBR}*Y3UBu~F`A#8>TT zc~=Go`A|<6$B-}Y^kuSse#yLi%YAb#1H*&vS+i#!=iOR!L#@zz+M8_2ten8>-$if8xT%R3U$U$q9`^a6C!05l;ZssNs9m;;(>fX$yw zTOsvM#&sdvV-|4W6*4JtyWKq+>z)OQc<{W6z~Xn0`0kq=-n)~5f#E?FWM)MYWRf1r z%nm3huR$ho_!e~k<~52DF9R9U1qs6s3i|K>TYS^8w$}f8hMl|794U5}g<0^aCy0F76Ucww*KY-rrVd-T8L8QNJ^`fhI%(i;F++SU63+ z?e>95s=uS$f*q2RZ&=Ja-!5N-_9ofnx4b9s_TLh2Nn5UaD~j|bZpk|m z!Jl26gLC%EQ5ZD4^57cCZ+q{Wf)d-)Gm`~b6nS4fIv3vM_l1Gs!1bvxKY@~(s4yrn zcH9Bk{B|8E7|IO5DXLzeQ}5m4w|8o_t?FOv@i8zQI4jcG;Ae6N=Y&l9@mE(L9{&A~ z`{bfUAO73@uhDqQ~v@sz-00+Q;wuGPSV&v-#Qo z-{b!rjsK(5BJl5P{QuHeqnSFtKHJy-|2#eKNL~K6M~}|!0gbS&T$7{OcYO20&6~H? z-{04MzO?KbAJ01B?x%;&%$$APZ_bb1hDVRi{ds$v?d7s>Z)9uZx9zR45su#V4*$Ys&nhmi3f1?qC{Bxl4Etuijy?UgaC5BPz4X_w4lO$_$L+l>hqL(G zJKm#v_ikUT!ocvrXr80|p;J@$%fts28P;E4r|w_>jMsjX+J;3Uso0S zyS+w6sPkWi@7c~tkB^IkhVgyRetabGXlLzjIm_$!>{Mr-KH7HshopomO-mm+5)!^lij{>LD^4%jD7!IVed|9oboqb+kbLR|; ziVp|ti__2fytXc1r&#&mz^!kK7M=TZ>XbjX6UV}ZiT7vRy7lamZS}ReH+PrER%gFn zbI(WZ|EiU1_x*b@W3swhd~!OWn&nK~o!l|Ej(` zc=LBtQ;N;xlb{aj!{F!Uckb-W4}bP_Y4Y8>SDBsHme;Sne*A37(+YKOFQ+;!(ML^| z3=A%ADf1oApZ7nu|MT4aGk={_KW&wjZLg`RxpT(-`|)!uYkur2-WXwKmVNDaXlrY2 z<=(xbD{Ftt{d;5fabt2c_p`INLu|`(q678BPnVWl`TqXy?sqx<{;9h_K6358cKzLr zk0sF{-&EKL*H?cySU+oy&$Ok|(*IvvKK=dv)zHaRf4}}Odh=;M?>VjKPnUv*Su-y+ zZtCm%cyhA(^Y1+6Hb;+&3;+E2_hVn*$G^??-fE|fPNsM+Tk|I8V8QYK@&8}9%8QAL zeq9%{vnbnac5nXueYLLj_4S3BnVHX<`R#uEdvkO1Z6}U}D^_UN=U-g(_3^4zQC&$J zV_v*i@&5ky_Y=Q?8pBU-&o_B_VaByF2Fh{fzq|fN`{Mg=-@RKWk+sKphOE<$e;@PK?7H&#!_WP{RvTph|M%g``Fgo||La%p z=jz^;&p-dn9Lb{pANcS8{n%gs=QRE)t*>9ci2V6`|Nr0pvyIcw-3wmsXUY@)`GM)I zvuVle_k22aYT2@7Gk3=5tzWe0(Vgx4|Gqt2ey8yG&WGoO85nBjy4JDn1*PD{?(cVQ zsL#D^ocs50@+HuWrgic$_NncBwgq{|`#wy59O@M2-hKP_@^9zn{w^!Enb&!C=4ZcDM@OT5)!&oT+t)q1 z)bp!}RXS_e?$zw)=FGe%?!@u*>04H2=A$!z*T4HMFDzgEX8rq$7YqN}Ri2u1H#Pp- z&!(n*6@JRjJS#QPHeEk25#r^B__4M9V{{Q>^{r#QA&o@=S-}}AU zU9R%U*$AC!)vwoX-)Fkx-=(GNuS}a3=kw;qNA}#?+wCuhMckOZz2>KP>Gb@~TfR6g z+Vdyp;l||d-Sti!iLbA{-)d@p|LR0P@s#@&kM;ZB-uZcD=E2g}uk7?}OS9^(yUX9L zP2BOh+BR9tiNkx^9;thj zr(2J9U+>S(o_(?Q*OxDe^Og5cd;R!R@%EaZpJdIe_k{2LTc+WocDVlE>HR$Y{~w9Z zUt3-A@6U#U+uJte+}t#GWr)`M>-+zGUHq}a<~OKG{RcEvJkLkXJFfES)ZhB||7}b@ zzAV=Jtp2_qkGA*8+uOa}_xoLa_4}90=hvCq+t)vMIz2vax{sRj?^Z?7AnL^b{EwC` z3l#^oXoa0PK31sd#Q$6U(Y$^!-K!PHI{qxHLfrF;ZULs@{v$X;E!`;=QON8&nY(5!sj z!{YN&{C3;_Jw0ERzFx|Oy}$n7p9_=DrX|0=zP`TX=clK)r|U+S>9hz~Sy}Pr+}%}r zc4QSOB_LC zC@x6~c0Zyvh-&{^yKd2=97m;zXSg4JUT85>=d_IFr?thOpXWuwn@%CHw z>FK$z>fdg!uh_I>hp}Puv1uDuhwY8{|Lt~tRaU`%(4d~(zly6z1)MDE>n`1V^(xpk zc=JQk%TvmBo~)Tc7*S-j@94-QE7Va(|2x zG%71s-q;!=zu$gY{lwmKB}0MpDW8nZtM+i~alb)KRG`dL+z=HnjElRM{ycd{_LiMH zD`WJgcjw>Q@^Yc?Y_rr*V%?-vX^kaF@SZYX}++Zad;=Yb*Nl(4l*Kw6|ZrA3q5^?Q`$^-E;Hi z&+l0tbeMhL#H_ryd!Thd>6ex?FEuqi-aTEfcI&#mwfXnksxnYr|$ccet2(tt;*LeTh6?kXJ4P}>*yH2XVa#o71!4t_ir!Aj9I@l`0tsS zy;DC{SZxE1Z%xDRAcb??{zeODeo&mht1x%K-!#`(|B&0Xyl{e4&I>$vr6*S_8JCp|Sab^Fr8 zwhRm|M|msR_O4%V6C3#Ps9QRy27CJSsq(Cyy9Ln)lZ$p%=wXf~i-?x0f~LJco!%B2 zeLLpQjpX`T_xj48GxcSzKk&)+_rK~8diCU^)6=I;i}U&Nb?Vafe|+NOU9F~SoeK%u zCc^t~&5j>Qixw;}FZ`JFcEi~VZi_Z-P=CK}cibvny?rw>vZ5~jeAs^9w)VvZ=C{+O zww0=Y8?pH}XBwBsgqweyIOl%$)r*Gv?5B6Pc6D8DZH{j#DG#q-4jwDtbN64>E6dWX zIDa!~es1x7fs_5jQ=+5OzqScDg@>1F+3&ZHi>v##Ir7(@JzqlmpB`vzKezYqH-7)P zfBxm=UmdD{U%9va{=bJO_wDP_@A(M|>&I#R<-x(hxmr`TqBf_UJ$G`ldij&5Pg8?e zURkm4%50-luWB8!)Ad`oZM$~m`t@?Yf5EY_cY~v%s+{Zi85ka{e${qnfw}qp(vP5t z_x(jr^l>TX-1uQZf*|#eXQ3ytmgUL+sF3( z|0loo3;CnL^>&ca;Qd+Q-#|+aryBpdnPW5kt99dHxVAz-L-4iy4N@L7#M0~?@W;V zvTa-a%)Pg_+ux3gxG^_k)03^YmU_pp)z*1)_V%u?yVq_`JG*OLL4hqOiGF`u{UfLH z=gdP-Psgv4xBvHHhOoL=JkP^RuXnuLQ=IMU>Kc9V-(UW%?E;5DMbt*nI)sXkueXNV zNzXg^Hw%cxS{6la~i(lb<4!Z`Oalar4@>$h+nDcILjBWokd$BK6d~Ps;9L^Y?#wwGA;+yYA}5YsH_Q z99rl7fA@pphxy0*miwn~{&?ro()HKQ&i)?eTU~wlzomZsC5;4@bu#ZCuIs*nLw z=;+&f)6UK+KR4e#eskU5U+-%^om9V^es)%=LW=;X4Oss~`&rv3P;(K_2<(H|c{d`@ zSHC}N+MCAS+ne~f;5Bqf?R^&WM>hAW-=9AozbC@F;K2ds_?h2*{paneKeNa+zwh_k z{Qr+XYR3nfM|HZ?|M{fvE+zG?H*!lx?b|k9d%Jl))9UYTy2ly5D{#NDb8q?MXE(Me z+Rr)t_j3Vg)$=-E9kJgR15PX7KRQ=B{qwWuQSI^CQL9$@iJF?~zTa^XG%@{d_xpIY zZClU202N;4nJ-)a%rur>trs)nM!EIjpS@o~W%3yqey9mw=-jfm`uf)UYjWjne!Tq# zQuJ;|a=EJ&Xo$Q#FRAGMzV~;w{AFZd;Bj?$F1>nfu3LQc?Vf43W7!!P95}WsEU4Zm z!@$7MR_?rO2WSQGV&%z#ERvH;%)bfz`TzD{BWMMAgF^jlQMMJE3(e&@#2L0RxL-Rh Tx7_FY4Un9ttDnm{r-UW|#t*{M delta 12101 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