From 00b38c8fddbf11e955f00928e7d985c4df4a9449 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Mon, 9 Sep 2024 16:10:52 -0400 Subject: [PATCH 01/11] chore: bump flutter/dart min sdk constraints --- lib/src/alchemist_config.dart | 51 +++++++------------ lib/src/golden_test_adapter.dart | 4 +- lib/src/golden_test_group.dart | 4 +- lib/src/golden_test_scenario.dart | 18 +++---- lib/src/golden_test_scenario_constraints.dart | 6 +-- lib/src/utilities.dart | 3 +- pubspec.yaml | 4 +- .../composited_transform_smoke_test.dart | 4 +- test/smoke_tests/dropdown_smoke_test.dart | 2 +- .../smoke_tests/render_object_smoke_test.dart | 2 +- test/smoke_tests/timer_button_smoke_test.dart | 2 +- test/src/golden_test_scenario_test.dart | 6 +-- 12 files changed, 45 insertions(+), 61 deletions(-) diff --git a/lib/src/alchemist_config.dart b/lib/src/alchemist_config.dart index 7fa4a9e..0d66894 100644 --- a/lib/src/alchemist_config.dart +++ b/lib/src/alchemist_config.dart @@ -249,12 +249,12 @@ class AlchemistConfig extends Equatable { /// The [enabled] flag determines whether or not these golden tests are /// enabled. If set to `false`, these tests will not be generated or compared. /// Otherwise the tests will function as normal. -/// {@endtemplate goldens_config_enabled} +/// {@endtemplate} /// /// {@template goldens_config_file_path_resolver} /// The [filePathResolver] can be used to customize the name and of the golden /// file. -/// {@endtemplate goldens_config_file_path_resolver} +/// {@endtemplate} /// /// {@template goldens_config_theme} /// If a [theme] is provided, it will be assigned to the [MaterialApp] created @@ -266,14 +266,14 @@ class AlchemistConfig extends Equatable { /// **Note:** when [obscureText] is true, tests are always rendered /// in the "Ahem" font family to ensure consistent results across platforms. /// In other words, the font family of the [theme] will be ignored. -/// {@endtemplate goldens_config_theme} +/// {@endtemplate} /// /// {@template goldens_config_render_shadows} /// The [renderShadows] flag determines whether or not shadows are rendered in /// golden tests. /// If set to `false`, all shadows are replaced with solid color blocks. -/// {@endtemplate goldens_config_render_shadows} -/// {@endtemplate goldens_config} +/// {@endtemplate} +/// {@endtemplate} abstract class GoldensConfig extends Equatable { /// {@macro goldens_config} const GoldensConfig({ @@ -379,24 +379,17 @@ abstract class GoldensConfig extends Equatable { /// By default, [renderShadows] is set to true so platform golden images are a /// more accurate representation of the tested widget. /// -/// {@endtemplate platform_goldens_config} +/// {@endtemplate} class PlatformGoldensConfig extends GoldensConfig { /// {@macro platform_goldens_config} const PlatformGoldensConfig({ Set? platforms, - bool enabled = true, - bool obscureText = false, - bool renderShadows = true, - FilePathResolver? filePathResolver, - ThemeData? theme, - }) : _platforms = platforms, - super( - enabled: enabled, - obscureText: obscureText, - renderShadows: renderShadows, - filePathResolver: filePathResolver, - theme: theme, - ); + super.enabled = true, + super.obscureText = false, + super.renderShadows = true, + super.filePathResolver, + super.theme, + }) : _platforms = platforms; @override String get environmentName => HostPlatform.current().operatingSystem; @@ -474,22 +467,16 @@ class PlatformGoldensConfig extends GoldensConfig { /// {@macro goldens_config_render_shadows} /// By default, [renderShadows] is set to false to make CI tests more stable. /// -/// {@endtemplate ci_goldens_config} +/// {@endtemplate} class CiGoldensConfig extends GoldensConfig { /// {@macro ci_goldens_config} const CiGoldensConfig({ - bool enabled = true, - bool obscureText = true, - bool renderShadows = false, - FilePathResolver? filePathResolver, - ThemeData? theme, - }) : super( - enabled: enabled, - obscureText: obscureText, - renderShadows: renderShadows, - filePathResolver: filePathResolver, - theme: theme, - ); + super.enabled = true, + super.obscureText = true, + super.renderShadows = false, + super.filePathResolver, + super.theme, + }); @override String get environmentName => 'CI'; diff --git a/lib/src/golden_test_adapter.dart b/lib/src/golden_test_adapter.dart index 6465e3e..43c1b1a 100644 --- a/lib/src/golden_test_adapter.dart +++ b/lib/src/golden_test_adapter.dart @@ -317,12 +317,12 @@ class FlutterGoldenTestAdapter extends GoldenTestAdapter { class FlutterGoldenTestWrapper extends StatelessWidget { /// {@macro _flutter_golden_test_wrapper} const FlutterGoldenTestWrapper({ - Key? key, + super.key, this.globalConfigTheme, this.variantConfigTheme, this.obscureFont = false, required this.child, - }) : super(key: key); + }); /// The theme provided by the global [AlchemistConfig], if any. /// diff --git a/lib/src/golden_test_group.dart b/lib/src/golden_test_group.dart index 6d73db6..25c6281 100644 --- a/lib/src/golden_test_group.dart +++ b/lib/src/golden_test_group.dart @@ -44,12 +44,12 @@ typedef ColumnWidthBuilder = TableColumnWidth? Function(int columns); class GoldenTestGroup extends StatelessWidget { /// {@macro golden_test_group} const GoldenTestGroup({ - Key? key, + super.key, this.columns, this.columnWidthBuilder, this.scenarioConstraints, required this.children, - }) : super(key: key); + }); /// The number of columns in the grid. /// diff --git a/lib/src/golden_test_scenario.dart b/lib/src/golden_test_scenario.dart index e23a513..0b8af8a 100644 --- a/lib/src/golden_test_scenario.dart +++ b/lib/src/golden_test_scenario.dart @@ -23,37 +23,35 @@ WidgetBuilder _build(Widget build) => (context) => build; class GoldenTestScenario extends StatelessWidget { /// {@macro golden_test_scenario} GoldenTestScenario({ - Key? key, + super.key, required this.name, required Widget child, this.constraints, - }) : builder = _build(child), - super(key: key); + }) : builder = _build(child); /// Creates a [GoldenTestScenario] with a [builder] function that allows /// access to the [BuildContext] of the widget. const GoldenTestScenario.builder({ - Key? key, + super.key, required this.name, required this.builder, this.constraints, - }) : super(key: key); + }); /// Creates a [GoldenTestScenario] with a custom [textScaleFactor] that /// applies a default scale of text to its child. GoldenTestScenario.withTextScaleFactor({ - Key? key, + super.key, required this.name, required double textScaleFactor, required Widget child, this.constraints, - }) : builder = _build( + }) : builder = _build( _CustomTextScaleFactor( textScaleFactor: textScaleFactor, child: child, ), - ), - super(key: key); + ); /// The name of the scenario. /// @@ -121,7 +119,7 @@ class _CustomTextScaleFactor extends StatelessWidget { Widget build(BuildContext context) { return MediaQuery( data: MediaQuery.of(context).copyWith( - textScaleFactor: textScaleFactor, + textScaler: TextScaler.linear(textScaleFactor), ), child: child, ); diff --git a/lib/src/golden_test_scenario_constraints.dart b/lib/src/golden_test_scenario_constraints.dart index 384c946..f8c4a3c 100644 --- a/lib/src/golden_test_scenario_constraints.dart +++ b/lib/src/golden_test_scenario_constraints.dart @@ -8,10 +8,10 @@ import 'package:flutter/material.dart'; class GoldenTestScenarioConstraints extends InheritedWidget { /// {@macro golden_test_scenario_constraints} const GoldenTestScenarioConstraints({ - Key? key, - required Widget child, + super.key, + required super.child, required this.constraints, - }) : super(key: key, child: child); + }); /// The constraints to apply to the scenario's child. final BoxConstraints? constraints; diff --git a/lib/src/utilities.dart b/lib/src/utilities.dart index 324e763..f81eb3d 100644 --- a/lib/src/utilities.dart +++ b/lib/src/utilities.dart @@ -80,7 +80,8 @@ extension GoldenTestThemeDataExtensions on ThemeData { static const obscuredTextFontFamily = 'Ahem'; /// Strips all text packages from this theme's [ThemeData.textTheme] for use - /// in golden tests using [GoldenTestTextStyleExtensions.stripAlchemistPackage]. + /// in golden tests using + /// [GoldenTestTextStyleExtensions.stripAlchemistPackage]. /// /// Only used internally and should not be used by consumers. @protected diff --git a/pubspec.yaml b/pubspec.yaml index bfdc0ec..393a0db 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,8 +6,8 @@ homepage: https://github.com/Betterment/alchemist repository: https://github.com/Betterment/alchemist environment: - sdk: ">=3.0.1 <4.0.0" - flutter: ">=3.13.0" + sdk: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" dependencies: equatable: ^2.0.3 diff --git a/test/smoke_tests/composited_transform_smoke_test.dart b/test/smoke_tests/composited_transform_smoke_test.dart index ff6e66c..788da9b 100644 --- a/test/smoke_tests/composited_transform_smoke_test.dart +++ b/test/smoke_tests/composited_transform_smoke_test.dart @@ -3,9 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; class _SmokeTest extends StatelessWidget { - _SmokeTest({Key? key}) - : _link = LayerLink(), - super(key: key); + _SmokeTest({super.key}) : _link = LayerLink(); final LayerLink _link; diff --git a/test/smoke_tests/dropdown_smoke_test.dart b/test/smoke_tests/dropdown_smoke_test.dart index 1bb3316..fee6a90 100644 --- a/test/smoke_tests/dropdown_smoke_test.dart +++ b/test/smoke_tests/dropdown_smoke_test.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; class TestDropdownButton extends StatelessWidget { - const TestDropdownButton({Key? key}) : super(key: key); + const TestDropdownButton({super.key}); @override Widget build(BuildContext context) => Center( diff --git a/test/smoke_tests/render_object_smoke_test.dart b/test/smoke_tests/render_object_smoke_test.dart index 983fdc3..07c398f 100644 --- a/test/smoke_tests/render_object_smoke_test.dart +++ b/test/smoke_tests/render_object_smoke_test.dart @@ -17,7 +17,7 @@ void main() { } class _CustomExampleRenderObject extends LeafRenderObjectWidget { - const _CustomExampleRenderObject({Key? key}) : super(key: key); + const _CustomExampleRenderObject(); @override _CustomExampleRenderBox createRenderObject(BuildContext context) { diff --git a/test/smoke_tests/timer_button_smoke_test.dart b/test/smoke_tests/timer_button_smoke_test.dart index 42f10ac..ae75248 100644 --- a/test/smoke_tests/timer_button_smoke_test.dart +++ b/test/smoke_tests/timer_button_smoke_test.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; class TimerButton extends StatelessWidget { - const TimerButton({Key? key}) : super(key: key); + const TimerButton({super.key}); @override Widget build(BuildContext context) { diff --git a/test/src/golden_test_scenario_test.dart b/test/src/golden_test_scenario_test.dart index f681308..4046e40 100644 --- a/test/src/golden_test_scenario_test.dart +++ b/test/src/golden_test_scenario_test.dart @@ -151,9 +151,9 @@ void main() { expect( mediaQuery, isA().having( - (m) => m.textScaleFactor, - 'textScaleFactor', - 2.0, + (m) => m.textScaler, + 'textScalar', + const TextScaler.linear(2), ), ); }, From 0dc81804f0015de08bc986c1c620a46cc98d2766 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Mon, 9 Sep 2024 16:58:29 -0400 Subject: [PATCH 02/11] chore: bump workflow flutter version --- .github/workflows/main.yaml | 4 ++-- .github/workflows/post_merge.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 53548a1..3d5b205 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -11,7 +11,7 @@ jobs: - uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.16.0' channel: 'stable' cache: true @@ -39,7 +39,7 @@ jobs: - uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.16.0' channel: 'stable' cache: true diff --git a/.github/workflows/post_merge.yaml b/.github/workflows/post_merge.yaml index 6ebba3a..4906aa7 100644 --- a/.github/workflows/post_merge.yaml +++ b/.github/workflows/post_merge.yaml @@ -14,7 +14,7 @@ jobs: - uses: subosito/flutter-action@v2 with: - flutter-version: 3.13.0 + flutter-version: '3.16.0' cache: true - name: Install Dependencies From 67c572f3ad1394e1b90e803bd8004902cb1a2bae Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Mon, 9 Sep 2024 17:19:48 -0400 Subject: [PATCH 03/11] upload failures --- .github/workflows/main.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 3d5b205..83db80c 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -27,6 +27,13 @@ jobs: - name: Run tests run: flutter test --no-pub --coverage --test-randomize-ordering-seed=random + - name: Upload failures + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 + with: + name: "golden_failures" + path: | + **/failures/**/*.png + - uses: codecov/codecov-action@v2 with: files: coverage/lcov.info From e8ebe81961a745ce8beaa0197f77312866c6df01 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Mon, 9 Sep 2024 17:29:35 -0400 Subject: [PATCH 04/11] run upload during failure events --- .github/workflows/main.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 83db80c..3c512bc 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -28,6 +28,7 @@ jobs: run: flutter test --no-pub --coverage --test-randomize-ordering-seed=random - name: Upload failures + if: failure() uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: name: "golden_failures" From 14528e8a7e6372dff76bfe2750c9d3cbeb69ec83 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 10:05:59 -0400 Subject: [PATCH 05/11] for now, disable use of material 3 in goldens --- test/flutter_test_config.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/test/flutter_test_config.dart b/test/flutter_test_config.dart index 8297de2..5768c75 100644 --- a/test/flutter_test_config.dart +++ b/test/flutter_test_config.dart @@ -11,6 +11,7 @@ Future testExecutable(FutureOr Function() testMain) async { return AlchemistConfig.runWithConfig( config: AlchemistConfig( theme: ThemeData( + useMaterial3: false, textTheme: const TextTheme().apply(fontFamily: 'Roboto'), ), platformGoldensConfig: From dd9e5bf7ab86f52ce7e86137ebab3458ec02c100 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 10:32:52 -0400 Subject: [PATCH 06/11] Update test/src/golden_test_scenario_test.dart Co-authored-by: Jeroen Meijer (Jay) --- test/src/golden_test_scenario_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/golden_test_scenario_test.dart b/test/src/golden_test_scenario_test.dart index 4046e40..39392c6 100644 --- a/test/src/golden_test_scenario_test.dart +++ b/test/src/golden_test_scenario_test.dart @@ -152,7 +152,7 @@ void main() { mediaQuery, isA().having( (m) => m.textScaler, - 'textScalar', + 'textScaler', const TextScaler.linear(2), ), ); From d1eddc9deb492e00a40c279c623bec1421f05c22 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 13:10:45 -0400 Subject: [PATCH 07/11] fix utilities test --- test/src/utilities_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/utilities_test.dart b/test/src/utilities_test.dart index 8198b6c..7101f68 100644 --- a/test/src/utilities_test.dart +++ b/test/src/utilities_test.dart @@ -50,7 +50,7 @@ void main() { printLogs, [ ''' -No widgets found that match finder: zero widgets with text "does not exist" (ignoring offstage widgets). +No widgets found that match finder: Found 0 widgets with text "does not exist": []. No gestures will be performed. If this is intentional, consider not calling this method From ac81d123d5e2a7c7cfd0b6088c806b95a4381ffb Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 14:18:58 -0400 Subject: [PATCH 08/11] update workflow flutter version --- .github/workflows/update_goldens.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_goldens.yaml b/.github/workflows/update_goldens.yaml index c143a41..5404364 100644 --- a/.github/workflows/update_goldens.yaml +++ b/.github/workflows/update_goldens.yaml @@ -43,7 +43,7 @@ jobs: - uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.16.0' channel: 'stable' cache: true From 0711fe219bfb1aedda68b8db5b285dc28a2f7bca Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 14:25:41 -0400 Subject: [PATCH 09/11] Re-run CI From 6edabca673ab686e65a995f9d16ecafb7d10adb1 Mon Sep 17 00:00:00 2001 From: btrautmann Date: Tue, 10 Sep 2024 18:29:59 +0000 Subject: [PATCH 10/11] chore: Updating Goldens --- .../ci/composited_transform_smoke_test.png | Bin 578 -> 580 bytes .../goldens/ci/dropdown_smoke_test.png | Bin 1202 -> 1209 bytes .../interactions_smoke_test_long_pressed.png | Bin 1247 -> 1257 bytes .../ci/interactions_smoke_test_pressed.png | Bin 1941 -> 1979 bytes .../ci/interactions_smoke_test_regular.png | Bin 1247 -> 1257 bytes .../ci/render_object_text_smoke_test.png | Bin 1670 -> 1672 bytes .../goldens/ci/timer_button_smoke_test.png | Bin 746 -> 742 bytes test/src/blocked_text_image_reference.png | Bin 462 -> 467 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/smoke_tests/goldens/ci/composited_transform_smoke_test.png b/test/smoke_tests/goldens/ci/composited_transform_smoke_test.png index dc5f63df89812045665501417eec36b0542eb0c8..7f6459c0816d3c04747942ed2c6c06f0ff6921ed 100644 GIT binary patch delta 526 zcmV+p0`dLA1jGc8L4WQ^L_t(&f$iB%OB+EPfbnN`cdWe#Qf#0IzJQP(TRhrBp{Mp# z`W^fhJ^2OvB+1G4)`B8b6JJVg8c3^`_MpcU1hdJG2UAQmX3g%5P2B%;%r4p8-%chw ztXkbZGf39+{`U#o*96v40_!M&b(Fw5N?;u&u#O7ic363vzkiGK7`fgTt9`e}!X_yK znl~&v0+o%QiFMcr2o3ad)fqtr%hwr)>f1cnkY^26P`k4NE2!5?4J)X3mnz)Stn`>Xvj1HfJ*X~wr-%( zG|c;o$L(8l9Df=<)FWmdD#r9By#f|G_RC6%E_Xt~qV7grt4A~p)J_eJ@Zw%6AfG{0 zNHOL8o1A~QQNxaLUpqB4LqpzIJjx&{IQ%a;`tpr~@`016-;Zzn+dOL)CT1} zDy4nCYacK0dGY*d+QW=oRz_^DjXQ=R*xI4G^Oe@Prhlb<3ZF}C?Dc<*aUZib738$y zW$Q1sUq5M%Ym9gKWKj6D&HC;STZbBntj@8sxk;Aaz2bqsKEo6AevKq&|?Il*-genB1vk@Cc85>asSUTyJUBNJDKdT z>eKFDgJeDLf1ki(O<)}*u#OT~M+vN>1lCak>!=`ZhmY?H4}WnUBiD!ZV$bcdut}-| z(LKwKKxN}+VjZ>)ga*2~>WrX*73sGV7X71X<>h85KArGgdI`%4Tf zsJ%-BE2!}e3@fPpHP8Z~UsPFnSz3Ahiz+Lx0k6}efuq_!Ye%gCRhcFLP)Xj>Rt%g( zhB;p`-Mlpyp?_hsQs?=kVobN_74WiczpRw#a&rn^=}y#*N}Z~K(zT%)Htv-I3K>L& z6jR>q$C$OLAg>im zwJS>JXG9Yk$a8G3(U?uwSCB;%L%NMou&JOC$NqZSVsx0qXgDb0_!M&b(Fw5>IQfDpo12QgpvRN O002ovP6b4+LSTYaCkZqF diff --git a/test/smoke_tests/goldens/ci/dropdown_smoke_test.png b/test/smoke_tests/goldens/ci/dropdown_smoke_test.png index 0307788b8562f1908ba34892f2aca1512e07f33e..010f875f0829c8700d667578d499ab8af760ad74 100644 GIT binary patch literal 1209 zcmeAS@N?(olHy`uVBq!ia0vp^CxG}D2OE%l@`}R(NHG=%xjQkeJ16rJ$YCjV@(kes zf*OvL4j?z#)5S5QV$R#Uj@cpM5)BU*Pd+kZh6Io9meqP(n?R#n5wzZE9O&fmW)nH=1qceRB8d z(<{n3J-%_LZ?ZAXcUBN!VM@H#_^0~c_bbYGD#WGtwQc5mQqyc-yHjg6h@CPS&SbH3 z1u1vLL!|xR8?ib{Z@PBu|2H=`uQ%a*oxt9xAi%*yfOueYqHE6c8#!f!l@ehZOvya{ zO^cou?Y#7Lo_^8Zn~n+`EKLps2n+sAO3y9LX3G**N`z@JCC{7JWbBMtSF-nccT7HU zemvK_=0s)R*)%-C_n>~`4<&wiyFV|!=GWWJ&6u=WQDEPRhYufKQI659PjVFCXo+P1 zRM+$I)t8)ChIwl&*W6vhEScQn?jLvNkz0N4dcX6>7OU$olS_V^_FwJq%g>WPe))M) zBDrUO+&&3ls!^NwqAEJ)ZO`NP^)sq^w2gnuK5_p2z5jSpcKR#Bb!(4aJ9lG$z0FsN z@T_mvC)&%t^B;Tn@8Ff>g5EP_?2$P??|#^t^C{|_*@WHf?vKAE73aSR-MROMR5^bi z(8k=f-@=6U?s{y83>BRK%{8xh4(zaQ1)bvHNZ@O`BUR8^9{^jch*Bal*+THje zy~nTn?c0szKN4OUUd!6{-tm~k<8$}+7N)O6?>zMA#T-tud|ZSwwY51+q($D{uJ*t{oY6~Df`bYK79;$P|#&uz)utWR8h z`upLZH(x(oHrFm(17a1F{;YdrXqL9EF=kJ-b$maHG0{;w#|GjcCM4xF-lL~&&Vp0_J420>nOeH*|Gm09qnFk!Z|yEeX=5x3g-ix z6SL+#pJ8S_aicHadG^T5MLT0&SDhE%dGifaGZ*I^_Q=VfWiF?IbeIACE5`far$RQ^ zwD&)i%qLG|Qs?-rkX(e`E&8){(|hYiEq>7PfSizU}qZt0#o-=5){9`|!(ed7z@~wEfLBFFrhcx#7l5>FOTo?2VhvW$fy0WUG7D z&ic#uY2n|)ixdBU$arJ8!!d1lvrgHcydP2EpnUT0;>m(?!@JVEb<4%A5C2^}dE@aL zGj9HCdGl7D$Gv|a&;-vLx9ugWTY6`{^IvJ20VxNHna1Ah~)l*yk@Uu5s|n13K=fXqfB|=iVc+g>~|J-MD| z{Jyo<>;61^;Lr2$=EtA^zjAQ!UOfN+5~-FR008h;0tEm_N0UJT7!HA1?)J!VjQ()7 z^bCMMlQ9DvAOs2kkj|WDzu>^mu2$>-X3)Olmz(;$-#IW{&HnE=L6a^6ACoQtE*YsD z9K2UAJpw4__Q-HlD%I#*vZC}9fCrqDK>;9tbDI5v13SA~u_LX0$1j(j006U&6BGa- z9f1M>q$5xOfOML^2L+fN2KzpV@4oDdk&A;-8@*Y24%5)lxj2@tULR{V?}&9AZms*T==^8+X1{J@Dgck*bw{?6fOU$C(BENDoe01X{~ z-rEz`hrWt=-LFQ+mbc^a#jB#))=_#E(=ahsi{EZsirVRSWB6=;9NG6q?D?R-^ekw| zJt)AG&V2Uq{Ww{>Ef)12i@D1;ij)7KYFkIlUA{3E^&X3PYq!Ofa|3bioI<(7E!50we88$b7+z3-1dmLf8#7q~lTdz>NF8_leRI{#Twobf@$Lm~l>%VFMJA&k2){1Pqfd0TK+y+l+x3 z=k2?|bU8tjE(08YfQPD7D$&+HKcZfbiLqZw&!I&o#(#~7h>p&u3on7j1PU;vWvkam zM8xku4HsTQt4vg;(P4P+#0Sv@6E1or#IDTIpF#)5KUU#;=`;TZeXk#oeL4=-#wFx;DOCdKNU~ zQTISYJ^Me3Bl~y9mBIeFd!fJd9GcX%;iY(O?}w#lz&{cwKtt^d7RH|UPsP`#K8^DO zCt~E{VAMu$mY&5lbaXC`W!)R1d(-w`dIG@TI6;#x10NRt0AS3!`lTR* QHvj+t07*qoM6N<$g57D&oB#j- delta 930 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 QHvj+t07*qoM6N<$g57D&oB#j- delta 930 zcmaFKd7pEFV|}Nmi(^Q|oVR!VGp?7)9RIleu+!3QC+?ilQ1%oz={4BmoZ&JlVJ5q_ zi^_{7$9K6HEV2=o>$>}EdFjUoTo)fMysBE_WuP0>ep1Cq-O*lfIqUDz4o=bi`RnfI z*WBBB{P8|{{T~}XJ~>>z|NWX+=j*Q+876o{zhq=!s84bG=7y zym)!ZnBkwx!~+tO7cg>2Z=U_PVeaf*(Hog(xb6MzXZH1T-TB6qS>N9GNl!LpmY=N6 ztO~@OQgb7Bx2?PC-Oq4J(%M`oaJ~EUM@yG3XNY;uHaUP%zJBK2H|%fjT)EpNoB8#f zbz~J2!x@V_u-#k?6Z#w&87^i1k`zfuv#5IT*y7{Ubi-d~C$5OKiLc@dzOeDZxrjdx zRz>V9OI{PRf9V&Q9g0k>D@tBI=ia!xJi15b_o6Q%|CZi5`nj-XgMAdDPDZ+6PIPIoYEWHQ-O^Y&Q8 zuM>|8Q!DCYUfh-mKQGhQ`7sI@tQUd7x^AAOjQB6J<5M60y}0?=%la2_e^XvY2AmAP z%RF`4zMqM2D*qm}ur(0~_v4u|&w28+wN*;<>esIS!t=u&7{gcW_G_2zDK_Yn{i6bk z))(8I19w;K`=YaKLGr;xJGQ5Xepyqg7Pb!Pd%impaHT&I^D$gb$9l#`=j(mg?GN<~ z_zND9;b98K={7I*2msc{1GCWtp8>O=1ULZ}@dlEv59K8mj9mZ#002ovPDHLkV1fv( BJ%#`P delta 144 zcmV;B0B`?@4TcSnK{_x=L_t(|obA^!4Z;8bMA4R@0|Cq^!vYBC-US&LV5y@{MFAV( zlk`0WxBc8WE$cP_z>gj30RZfivk?IX0+H~P8N{(30N?VQZ^LuG*E2pkoiD@n@v3LQ y-|&+m0$~a2$MKh=VoJIw%(9?Ja0&j1$h3%30xK99 zgqH{jBEpV!j_404>JZ){`gQS;g_L;Ex`a*%){4q75u%a^nu%KltAp+EK76L&_v<(D z`MB=Q_J;41FWbKGDYzE@`A5J%p`aJQ|Aio65CjZ@fI$#22$RSH41W*=j1}`48h(6F z$!Cu=@oGq^ub=(i2_A}+mTOD(Zq+umYS)nybIup!d$=|AZBlnGw(I@KQ%{#fFrp0y zb@K8p6|Y_IoXH!+^)t;HPdryq&0$4aE@)MGl|qFPUzUYGvgwq5eR`u*-xbXydsSKA ztaCSdo%7D`5Q7hI&VR;G7gJeBm%kKo$`K5_$r%DDKj>x$wAIG%_MqMy+5X^y@#Cha~?W& z_tGhi#`}F)7K>}ahmPfpJh`uz1KpZ<9p_lWB_>i@uB|lK)~%_# zZFxqfLSE0f_~Ek{-#E5 zNvWzDf93OXnUAh62#U97-z!`rqIqx0TI$OE-JnvYHwm=gsqf;hjGnpH5|mUb?oj z=~Y@U-&gI6wYP2GS1I27?l5V~vX^WAM=Ocki&Xo)dyerrg=6k)s-D{3i|y98Zm3BA z`SC6H^B&`ln=h~2aj2VkK3h@eUS!(ur6>M_y^Qd&&WmS)*OF>7w0V9hPn-Hy_HyGs z`|!zk8O7_N0Rjvr!5??eEqH(KV0?@sa=1AjC}0cRvd?AG6iJj$r;sf$^!_4XFq~D{ zZF=+Ks+$`bQ!i=$-|n)&*XZSxwBu|hK*50{S{1&W#&uoHI(-w{L&>_Lc>UkIO+H#3Oy>M=Jn@lHZue2q)z*7{OkT&NEXp|B WeXeJzlkZaoAnSm5jI))Z+D2}LgR zzHa*j{I%1k7XTbj=nx=u2oO312ps~14go@kfb-~q`Qlx`>z3;>-EYgMm%)>YlYjv= z9T?7x+t=+K>i`a9M~48RL%{IpJ{kA?AAEwPsTh%<7?U6Y6q6kR2pfR$%s8{g;OE)V zAwcL5Fg&`?#y!K=8~ss9#gje(BnrdZYol8+!1uGGlMn$UlN|vUlN|vU8wec&gbo1@ XPmdI|!^-rR00000NkvXXu0mjfI~-vT delta 205 zcmV;;05bp61I`1GK~s21L_t(|obB8@4#F@HK*4~(_dl;G-~vdlAfGo=r*QMMPO-kt zIo}&_Y4^Pk0Q{cNAwcL5Aan>2Is^zE0)!3$kJSfbjDMViiLx9jBV0m>P9-e^1 zTfOaQqLJ|=2`snQR$DQ^@tKjZ9Fv{_Ad`>*E|ZV}5f*#^JaZO|^u0cR00000NkvXX Hu0mjfJg8TM From d650d5e449a615eea73ed901e95871df2bd27e47 Mon Sep 17 00:00:00 2001 From: Brandon Trautmann Date: Tue, 10 Sep 2024 14:32:13 -0400 Subject: [PATCH 11/11] Re-run CI