diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile
index 098e4d7..e625c7a 100644
--- a/.gitpod.Dockerfile
+++ b/.gitpod.Dockerfile
@@ -6,8 +6,8 @@
 # More information: https://www.gitpod.io/docs/config-docker/
 
 RUN sudo apt-get update && \
-    wget https://storage.googleapis.com/dart-archive/channels/stable/release/2.10.4/linux_packages/dart_2.10.4-1_amd64.deb && \
-    sudo dpkg -i dart_2.10.4-1_amd64.deb && \
+    wget https://storage.googleapis.com/dart-archive/channels/stable/release/2.12.0/linux_packages/dart_2.12.0-1_amd64.deb && \
+    sudo dpkg -i dart_2.12.0-1_amd64.deb && \
     sudo apt-get install -y protobuf-compiler redis && \
     sudo apt-get update && \
     echo "export PATH=\"\$PATH:/usr/lib/dart/bin:\$HOME/.pub-cache/bin\"" >> $HOME/.bashrc && \
diff --git a/Dockerfile b/Dockerfile
index 95ae9a6..9428743 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,4 @@
-# Keep aligned with min SDK in pubspec.yaml and .github/workflows/dart.yml.
-FROM google/dart:2.10.4
+FROM google/dart:2.12.0
 
 # We install unzip and remove the apt-index again to keep the
 # docker image diff small.
diff --git a/cloud_run.Dockerfile b/cloud_run.Dockerfile
index f27b257..55e165a 100644
--- a/cloud_run.Dockerfile
+++ b/cloud_run.Dockerfile
@@ -1,5 +1,4 @@
-# Keep aligned with min SDK in pubspec.yaml and Dart test version in .travis.yml
-FROM google/dart:2.10.4
+FROM google/dart:2.12.0
 
 # We install unzip and remove the apt-index again to keep the
 # docker image diff small.
diff --git a/flutter-sdk-version.yaml b/flutter-sdk-version.yaml
index 3d6cb38..4fbdfdd 100644
--- a/flutter-sdk-version.yaml
+++ b/flutter-sdk-version.yaml
@@ -12,4 +12,4 @@
 
 flutter_sdk:
   # channel: beta
-  version: 1.26.0-17.8.pre
+  version: 2.0.0
diff --git a/lib/src/protos/dart_services.pb.dart b/lib/src/protos/dart_services.pb.dart
index 2b930c3..6a9a2ee 100644
--- a/lib/src/protos/dart_services.pb.dart
+++ b/lib/src/protos/dart_services.pb.dart
@@ -2,7 +2,7 @@
 //  Generated code. Do not modify.
 //  source: protos/dart_services.proto
 //
-// @dart = 2.7
+// @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
 
 import 'dart:core' as $core;
@@ -10,32 +10,16 @@
 import 'package:protobuf/protobuf.dart' as $pb;
 
 class CompileRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CompileRequest',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'source')
-    ..aOB(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'returnSourceMap',
-        protoName: 'returnSourceMap')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
+    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'returnSourceMap', protoName: 'returnSourceMap')
+    ..hasRequiredFields = false
+  ;
 
   CompileRequest._() : super();
   factory CompileRequest({
-    $core.String source,
-    $core.bool returnSourceMap,
+    $core.String? source,
+    $core.bool? returnSourceMap,
   }) {
     final _result = create();
     if (source != null) {
@@ -46,40 +30,31 @@
     }
     return _result;
   }
-  factory CompileRequest.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CompileRequest.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CompileRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CompileRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CompileRequest clone() => CompileRequest()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CompileRequest copyWith(void Function(CompileRequest) updates) =>
-      super.copyWith((message) => updates(message as CompileRequest))
-          as CompileRequest; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CompileRequest copyWith(void Function(CompileRequest) updates) => super.copyWith((message) => updates(message as CompileRequest)) as CompileRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileRequest create() => CompileRequest._();
   CompileRequest createEmptyInstance() => create();
-  static $pb.PbList<CompileRequest> createRepeated() =>
-      $pb.PbList<CompileRequest>();
+  static $pb.PbList<CompileRequest> createRepeated() => $pb.PbList<CompileRequest>();
   @$core.pragma('dart2js:noInline')
-  static CompileRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CompileRequest>(create);
-  static CompileRequest _defaultInstance;
+  static CompileRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileRequest>(create);
+  static CompileRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) {
-    $_setString(0, v);
-  }
-
+  set source($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -88,10 +63,7 @@
   @$pb.TagNumber(2)
   $core.bool get returnSourceMap => $_getBF(1);
   @$pb.TagNumber(2)
-  set returnSourceMap($core.bool v) {
-    $_setBool(1, v);
-  }
-
+  set returnSourceMap($core.bool v) { $_setBool(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasReturnSourceMap() => $_has(1);
   @$pb.TagNumber(2)
@@ -99,25 +71,14 @@
 }
 
 class CompileDDCRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CompileDDCRequest',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'source')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileDDCRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
+    ..hasRequiredFields = false
+  ;
 
   CompileDDCRequest._() : super();
   factory CompileDDCRequest({
-    $core.String source,
+    $core.String? source,
   }) {
     final _result = create();
     if (source != null) {
@@ -125,40 +86,31 @@
     }
     return _result;
   }
-  factory CompileDDCRequest.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CompileDDCRequest.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CompileDDCRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CompileDDCRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CompileDDCRequest clone() => CompileDDCRequest()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CompileDDCRequest copyWith(void Function(CompileDDCRequest) updates) =>
-      super.copyWith((message) => updates(message as CompileDDCRequest))
-          as CompileDDCRequest; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CompileDDCRequest copyWith(void Function(CompileDDCRequest) updates) => super.copyWith((message) => updates(message as CompileDDCRequest)) as CompileDDCRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileDDCRequest create() => CompileDDCRequest._();
   CompileDDCRequest createEmptyInstance() => create();
-  static $pb.PbList<CompileDDCRequest> createRepeated() =>
-      $pb.PbList<CompileDDCRequest>();
+  static $pb.PbList<CompileDDCRequest> createRepeated() => $pb.PbList<CompileDDCRequest>();
   @$core.pragma('dart2js:noInline')
-  static CompileDDCRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CompileDDCRequest>(create);
-  static CompileDDCRequest _defaultInstance;
+  static CompileDDCRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileDDCRequest>(create);
+  static CompileDDCRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) {
-    $_setString(0, v);
-  }
-
+  set source($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -166,32 +118,16 @@
 }
 
 class SourceRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'SourceRequest',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'source')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'offset',
-        $pb.PbFieldType.O3)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SourceRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
+    ..hasRequiredFields = false
+  ;
 
   SourceRequest._() : super();
   factory SourceRequest({
-    $core.String source,
-    $core.int offset,
+    $core.String? source,
+    $core.int? offset,
   }) {
     final _result = create();
     if (source != null) {
@@ -202,40 +138,31 @@
     }
     return _result;
   }
-  factory SourceRequest.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory SourceRequest.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory SourceRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory SourceRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   SourceRequest clone() => SourceRequest()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  SourceRequest copyWith(void Function(SourceRequest) updates) =>
-      super.copyWith((message) => updates(message as SourceRequest))
-          as SourceRequest; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  SourceRequest copyWith(void Function(SourceRequest) updates) => super.copyWith((message) => updates(message as SourceRequest)) as SourceRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static SourceRequest create() => SourceRequest._();
   SourceRequest createEmptyInstance() => create();
-  static $pb.PbList<SourceRequest> createRepeated() =>
-      $pb.PbList<SourceRequest>();
+  static $pb.PbList<SourceRequest> createRepeated() => $pb.PbList<SourceRequest>();
   @$core.pragma('dart2js:noInline')
-  static SourceRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<SourceRequest>(create);
-  static SourceRequest _defaultInstance;
+  static SourceRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SourceRequest>(create);
+  static SourceRequest? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get source => $_getSZ(0);
   @$pb.TagNumber(1)
-  set source($core.String v) {
-    $_setString(0, v);
-  }
-
+  set source($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasSource() => $_has(0);
   @$pb.TagNumber(1)
@@ -244,10 +171,7 @@
   @$pb.TagNumber(2)
   $core.int get offset => $_getIZ(1);
   @$pb.TagNumber(2)
-  set offset($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set offset($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasOffset() => $_has(1);
   @$pb.TagNumber(2)
@@ -255,30 +179,18 @@
 }
 
 class AnalysisResults extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'AnalysisResults',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..pc<AnalysisIssue>(
-        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'issues', $pb.PbFieldType.PM,
-        subBuilder: AnalysisIssue.create)
-    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'packageImports',
-        protoName: 'packageImports')
-    ..aOM<ErrorMessage>(
-        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnalysisResults', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..pc<AnalysisIssue>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'issues', $pb.PbFieldType.PM, subBuilder: AnalysisIssue.create)
+    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'packageImports', protoName: 'packageImports')
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   AnalysisResults._() : super();
   factory AnalysisResults({
-    $core.Iterable<AnalysisIssue> issues,
-    $core.Iterable<$core.String> packageImports,
-    ErrorMessage error,
+    $core.Iterable<AnalysisIssue>? issues,
+    $core.Iterable<$core.String>? packageImports,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (issues != null) {
@@ -292,32 +204,26 @@
     }
     return _result;
   }
-  factory AnalysisResults.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory AnalysisResults.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory AnalysisResults.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory AnalysisResults.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   AnalysisResults clone() => AnalysisResults()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  AnalysisResults copyWith(void Function(AnalysisResults) updates) =>
-      super.copyWith((message) => updates(message as AnalysisResults))
-          as AnalysisResults; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  AnalysisResults copyWith(void Function(AnalysisResults) updates) => super.copyWith((message) => updates(message as AnalysisResults)) as AnalysisResults; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AnalysisResults create() => AnalysisResults._();
   AnalysisResults createEmptyInstance() => create();
-  static $pb.PbList<AnalysisResults> createRepeated() =>
-      $pb.PbList<AnalysisResults>();
+  static $pb.PbList<AnalysisResults> createRepeated() => $pb.PbList<AnalysisResults>();
   @$core.pragma('dart2js:noInline')
-  static AnalysisResults getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<AnalysisResults>(create);
-  static AnalysisResults _defaultInstance;
+  static AnalysisResults getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AnalysisResults>(create);
+  static AnalysisResults? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.List<AnalysisIssue> get issues => $_getList(0);
@@ -328,10 +234,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -341,52 +244,32 @@
 }
 
 class AnalysisIssue extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'AnalysisIssue',
-      package: const $pb.PackageName($core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'kind')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'line',
-        $pb.PbFieldType.O3)
-    ..aOS(
-        3,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'message')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceName',
-        protoName: 'sourceName')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AnalysisIssue', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'line', $pb.PbFieldType.O3)
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceName', protoName: 'sourceName')
     ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hasFixes', protoName: 'hasFixes')
     ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3, protoName: 'charStart')
     ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3, protoName: 'charLength')
     ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'url')
     ..pc<DiagnosticMessage>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'diagnosticMessages', $pb.PbFieldType.PM, protoName: 'diagnosticMessages', subBuilder: DiagnosticMessage.create)
     ..aOS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'correction')
-    ..hasRequiredFields = false;
+    ..hasRequiredFields = false
+  ;
 
   AnalysisIssue._() : super();
   factory AnalysisIssue({
-    $core.String kind,
-    $core.int line,
-    $core.String message,
-    $core.String sourceName,
-    $core.bool hasFixes,
-    $core.int charStart,
-    $core.int charLength,
-    $core.String url,
-    $core.Iterable<DiagnosticMessage> diagnosticMessages,
-    $core.String correction,
+    $core.String? kind,
+    $core.int? line,
+    $core.String? message,
+    $core.String? sourceName,
+    $core.bool? hasFixes,
+    $core.int? charStart,
+    $core.int? charLength,
+    $core.String? url,
+    $core.Iterable<DiagnosticMessage>? diagnosticMessages,
+    $core.String? correction,
   }) {
     final _result = create();
     if (kind != null) {
@@ -421,40 +304,31 @@
     }
     return _result;
   }
-  factory AnalysisIssue.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory AnalysisIssue.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory AnalysisIssue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory AnalysisIssue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   AnalysisIssue clone() => AnalysisIssue()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  AnalysisIssue copyWith(void Function(AnalysisIssue) updates) =>
-      super.copyWith((message) => updates(message as AnalysisIssue))
-          as AnalysisIssue; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  AnalysisIssue copyWith(void Function(AnalysisIssue) updates) => super.copyWith((message) => updates(message as AnalysisIssue)) as AnalysisIssue; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AnalysisIssue create() => AnalysisIssue._();
   AnalysisIssue createEmptyInstance() => create();
-  static $pb.PbList<AnalysisIssue> createRepeated() =>
-      $pb.PbList<AnalysisIssue>();
+  static $pb.PbList<AnalysisIssue> createRepeated() => $pb.PbList<AnalysisIssue>();
   @$core.pragma('dart2js:noInline')
-  static AnalysisIssue getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<AnalysisIssue>(create);
-  static AnalysisIssue _defaultInstance;
+  static AnalysisIssue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AnalysisIssue>(create);
+  static AnalysisIssue? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get kind => $_getSZ(0);
   @$pb.TagNumber(1)
-  set kind($core.String v) {
-    $_setString(0, v);
-  }
-
+  set kind($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasKind() => $_has(0);
   @$pb.TagNumber(1)
@@ -463,10 +337,7 @@
   @$pb.TagNumber(2)
   $core.int get line => $_getIZ(1);
   @$pb.TagNumber(2)
-  set line($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set line($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasLine() => $_has(1);
   @$pb.TagNumber(2)
@@ -475,10 +346,7 @@
   @$pb.TagNumber(3)
   $core.String get message => $_getSZ(2);
   @$pb.TagNumber(3)
-  set message($core.String v) {
-    $_setString(2, v);
-  }
-
+  set message($core.String v) { $_setString(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasMessage() => $_has(2);
   @$pb.TagNumber(3)
@@ -487,10 +355,7 @@
   @$pb.TagNumber(4)
   $core.String get sourceName => $_getSZ(3);
   @$pb.TagNumber(4)
-  set sourceName($core.String v) {
-    $_setString(3, v);
-  }
-
+  set sourceName($core.String v) { $_setString(3, v); }
   @$pb.TagNumber(4)
   $core.bool hasSourceName() => $_has(3);
   @$pb.TagNumber(4)
@@ -499,10 +364,7 @@
   @$pb.TagNumber(5)
   $core.bool get hasFixes => $_getBF(4);
   @$pb.TagNumber(5)
-  set hasFixes($core.bool v) {
-    $_setBool(4, v);
-  }
-
+  set hasFixes($core.bool v) { $_setBool(4, v); }
   @$pb.TagNumber(5)
   $core.bool hasHasFixes() => $_has(4);
   @$pb.TagNumber(5)
@@ -511,10 +373,7 @@
   @$pb.TagNumber(6)
   $core.int get charStart => $_getIZ(5);
   @$pb.TagNumber(6)
-  set charStart($core.int v) {
-    $_setSignedInt32(5, v);
-  }
-
+  set charStart($core.int v) { $_setSignedInt32(5, v); }
   @$pb.TagNumber(6)
   $core.bool hasCharStart() => $_has(5);
   @$pb.TagNumber(6)
@@ -523,10 +382,7 @@
   @$pb.TagNumber(7)
   $core.int get charLength => $_getIZ(6);
   @$pb.TagNumber(7)
-  set charLength($core.int v) {
-    $_setSignedInt32(6, v);
-  }
-
+  set charLength($core.int v) { $_setSignedInt32(6, v); }
   @$pb.TagNumber(7)
   $core.bool hasCharLength() => $_has(6);
   @$pb.TagNumber(7)
@@ -535,10 +391,7 @@
   @$pb.TagNumber(8)
   $core.String get url => $_getSZ(7);
   @$pb.TagNumber(8)
-  set url($core.String v) {
-    $_setString(7, v);
-  }
-
+  set url($core.String v) { $_setString(7, v); }
   @$pb.TagNumber(8)
   $core.bool hasUrl() => $_has(7);
   @$pb.TagNumber(8)
@@ -550,10 +403,7 @@
   @$pb.TagNumber(10)
   $core.String get correction => $_getSZ(9);
   @$pb.TagNumber(10)
-  set correction($core.String v) {
-    $_setString(9, v);
-  }
-
+  set correction($core.String v) { $_setString(9, v); }
   @$pb.TagNumber(10)
   $core.bool hasCorrection() => $_has(9);
   @$pb.TagNumber(10)
@@ -561,39 +411,20 @@
 }
 
 class DiagnosticMessage extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'DiagnosticMessage',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'message')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'line',
-        $pb.PbFieldType.O3)
-    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3,
-        protoName: 'charStart')
-    ..a<$core.int>(
-        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3,
-        protoName: 'charLength')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DiagnosticMessage', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'line', $pb.PbFieldType.O3)
+    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charStart', $pb.PbFieldType.O3, protoName: 'charStart')
+    ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'charLength', $pb.PbFieldType.O3, protoName: 'charLength')
+    ..hasRequiredFields = false
+  ;
 
   DiagnosticMessage._() : super();
   factory DiagnosticMessage({
-    $core.String message,
-    $core.int line,
-    $core.int charStart,
-    $core.int charLength,
+    $core.String? message,
+    $core.int? line,
+    $core.int? charStart,
+    $core.int? charLength,
   }) {
     final _result = create();
     if (message != null) {
@@ -610,40 +441,31 @@
     }
     return _result;
   }
-  factory DiagnosticMessage.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory DiagnosticMessage.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory DiagnosticMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory DiagnosticMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   DiagnosticMessage clone() => DiagnosticMessage()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  DiagnosticMessage copyWith(void Function(DiagnosticMessage) updates) =>
-      super.copyWith((message) => updates(message as DiagnosticMessage))
-          as DiagnosticMessage; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  DiagnosticMessage copyWith(void Function(DiagnosticMessage) updates) => super.copyWith((message) => updates(message as DiagnosticMessage)) as DiagnosticMessage; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static DiagnosticMessage create() => DiagnosticMessage._();
   DiagnosticMessage createEmptyInstance() => create();
-  static $pb.PbList<DiagnosticMessage> createRepeated() =>
-      $pb.PbList<DiagnosticMessage>();
+  static $pb.PbList<DiagnosticMessage> createRepeated() => $pb.PbList<DiagnosticMessage>();
   @$core.pragma('dart2js:noInline')
-  static DiagnosticMessage getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<DiagnosticMessage>(create);
-  static DiagnosticMessage _defaultInstance;
+  static DiagnosticMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DiagnosticMessage>(create);
+  static DiagnosticMessage? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) {
-    $_setString(0, v);
-  }
-
+  set message($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
@@ -652,10 +474,7 @@
   @$pb.TagNumber(2)
   $core.int get line => $_getIZ(1);
   @$pb.TagNumber(2)
-  set line($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set line($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasLine() => $_has(1);
   @$pb.TagNumber(2)
@@ -664,10 +483,7 @@
   @$pb.TagNumber(3)
   $core.int get charStart => $_getIZ(2);
   @$pb.TagNumber(3)
-  set charStart($core.int v) {
-    $_setSignedInt32(2, v);
-  }
-
+  set charStart($core.int v) { $_setSignedInt32(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasCharStart() => $_has(2);
   @$pb.TagNumber(3)
@@ -676,10 +492,7 @@
   @$pb.TagNumber(4)
   $core.int get charLength => $_getIZ(3);
   @$pb.TagNumber(4)
-  set charLength($core.int v) {
-    $_setSignedInt32(3, v);
-  }
-
+  set charLength($core.int v) { $_setSignedInt32(3, v); }
   @$pb.TagNumber(4)
   $core.bool hasCharLength() => $_has(3);
   @$pb.TagNumber(4)
@@ -687,77 +500,47 @@
 }
 
 class VersionRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'VersionRequest',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'VersionRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..hasRequiredFields = false
+  ;
 
   VersionRequest._() : super();
   factory VersionRequest() => create();
-  factory VersionRequest.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory VersionRequest.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory VersionRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory VersionRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   VersionRequest clone() => VersionRequest()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  VersionRequest copyWith(void Function(VersionRequest) updates) =>
-      super.copyWith((message) => updates(message as VersionRequest))
-          as VersionRequest; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  VersionRequest copyWith(void Function(VersionRequest) updates) => super.copyWith((message) => updates(message as VersionRequest)) as VersionRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static VersionRequest create() => VersionRequest._();
   VersionRequest createEmptyInstance() => create();
-  static $pb.PbList<VersionRequest> createRepeated() =>
-      $pb.PbList<VersionRequest>();
+  static $pb.PbList<VersionRequest> createRepeated() => $pb.PbList<VersionRequest>();
   @$core.pragma('dart2js:noInline')
-  static VersionRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<VersionRequest>(create);
-  static VersionRequest _defaultInstance;
+  static VersionRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VersionRequest>(create);
+  static VersionRequest? _defaultInstance;
 }
 
 class CompileResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CompileResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'result')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceMap',
-        protoName: 'sourceMap')
-    ..aOM<ErrorMessage>(
-        99,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'result')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sourceMap', protoName: 'sourceMap')
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   CompileResponse._() : super();
   factory CompileResponse({
-    $core.String result,
-    $core.String sourceMap,
-    ErrorMessage error,
+    $core.String? result,
+    $core.String? sourceMap,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (result != null) {
@@ -771,40 +554,31 @@
     }
     return _result;
   }
-  factory CompileResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CompileResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CompileResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CompileResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CompileResponse clone() => CompileResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CompileResponse copyWith(void Function(CompileResponse) updates) =>
-      super.copyWith((message) => updates(message as CompileResponse))
-          as CompileResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CompileResponse copyWith(void Function(CompileResponse) updates) => super.copyWith((message) => updates(message as CompileResponse)) as CompileResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileResponse create() => CompileResponse._();
   CompileResponse createEmptyInstance() => create();
-  static $pb.PbList<CompileResponse> createRepeated() =>
-      $pb.PbList<CompileResponse>();
+  static $pb.PbList<CompileResponse> createRepeated() => $pb.PbList<CompileResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompileResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CompileResponse>(create);
-  static CompileResponse _defaultInstance;
+  static CompileResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileResponse>(create);
+  static CompileResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get result => $_getSZ(0);
   @$pb.TagNumber(1)
-  set result($core.String v) {
-    $_setString(0, v);
-  }
-
+  set result($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasResult() => $_has(0);
   @$pb.TagNumber(1)
@@ -813,10 +587,7 @@
   @$pb.TagNumber(2)
   $core.String get sourceMap => $_getSZ(1);
   @$pb.TagNumber(2)
-  set sourceMap($core.String v) {
-    $_setString(1, v);
-  }
-
+  set sourceMap($core.String v) { $_setString(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasSourceMap() => $_has(1);
   @$pb.TagNumber(2)
@@ -825,10 +596,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -838,35 +606,18 @@
 }
 
 class CompileDDCResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CompileDDCResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'result')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modulesBaseUrl',
-        protoName: 'modulesBaseUrl')
-    ..aOM<ErrorMessage>(
-        99,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompileDDCResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'result')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modulesBaseUrl', protoName: 'modulesBaseUrl')
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   CompileDDCResponse._() : super();
   factory CompileDDCResponse({
-    $core.String result,
-    $core.String modulesBaseUrl,
-    ErrorMessage error,
+    $core.String? result,
+    $core.String? modulesBaseUrl,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (result != null) {
@@ -880,40 +631,31 @@
     }
     return _result;
   }
-  factory CompileDDCResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CompileDDCResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CompileDDCResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CompileDDCResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CompileDDCResponse clone() => CompileDDCResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CompileDDCResponse copyWith(void Function(CompileDDCResponse) updates) =>
-      super.copyWith((message) => updates(message as CompileDDCResponse))
-          as CompileDDCResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CompileDDCResponse copyWith(void Function(CompileDDCResponse) updates) => super.copyWith((message) => updates(message as CompileDDCResponse)) as CompileDDCResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompileDDCResponse create() => CompileDDCResponse._();
   CompileDDCResponse createEmptyInstance() => create();
-  static $pb.PbList<CompileDDCResponse> createRepeated() =>
-      $pb.PbList<CompileDDCResponse>();
+  static $pb.PbList<CompileDDCResponse> createRepeated() => $pb.PbList<CompileDDCResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompileDDCResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CompileDDCResponse>(create);
-  static CompileDDCResponse _defaultInstance;
+  static CompileDDCResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompileDDCResponse>(create);
+  static CompileDDCResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get result => $_getSZ(0);
   @$pb.TagNumber(1)
-  set result($core.String v) {
-    $_setString(0, v);
-  }
-
+  set result($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasResult() => $_has(0);
   @$pb.TagNumber(1)
@@ -922,10 +664,7 @@
   @$pb.TagNumber(2)
   $core.String get modulesBaseUrl => $_getSZ(1);
   @$pb.TagNumber(2)
-  set modulesBaseUrl($core.String v) {
-    $_setString(1, v);
-  }
-
+  set modulesBaseUrl($core.String v) { $_setString(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasModulesBaseUrl() => $_has(1);
   @$pb.TagNumber(2)
@@ -934,10 +673,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -947,33 +683,16 @@
 }
 
 class DocumentResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'DocumentResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..m<$core.String, $core.String>(
-        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'info',
-        entryClassName: 'DocumentResponse.InfoEntry',
-        keyFieldType: $pb.PbFieldType.OS,
-        valueFieldType: $pb.PbFieldType.OS,
-        packageName: const $pb.PackageName('dart_services.api'))
-    ..aOM<ErrorMessage>(
-        99,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'info', entryClassName: 'DocumentResponse.InfoEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('dart_services.api'))
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   DocumentResponse._() : super();
   factory DocumentResponse({
-    $core.Map<$core.String, $core.String> info,
-    ErrorMessage error,
+    $core.Map<$core.String, $core.String>? info,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (info != null) {
@@ -984,32 +703,26 @@
     }
     return _result;
   }
-  factory DocumentResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory DocumentResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory DocumentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory DocumentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   DocumentResponse clone() => DocumentResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  DocumentResponse copyWith(void Function(DocumentResponse) updates) =>
-      super.copyWith((message) => updates(message as DocumentResponse))
-          as DocumentResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  DocumentResponse copyWith(void Function(DocumentResponse) updates) => super.copyWith((message) => updates(message as DocumentResponse)) as DocumentResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static DocumentResponse create() => DocumentResponse._();
   DocumentResponse createEmptyInstance() => create();
-  static $pb.PbList<DocumentResponse> createRepeated() =>
-      $pb.PbList<DocumentResponse>();
+  static $pb.PbList<DocumentResponse> createRepeated() => $pb.PbList<DocumentResponse>();
   @$core.pragma('dart2js:noInline')
-  static DocumentResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<DocumentResponse>(create);
-  static DocumentResponse _defaultInstance;
+  static DocumentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentResponse>(create);
+  static DocumentResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.Map<$core.String, $core.String> get info => $_getMap(0);
@@ -1017,10 +730,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -1030,33 +740,20 @@
 }
 
 class CompleteResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'CompleteResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementOffset', $pb.PbFieldType.O3,
-        protoName: 'replacementOffset')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementLength',
-        $pb.PbFieldType.O3,
-        protoName: 'replacementLength')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CompleteResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementOffset', $pb.PbFieldType.O3, protoName: 'replacementOffset')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacementLength', $pb.PbFieldType.O3, protoName: 'replacementLength')
     ..pc<Completion>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'completions', $pb.PbFieldType.PM, subBuilder: Completion.create)
     ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+    ..hasRequiredFields = false
+  ;
 
   CompleteResponse._() : super();
   factory CompleteResponse({
-    $core.int replacementOffset,
-    $core.int replacementLength,
-    $core.Iterable<Completion> completions,
-    ErrorMessage error,
+    $core.int? replacementOffset,
+    $core.int? replacementLength,
+    $core.Iterable<Completion>? completions,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (replacementOffset != null) {
@@ -1073,40 +770,31 @@
     }
     return _result;
   }
-  factory CompleteResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CompleteResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CompleteResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CompleteResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CompleteResponse clone() => CompleteResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CompleteResponse copyWith(void Function(CompleteResponse) updates) =>
-      super.copyWith((message) => updates(message as CompleteResponse))
-          as CompleteResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CompleteResponse copyWith(void Function(CompleteResponse) updates) => super.copyWith((message) => updates(message as CompleteResponse)) as CompleteResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CompleteResponse create() => CompleteResponse._();
   CompleteResponse createEmptyInstance() => create();
-  static $pb.PbList<CompleteResponse> createRepeated() =>
-      $pb.PbList<CompleteResponse>();
+  static $pb.PbList<CompleteResponse> createRepeated() => $pb.PbList<CompleteResponse>();
   @$core.pragma('dart2js:noInline')
-  static CompleteResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CompleteResponse>(create);
-  static CompleteResponse _defaultInstance;
+  static CompleteResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CompleteResponse>(create);
+  static CompleteResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.int get replacementOffset => $_getIZ(0);
   @$pb.TagNumber(1)
-  set replacementOffset($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
+  set replacementOffset($core.int v) { $_setSignedInt32(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasReplacementOffset() => $_has(0);
   @$pb.TagNumber(1)
@@ -1115,10 +803,7 @@
   @$pb.TagNumber(2)
   $core.int get replacementLength => $_getIZ(1);
   @$pb.TagNumber(2)
-  set replacementLength($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set replacementLength($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasReplacementLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -1130,10 +815,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(3);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(3);
   @$pb.TagNumber(99)
@@ -1143,29 +825,14 @@
 }
 
 class Completion extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'Completion',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..m<$core.String, $core.String>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'completion',
-        entryClassName: 'Completion.CompletionEntry',
-        keyFieldType: $pb.PbFieldType.OS,
-        valueFieldType: $pb.PbFieldType.OS,
-        packageName: const $pb.PackageName('dart_services.api'))
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Completion', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'completion', entryClassName: 'Completion.CompletionEntry', keyFieldType: $pb.PbFieldType.OS, valueFieldType: $pb.PbFieldType.OS, packageName: const $pb.PackageName('dart_services.api'))
+    ..hasRequiredFields = false
+  ;
 
   Completion._() : super();
   factory Completion({
-    $core.Map<$core.String, $core.String> completion,
+    $core.Map<$core.String, $core.String>? completion,
   }) {
     final _result = create();
     if (completion != null) {
@@ -1173,62 +840,42 @@
     }
     return _result;
   }
-  factory Completion.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory Completion.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory Completion.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory Completion.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   Completion clone() => Completion()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  Completion copyWith(void Function(Completion) updates) =>
-      super.copyWith((message) => updates(message as Completion))
-          as Completion; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  Completion copyWith(void Function(Completion) updates) => super.copyWith((message) => updates(message as Completion)) as Completion; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static Completion create() => Completion._();
   Completion createEmptyInstance() => create();
   static $pb.PbList<Completion> createRepeated() => $pb.PbList<Completion>();
   @$core.pragma('dart2js:noInline')
-  static Completion getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<Completion>(create);
-  static Completion _defaultInstance;
+  static Completion getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Completion>(create);
+  static Completion? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.Map<$core.String, $core.String> get completion => $_getMap(0);
 }
 
 class FixesResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'FixesResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..pc<ProblemAndFixes>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'fixes',
-        $pb.PbFieldType.PM,
-        subBuilder: ProblemAndFixes.create)
-    ..aOM<ErrorMessage>(
-        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FixesResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..pc<ProblemAndFixes>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fixes', $pb.PbFieldType.PM, subBuilder: ProblemAndFixes.create)
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   FixesResponse._() : super();
   factory FixesResponse({
-    $core.Iterable<ProblemAndFixes> fixes,
-    ErrorMessage error,
+    $core.Iterable<ProblemAndFixes>? fixes,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (fixes != null) {
@@ -1239,32 +886,26 @@
     }
     return _result;
   }
-  factory FixesResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory FixesResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory FixesResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory FixesResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   FixesResponse clone() => FixesResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  FixesResponse copyWith(void Function(FixesResponse) updates) =>
-      super.copyWith((message) => updates(message as FixesResponse))
-          as FixesResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  FixesResponse copyWith(void Function(FixesResponse) updates) => super.copyWith((message) => updates(message as FixesResponse)) as FixesResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static FixesResponse create() => FixesResponse._();
   FixesResponse createEmptyInstance() => create();
-  static $pb.PbList<FixesResponse> createRepeated() =>
-      $pb.PbList<FixesResponse>();
+  static $pb.PbList<FixesResponse> createRepeated() => $pb.PbList<FixesResponse>();
   @$core.pragma('dart2js:noInline')
-  static FixesResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<FixesResponse>(create);
-  static FixesResponse _defaultInstance;
+  static FixesResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FixesResponse>(create);
+  static FixesResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.List<ProblemAndFixes> get fixes => $_getList(0);
@@ -1272,10 +913,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -1285,34 +923,20 @@
 }
 
 class ProblemAndFixes extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'ProblemAndFixes',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..pc<CandidateFix>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'fixes',
-        $pb.PbFieldType.PM,
-        subBuilder: CandidateFix.create)
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'problemMessage',
-        protoName: 'problemMessage')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ProblemAndFixes', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..pc<CandidateFix>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fixes', $pb.PbFieldType.PM, subBuilder: CandidateFix.create)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'problemMessage', protoName: 'problemMessage')
     ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
     ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
-    ..hasRequiredFields = false;
+    ..hasRequiredFields = false
+  ;
 
   ProblemAndFixes._() : super();
   factory ProblemAndFixes({
-    $core.Iterable<CandidateFix> fixes,
-    $core.String problemMessage,
-    $core.int offset,
-    $core.int length,
+    $core.Iterable<CandidateFix>? fixes,
+    $core.String? problemMessage,
+    $core.int? offset,
+    $core.int? length,
   }) {
     final _result = create();
     if (fixes != null) {
@@ -1329,32 +953,26 @@
     }
     return _result;
   }
-  factory ProblemAndFixes.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory ProblemAndFixes.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory ProblemAndFixes.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory ProblemAndFixes.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   ProblemAndFixes clone() => ProblemAndFixes()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  ProblemAndFixes copyWith(void Function(ProblemAndFixes) updates) =>
-      super.copyWith((message) => updates(message as ProblemAndFixes))
-          as ProblemAndFixes; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  ProblemAndFixes copyWith(void Function(ProblemAndFixes) updates) => super.copyWith((message) => updates(message as ProblemAndFixes)) as ProblemAndFixes; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static ProblemAndFixes create() => ProblemAndFixes._();
   ProblemAndFixes createEmptyInstance() => create();
-  static $pb.PbList<ProblemAndFixes> createRepeated() =>
-      $pb.PbList<ProblemAndFixes>();
+  static $pb.PbList<ProblemAndFixes> createRepeated() => $pb.PbList<ProblemAndFixes>();
   @$core.pragma('dart2js:noInline')
-  static ProblemAndFixes getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<ProblemAndFixes>(create);
-  static ProblemAndFixes _defaultInstance;
+  static ProblemAndFixes getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ProblemAndFixes>(create);
+  static ProblemAndFixes? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.List<CandidateFix> get fixes => $_getList(0);
@@ -1362,10 +980,7 @@
   @$pb.TagNumber(2)
   $core.String get problemMessage => $_getSZ(1);
   @$pb.TagNumber(2)
-  set problemMessage($core.String v) {
-    $_setString(1, v);
-  }
-
+  set problemMessage($core.String v) { $_setString(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasProblemMessage() => $_has(1);
   @$pb.TagNumber(2)
@@ -1374,10 +989,7 @@
   @$pb.TagNumber(3)
   $core.int get offset => $_getIZ(2);
   @$pb.TagNumber(3)
-  set offset($core.int v) {
-    $_setSignedInt32(2, v);
-  }
-
+  set offset($core.int v) { $_setSignedInt32(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasOffset() => $_has(2);
   @$pb.TagNumber(3)
@@ -1386,10 +998,7 @@
   @$pb.TagNumber(4)
   $core.int get length => $_getIZ(3);
   @$pb.TagNumber(4)
-  set length($core.int v) {
-    $_setSignedInt32(3, v);
-  }
-
+  set length($core.int v) { $_setSignedInt32(3, v); }
   @$pb.TagNumber(4)
   $core.bool hasLength() => $_has(3);
   @$pb.TagNumber(4)
@@ -1397,37 +1006,20 @@
 }
 
 class CandidateFix extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CandidateFix',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'message')
-    ..pc<SourceEdit>(
-        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'edits', $pb.PbFieldType.PM,
-        subBuilder: SourceEdit.create)
-    ..a<$core.int>(
-        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'selectionOffset', $pb.PbFieldType.O3,
-        protoName: 'selectionOffset')
-    ..pc<LinkedEditGroup>(
-        4,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'linkedEditGroups',
-        $pb.PbFieldType.PM,
-        protoName: 'linkedEditGroups',
-        subBuilder: LinkedEditGroup.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CandidateFix', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
+    ..pc<SourceEdit>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'edits', $pb.PbFieldType.PM, subBuilder: SourceEdit.create)
+    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'selectionOffset', $pb.PbFieldType.O3, protoName: 'selectionOffset')
+    ..pc<LinkedEditGroup>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'linkedEditGroups', $pb.PbFieldType.PM, protoName: 'linkedEditGroups', subBuilder: LinkedEditGroup.create)
+    ..hasRequiredFields = false
+  ;
 
   CandidateFix._() : super();
   factory CandidateFix({
-    $core.String message,
-    $core.Iterable<SourceEdit> edits,
-    $core.int selectionOffset,
-    $core.Iterable<LinkedEditGroup> linkedEditGroups,
+    $core.String? message,
+    $core.Iterable<SourceEdit>? edits,
+    $core.int? selectionOffset,
+    $core.Iterable<LinkedEditGroup>? linkedEditGroups,
   }) {
     final _result = create();
     if (message != null) {
@@ -1444,40 +1036,31 @@
     }
     return _result;
   }
-  factory CandidateFix.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory CandidateFix.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory CandidateFix.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory CandidateFix.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   CandidateFix clone() => CandidateFix()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  CandidateFix copyWith(void Function(CandidateFix) updates) =>
-      super.copyWith((message) => updates(message as CandidateFix))
-          as CandidateFix; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  CandidateFix copyWith(void Function(CandidateFix) updates) => super.copyWith((message) => updates(message as CandidateFix)) as CandidateFix; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static CandidateFix create() => CandidateFix._();
   CandidateFix createEmptyInstance() => create();
-  static $pb.PbList<CandidateFix> createRepeated() =>
-      $pb.PbList<CandidateFix>();
+  static $pb.PbList<CandidateFix> createRepeated() => $pb.PbList<CandidateFix>();
   @$core.pragma('dart2js:noInline')
-  static CandidateFix getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<CandidateFix>(create);
-  static CandidateFix _defaultInstance;
+  static CandidateFix getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CandidateFix>(create);
+  static CandidateFix? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) {
-    $_setString(0, v);
-  }
-
+  set message($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
@@ -1489,10 +1072,7 @@
   @$pb.TagNumber(3)
   $core.int get selectionOffset => $_getIZ(2);
   @$pb.TagNumber(3)
-  set selectionOffset($core.int v) {
-    $_setSignedInt32(2, v);
-  }
-
+  set selectionOffset($core.int v) { $_setSignedInt32(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasSelectionOffset() => $_has(2);
   @$pb.TagNumber(3)
@@ -1503,36 +1083,18 @@
 }
 
 class SourceEdit extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'SourceEdit',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..a<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'offset',
-        $pb.PbFieldType.O3)
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'length',
-        $pb.PbFieldType.O3)
-    ..aOS(3,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacement')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SourceEdit', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replacement')
+    ..hasRequiredFields = false
+  ;
 
   SourceEdit._() : super();
   factory SourceEdit({
-    $core.int offset,
-    $core.int length,
-    $core.String replacement,
+    $core.int? offset,
+    $core.int? length,
+    $core.String? replacement,
   }) {
     final _result = create();
     if (offset != null) {
@@ -1546,39 +1108,31 @@
     }
     return _result;
   }
-  factory SourceEdit.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory SourceEdit.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory SourceEdit.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory SourceEdit.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   SourceEdit clone() => SourceEdit()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  SourceEdit copyWith(void Function(SourceEdit) updates) =>
-      super.copyWith((message) => updates(message as SourceEdit))
-          as SourceEdit; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  SourceEdit copyWith(void Function(SourceEdit) updates) => super.copyWith((message) => updates(message as SourceEdit)) as SourceEdit; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static SourceEdit create() => SourceEdit._();
   SourceEdit createEmptyInstance() => create();
   static $pb.PbList<SourceEdit> createRepeated() => $pb.PbList<SourceEdit>();
   @$core.pragma('dart2js:noInline')
-  static SourceEdit getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<SourceEdit>(create);
-  static SourceEdit _defaultInstance;
+  static SourceEdit getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<SourceEdit>(create);
+  static SourceEdit? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.int get offset => $_getIZ(0);
   @$pb.TagNumber(1)
-  set offset($core.int v) {
-    $_setSignedInt32(0, v);
-  }
-
+  set offset($core.int v) { $_setSignedInt32(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasOffset() => $_has(0);
   @$pb.TagNumber(1)
@@ -1587,10 +1141,7 @@
   @$pb.TagNumber(2)
   $core.int get length => $_getIZ(1);
   @$pb.TagNumber(2)
-  set length($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set length($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -1599,10 +1150,7 @@
   @$pb.TagNumber(3)
   $core.String get replacement => $_getSZ(2);
   @$pb.TagNumber(3)
-  set replacement($core.String v) {
-    $_setString(2, v);
-  }
-
+  set replacement($core.String v) { $_setString(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasReplacement() => $_has(2);
   @$pb.TagNumber(3)
@@ -1610,38 +1158,18 @@
 }
 
 class LinkedEditGroup extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'LinkedEditGroup',
-      package: const $pb.PackageName($core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..p<$core.int>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'positions',
-        $pb.PbFieldType.P3)
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'length',
-        $pb.PbFieldType.O3)
-    ..pc<LinkedEditSuggestion>(
-        3,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'suggestions',
-        $pb.PbFieldType.PM,
-        subBuilder: LinkedEditSuggestion.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LinkedEditGroup', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..p<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'positions', $pb.PbFieldType.P3)
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'length', $pb.PbFieldType.O3)
+    ..pc<LinkedEditSuggestion>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'suggestions', $pb.PbFieldType.PM, subBuilder: LinkedEditSuggestion.create)
+    ..hasRequiredFields = false
+  ;
 
   LinkedEditGroup._() : super();
   factory LinkedEditGroup({
-    $core.Iterable<$core.int> positions,
-    $core.int length,
-    $core.Iterable<LinkedEditSuggestion> suggestions,
+    $core.Iterable<$core.int>? positions,
+    $core.int? length,
+    $core.Iterable<LinkedEditSuggestion>? suggestions,
   }) {
     final _result = create();
     if (positions != null) {
@@ -1655,32 +1183,26 @@
     }
     return _result;
   }
-  factory LinkedEditGroup.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory LinkedEditGroup.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory LinkedEditGroup.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory LinkedEditGroup.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   LinkedEditGroup clone() => LinkedEditGroup()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  LinkedEditGroup copyWith(void Function(LinkedEditGroup) updates) =>
-      super.copyWith((message) => updates(message as LinkedEditGroup))
-          as LinkedEditGroup; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  LinkedEditGroup copyWith(void Function(LinkedEditGroup) updates) => super.copyWith((message) => updates(message as LinkedEditGroup)) as LinkedEditGroup; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static LinkedEditGroup create() => LinkedEditGroup._();
   LinkedEditGroup createEmptyInstance() => create();
-  static $pb.PbList<LinkedEditGroup> createRepeated() =>
-      $pb.PbList<LinkedEditGroup>();
+  static $pb.PbList<LinkedEditGroup> createRepeated() => $pb.PbList<LinkedEditGroup>();
   @$core.pragma('dart2js:noInline')
-  static LinkedEditGroup getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<LinkedEditGroup>(create);
-  static LinkedEditGroup _defaultInstance;
+  static LinkedEditGroup getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LinkedEditGroup>(create);
+  static LinkedEditGroup? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.List<$core.int> get positions => $_getList(0);
@@ -1688,10 +1210,7 @@
   @$pb.TagNumber(2)
   $core.int get length => $_getIZ(1);
   @$pb.TagNumber(2)
-  set length($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set length($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasLength() => $_has(1);
   @$pb.TagNumber(2)
@@ -1702,31 +1221,16 @@
 }
 
 class LinkedEditSuggestion extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'LinkedEditSuggestion',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'value')
-    ..aOS(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'kind')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LinkedEditSuggestion', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind')
+    ..hasRequiredFields = false
+  ;
 
   LinkedEditSuggestion._() : super();
   factory LinkedEditSuggestion({
-    $core.String value,
-    $core.String kind,
+    $core.String? value,
+    $core.String? kind,
   }) {
     final _result = create();
     if (value != null) {
@@ -1737,41 +1241,31 @@
     }
     return _result;
   }
-  factory LinkedEditSuggestion.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory LinkedEditSuggestion.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
-  LinkedEditSuggestion clone() =>
-      LinkedEditSuggestion()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  LinkedEditSuggestion copyWith(void Function(LinkedEditSuggestion) updates) =>
-      super.copyWith((message) => updates(message as LinkedEditSuggestion))
-          as LinkedEditSuggestion; // ignore: deprecated_member_use
+  factory LinkedEditSuggestion.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory LinkedEditSuggestion.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
+  LinkedEditSuggestion clone() => LinkedEditSuggestion()..mergeFromMessage(this);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  LinkedEditSuggestion copyWith(void Function(LinkedEditSuggestion) updates) => super.copyWith((message) => updates(message as LinkedEditSuggestion)) as LinkedEditSuggestion; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static LinkedEditSuggestion create() => LinkedEditSuggestion._();
   LinkedEditSuggestion createEmptyInstance() => create();
-  static $pb.PbList<LinkedEditSuggestion> createRepeated() =>
-      $pb.PbList<LinkedEditSuggestion>();
+  static $pb.PbList<LinkedEditSuggestion> createRepeated() => $pb.PbList<LinkedEditSuggestion>();
   @$core.pragma('dart2js:noInline')
-  static LinkedEditSuggestion getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<LinkedEditSuggestion>(create);
-  static LinkedEditSuggestion _defaultInstance;
+  static LinkedEditSuggestion getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<LinkedEditSuggestion>(create);
+  static LinkedEditSuggestion? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get value => $_getSZ(0);
   @$pb.TagNumber(1)
-  set value($core.String v) {
-    $_setString(0, v);
-  }
-
+  set value($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasValue() => $_has(0);
   @$pb.TagNumber(1)
@@ -1780,10 +1274,7 @@
   @$pb.TagNumber(2)
   $core.String get kind => $_getSZ(1);
   @$pb.TagNumber(2)
-  set kind($core.String v) {
-    $_setString(1, v);
-  }
-
+  set kind($core.String v) { $_setString(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasKind() => $_has(1);
   @$pb.TagNumber(2)
@@ -1791,34 +1282,18 @@
 }
 
 class FormatResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'FormatResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'newString',
-        protoName: 'newString')
-    ..a<$core.int>(
-        2,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'offset',
-        $pb.PbFieldType.O3)
-    ..aOM<ErrorMessage>(
-        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FormatResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'newString', protoName: 'newString')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offset', $pb.PbFieldType.O3)
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   FormatResponse._() : super();
   factory FormatResponse({
-    $core.String newString,
-    $core.int offset,
-    ErrorMessage error,
+    $core.String? newString,
+    $core.int? offset,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (newString != null) {
@@ -1832,40 +1307,31 @@
     }
     return _result;
   }
-  factory FormatResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory FormatResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory FormatResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory FormatResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   FormatResponse clone() => FormatResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  FormatResponse copyWith(void Function(FormatResponse) updates) =>
-      super.copyWith((message) => updates(message as FormatResponse))
-          as FormatResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  FormatResponse copyWith(void Function(FormatResponse) updates) => super.copyWith((message) => updates(message as FormatResponse)) as FormatResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static FormatResponse create() => FormatResponse._();
   FormatResponse createEmptyInstance() => create();
-  static $pb.PbList<FormatResponse> createRepeated() =>
-      $pb.PbList<FormatResponse>();
+  static $pb.PbList<FormatResponse> createRepeated() => $pb.PbList<FormatResponse>();
   @$core.pragma('dart2js:noInline')
-  static FormatResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<FormatResponse>(create);
-  static FormatResponse _defaultInstance;
+  static FormatResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FormatResponse>(create);
+  static FormatResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get newString => $_getSZ(0);
   @$pb.TagNumber(1)
-  set newString($core.String v) {
-    $_setString(0, v);
-  }
-
+  set newString($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasNewString() => $_has(0);
   @$pb.TagNumber(1)
@@ -1874,10 +1340,7 @@
   @$pb.TagNumber(2)
   $core.int get offset => $_getIZ(1);
   @$pb.TagNumber(2)
-  set offset($core.int v) {
-    $_setSignedInt32(1, v);
-  }
-
+  set offset($core.int v) { $_setSignedInt32(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasOffset() => $_has(1);
   @$pb.TagNumber(2)
@@ -1886,10 +1349,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(2);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(2);
   @$pb.TagNumber(99)
@@ -1899,31 +1359,16 @@
 }
 
 class AssistsResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'AssistsResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..pc<CandidateFix>(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'assists',
-        $pb.PbFieldType.PM,
-        subBuilder: CandidateFix.create)
-    ..aOM<ErrorMessage>(
-        99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AssistsResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..pc<CandidateFix>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'assists', $pb.PbFieldType.PM, subBuilder: CandidateFix.create)
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   AssistsResponse._() : super();
   factory AssistsResponse({
-    $core.Iterable<CandidateFix> assists,
-    ErrorMessage error,
+    $core.Iterable<CandidateFix>? assists,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (assists != null) {
@@ -1934,32 +1379,26 @@
     }
     return _result;
   }
-  factory AssistsResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory AssistsResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory AssistsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory AssistsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   AssistsResponse clone() => AssistsResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  AssistsResponse copyWith(void Function(AssistsResponse) updates) =>
-      super.copyWith((message) => updates(message as AssistsResponse))
-          as AssistsResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  AssistsResponse copyWith(void Function(AssistsResponse) updates) => super.copyWith((message) => updates(message as AssistsResponse)) as AssistsResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static AssistsResponse create() => AssistsResponse._();
   AssistsResponse createEmptyInstance() => create();
-  static $pb.PbList<AssistsResponse> createRepeated() =>
-      $pb.PbList<AssistsResponse>();
+  static $pb.PbList<AssistsResponse> createRepeated() => $pb.PbList<AssistsResponse>();
   @$core.pragma('dart2js:noInline')
-  static AssistsResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<AssistsResponse>(create);
-  static AssistsResponse _defaultInstance;
+  static AssistsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AssistsResponse>(create);
+  static AssistsResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.List<CandidateFix> get assists => $_getList(0);
@@ -1967,10 +1406,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(1);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(1);
   @$pb.TagNumber(99)
@@ -1980,41 +1416,30 @@
 }
 
 class VersionResponse extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'VersionResponse',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersion',
-        protoName: 'sdkVersion')
-    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersionFull',
-        protoName: 'sdkVersionFull')
-    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'runtimeVersion',
-        protoName: 'runtimeVersion')
-    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appEngineVersion',
-        protoName: 'appEngineVersion')
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'VersionResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersion', protoName: 'sdkVersion')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdkVersionFull', protoName: 'sdkVersionFull')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'runtimeVersion', protoName: 'runtimeVersion')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appEngineVersion', protoName: 'appEngineVersion')
     ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'servicesVersion', protoName: 'servicesVersion')
     ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterVersion', protoName: 'flutterVersion')
     ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterDartVersion', protoName: 'flutterDartVersion')
     ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'flutterDartVersionFull', protoName: 'flutterDartVersionFull')
     ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+    ..hasRequiredFields = false
+  ;
 
   VersionResponse._() : super();
   factory VersionResponse({
-    $core.String sdkVersion,
-    $core.String sdkVersionFull,
-    $core.String runtimeVersion,
-    $core.String appEngineVersion,
-    $core.String servicesVersion,
-    $core.String flutterVersion,
-    $core.String flutterDartVersion,
-    $core.String flutterDartVersionFull,
-    ErrorMessage error,
+    $core.String? sdkVersion,
+    $core.String? sdkVersionFull,
+    $core.String? runtimeVersion,
+    $core.String? appEngineVersion,
+    $core.String? servicesVersion,
+    $core.String? flutterVersion,
+    $core.String? flutterDartVersion,
+    $core.String? flutterDartVersionFull,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (sdkVersion != null) {
@@ -2046,40 +1471,31 @@
     }
     return _result;
   }
-  factory VersionResponse.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory VersionResponse.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory VersionResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory VersionResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   VersionResponse clone() => VersionResponse()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  VersionResponse copyWith(void Function(VersionResponse) updates) =>
-      super.copyWith((message) => updates(message as VersionResponse))
-          as VersionResponse; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  VersionResponse copyWith(void Function(VersionResponse) updates) => super.copyWith((message) => updates(message as VersionResponse)) as VersionResponse; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static VersionResponse create() => VersionResponse._();
   VersionResponse createEmptyInstance() => create();
-  static $pb.PbList<VersionResponse> createRepeated() =>
-      $pb.PbList<VersionResponse>();
+  static $pb.PbList<VersionResponse> createRepeated() => $pb.PbList<VersionResponse>();
   @$core.pragma('dart2js:noInline')
-  static VersionResponse getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<VersionResponse>(create);
-  static VersionResponse _defaultInstance;
+  static VersionResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VersionResponse>(create);
+  static VersionResponse? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get sdkVersion => $_getSZ(0);
   @$pb.TagNumber(1)
-  set sdkVersion($core.String v) {
-    $_setString(0, v);
-  }
-
+  set sdkVersion($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasSdkVersion() => $_has(0);
   @$pb.TagNumber(1)
@@ -2088,10 +1504,7 @@
   @$pb.TagNumber(2)
   $core.String get sdkVersionFull => $_getSZ(1);
   @$pb.TagNumber(2)
-  set sdkVersionFull($core.String v) {
-    $_setString(1, v);
-  }
-
+  set sdkVersionFull($core.String v) { $_setString(1, v); }
   @$pb.TagNumber(2)
   $core.bool hasSdkVersionFull() => $_has(1);
   @$pb.TagNumber(2)
@@ -2100,10 +1513,7 @@
   @$pb.TagNumber(3)
   $core.String get runtimeVersion => $_getSZ(2);
   @$pb.TagNumber(3)
-  set runtimeVersion($core.String v) {
-    $_setString(2, v);
-  }
-
+  set runtimeVersion($core.String v) { $_setString(2, v); }
   @$pb.TagNumber(3)
   $core.bool hasRuntimeVersion() => $_has(2);
   @$pb.TagNumber(3)
@@ -2112,10 +1522,7 @@
   @$pb.TagNumber(4)
   $core.String get appEngineVersion => $_getSZ(3);
   @$pb.TagNumber(4)
-  set appEngineVersion($core.String v) {
-    $_setString(3, v);
-  }
-
+  set appEngineVersion($core.String v) { $_setString(3, v); }
   @$pb.TagNumber(4)
   $core.bool hasAppEngineVersion() => $_has(3);
   @$pb.TagNumber(4)
@@ -2124,10 +1531,7 @@
   @$pb.TagNumber(5)
   $core.String get servicesVersion => $_getSZ(4);
   @$pb.TagNumber(5)
-  set servicesVersion($core.String v) {
-    $_setString(4, v);
-  }
-
+  set servicesVersion($core.String v) { $_setString(4, v); }
   @$pb.TagNumber(5)
   $core.bool hasServicesVersion() => $_has(4);
   @$pb.TagNumber(5)
@@ -2136,10 +1540,7 @@
   @$pb.TagNumber(6)
   $core.String get flutterVersion => $_getSZ(5);
   @$pb.TagNumber(6)
-  set flutterVersion($core.String v) {
-    $_setString(5, v);
-  }
-
+  set flutterVersion($core.String v) { $_setString(5, v); }
   @$pb.TagNumber(6)
   $core.bool hasFlutterVersion() => $_has(5);
   @$pb.TagNumber(6)
@@ -2148,10 +1549,7 @@
   @$pb.TagNumber(7)
   $core.String get flutterDartVersion => $_getSZ(6);
   @$pb.TagNumber(7)
-  set flutterDartVersion($core.String v) {
-    $_setString(6, v);
-  }
-
+  set flutterDartVersion($core.String v) { $_setString(6, v); }
   @$pb.TagNumber(7)
   $core.bool hasFlutterDartVersion() => $_has(6);
   @$pb.TagNumber(7)
@@ -2160,10 +1558,7 @@
   @$pb.TagNumber(8)
   $core.String get flutterDartVersionFull => $_getSZ(7);
   @$pb.TagNumber(8)
-  set flutterDartVersionFull($core.String v) {
-    $_setString(7, v);
-  }
-
+  set flutterDartVersionFull($core.String v) { $_setString(7, v); }
   @$pb.TagNumber(8)
   $core.bool hasFlutterDartVersionFull() => $_has(7);
   @$pb.TagNumber(8)
@@ -2172,10 +1567,7 @@
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(8);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(8);
   @$pb.TagNumber(99)
@@ -2185,26 +1577,14 @@
 }
 
 class BadRequest extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'BadRequest',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOM<ErrorMessage>(
-        99,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'error',
-        subBuilder: ErrorMessage.create)
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BadRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOM<ErrorMessage>(99, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error', subBuilder: ErrorMessage.create)
+    ..hasRequiredFields = false
+  ;
 
   BadRequest._() : super();
   factory BadRequest({
-    ErrorMessage error,
+    ErrorMessage? error,
   }) {
     final _result = create();
     if (error != null) {
@@ -2212,39 +1592,31 @@
     }
     return _result;
   }
-  factory BadRequest.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory BadRequest.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory BadRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory BadRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   BadRequest clone() => BadRequest()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  BadRequest copyWith(void Function(BadRequest) updates) =>
-      super.copyWith((message) => updates(message as BadRequest))
-          as BadRequest; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  BadRequest copyWith(void Function(BadRequest) updates) => super.copyWith((message) => updates(message as BadRequest)) as BadRequest; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static BadRequest create() => BadRequest._();
   BadRequest createEmptyInstance() => create();
   static $pb.PbList<BadRequest> createRepeated() => $pb.PbList<BadRequest>();
   @$core.pragma('dart2js:noInline')
-  static BadRequest getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<BadRequest>(create);
-  static BadRequest _defaultInstance;
+  static BadRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BadRequest>(create);
+  static BadRequest? _defaultInstance;
 
   @$pb.TagNumber(99)
   ErrorMessage get error => $_getN(0);
   @$pb.TagNumber(99)
-  set error(ErrorMessage v) {
-    setField(99, v);
-  }
-
+  set error(ErrorMessage v) { setField(99, v); }
   @$pb.TagNumber(99)
   $core.bool hasError() => $_has(0);
   @$pb.TagNumber(99)
@@ -2254,25 +1626,14 @@
 }
 
 class ErrorMessage extends $pb.GeneratedMessage {
-  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
-      const $core.bool.fromEnvironment('protobuf.omit_message_names')
-          ? ''
-          : 'ErrorMessage',
-      package: const $pb.PackageName(
-          $core.bool.fromEnvironment('protobuf.omit_message_names')
-              ? ''
-              : 'dart_services.api'),
-      createEmptyInstance: create)
-    ..aOS(
-        1,
-        const $core.bool.fromEnvironment('protobuf.omit_field_names')
-            ? ''
-            : 'message')
-    ..hasRequiredFields = false;
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ErrorMessage', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'dart_services.api'), createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'message')
+    ..hasRequiredFields = false
+  ;
 
   ErrorMessage._() : super();
   factory ErrorMessage({
-    $core.String message,
+    $core.String? message,
   }) {
     final _result = create();
     if (message != null) {
@@ -2280,42 +1641,34 @@
     }
     return _result;
   }
-  factory ErrorMessage.fromBuffer($core.List<$core.int> i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromBuffer(i, r);
-  factory ErrorMessage.fromJson($core.String i,
-          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
-      create()..mergeFromJson(i, r);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
-      'Will be removed in next major version')
+  factory ErrorMessage.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
+  factory ErrorMessage.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+  'Will be removed in next major version')
   ErrorMessage clone() => ErrorMessage()..mergeFromMessage(this);
-  @$core.Deprecated('Using this can add significant overhead to your binary. '
-      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
-      'Will be removed in next major version')
-  ErrorMessage copyWith(void Function(ErrorMessage) updates) =>
-      super.copyWith((message) => updates(message as ErrorMessage))
-          as ErrorMessage; // ignore: deprecated_member_use
+  @$core.Deprecated(
+  'Using this can add significant overhead to your binary. '
+  'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+  'Will be removed in next major version')
+  ErrorMessage copyWith(void Function(ErrorMessage) updates) => super.copyWith((message) => updates(message as ErrorMessage)) as ErrorMessage; // ignore: deprecated_member_use
   $pb.BuilderInfo get info_ => _i;
   @$core.pragma('dart2js:noInline')
   static ErrorMessage create() => ErrorMessage._();
   ErrorMessage createEmptyInstance() => create();
-  static $pb.PbList<ErrorMessage> createRepeated() =>
-      $pb.PbList<ErrorMessage>();
+  static $pb.PbList<ErrorMessage> createRepeated() => $pb.PbList<ErrorMessage>();
   @$core.pragma('dart2js:noInline')
-  static ErrorMessage getDefault() => _defaultInstance ??=
-      $pb.GeneratedMessage.$_defaultFor<ErrorMessage>(create);
-  static ErrorMessage _defaultInstance;
+  static ErrorMessage getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ErrorMessage>(create);
+  static ErrorMessage? _defaultInstance;
 
   @$pb.TagNumber(1)
   $core.String get message => $_getSZ(0);
   @$pb.TagNumber(1)
-  set message($core.String v) {
-    $_setString(0, v);
-  }
-
+  set message($core.String v) { $_setString(0, v); }
   @$pb.TagNumber(1)
   $core.bool hasMessage() => $_has(0);
   @$pb.TagNumber(1)
   void clearMessage() => clearField(1);
 }
+
diff --git a/lib/src/protos/dart_services.pbenum.dart b/lib/src/protos/dart_services.pbenum.dart
index 9598e3e..34dd349 100644
--- a/lib/src/protos/dart_services.pbenum.dart
+++ b/lib/src/protos/dart_services.pbenum.dart
@@ -2,5 +2,6 @@
 //  Generated code. Do not modify.
 //  source: protos/dart_services.proto
 //
-// @dart = 2.7
+// @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
+
diff --git a/lib/src/protos/dart_services.pbjson.dart b/lib/src/protos/dart_services.pbjson.dart
index 882922c..d7d7e78 100644
--- a/lib/src/protos/dart_services.pbjson.dart
+++ b/lib/src/protos/dart_services.pbjson.dart
@@ -2,500 +2,305 @@
 //  Generated code. Do not modify.
 //  source: protos/dart_services.proto
 //
-// @dart = 2.7
+// @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
 
 import 'dart:core' as $core;
 import 'dart:convert' as $convert;
 import 'dart:typed_data' as $typed_data;
-
 @$core.Deprecated('Use compileRequestDescriptor instead')
-const CompileRequest$json = {
+const CompileRequest$json = const {
   '1': 'CompileRequest',
-  '2': [
-    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
-    {'1': 'returnSourceMap', '3': 2, '4': 1, '5': 8, '10': 'returnSourceMap'},
+  '2': const [
+    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+    const {'1': 'returnSourceMap', '3': 2, '4': 1, '5': 8, '10': 'returnSourceMap'},
   ],
 };
 
 /// Descriptor for `CompileRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileRequestDescriptor = $convert.base64Decode(
-    'Cg5Db21waWxlUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZRIoCg9yZXR1cm5Tb3VyY2VNYXAYAiABKAhSD3JldHVyblNvdXJjZU1hcA==');
+final $typed_data.Uint8List compileRequestDescriptor = $convert.base64Decode('Cg5Db21waWxlUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZRIoCg9yZXR1cm5Tb3VyY2VNYXAYAiABKAhSD3JldHVyblNvdXJjZU1hcA==');
 @$core.Deprecated('Use compileDDCRequestDescriptor instead')
-const CompileDDCRequest$json = {
+const CompileDDCRequest$json = const {
   '1': 'CompileDDCRequest',
-  '2': [
-    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+  '2': const [
+    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
   ],
 };
 
 /// Descriptor for `CompileDDCRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileDDCRequestDescriptor = $convert.base64Decode(
-    'ChFDb21waWxlRERDUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZQ==');
+final $typed_data.Uint8List compileDDCRequestDescriptor = $convert.base64Decode('ChFDb21waWxlRERDUmVxdWVzdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZQ==');
 @$core.Deprecated('Use sourceRequestDescriptor instead')
-const SourceRequest$json = {
+const SourceRequest$json = const {
   '1': 'SourceRequest',
-  '2': [
-    {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
-    {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
+  '2': const [
+    const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
+    const {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
   ],
 };
 
 /// Descriptor for `SourceRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List sourceRequestDescriptor = $convert.base64Decode(
-    'Cg1Tb3VyY2VSZXF1ZXN0EhYKBnNvdXJjZRgBIAEoCVIGc291cmNlEhYKBm9mZnNldBgCIAEoBVIGb2Zmc2V0');
+final $typed_data.Uint8List sourceRequestDescriptor = $convert.base64Decode('Cg1Tb3VyY2VSZXF1ZXN0EhYKBnNvdXJjZRgBIAEoCVIGc291cmNlEhYKBm9mZnNldBgCIAEoBVIGb2Zmc2V0');
 @$core.Deprecated('Use analysisResultsDescriptor instead')
-const AnalysisResults$json = {
+const AnalysisResults$json = const {
   '1': 'AnalysisResults',
-  '2': [
-    {
-      '1': 'issues',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.AnalysisIssue',
-      '10': 'issues'
-    },
-    {'1': 'packageImports', '3': 2, '4': 3, '5': 9, '10': 'packageImports'},
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'issues', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.AnalysisIssue', '10': 'issues'},
+    const {'1': 'packageImports', '3': 2, '4': 3, '5': 9, '10': 'packageImports'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `AnalysisResults`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List analysisResultsDescriptor = $convert.base64Decode(
-    'Cg9BbmFseXNpc1Jlc3VsdHMSOAoGaXNzdWVzGAEgAygLMiAuZGFydF9zZXJ2aWNlcy5hcGkuQW5hbHlzaXNJc3N1ZVIGaXNzdWVzEiYKDnBhY2thZ2VJbXBvcnRzGAIgAygJUg5wYWNrYWdlSW1wb3J0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List analysisResultsDescriptor = $convert.base64Decode('Cg9BbmFseXNpc1Jlc3VsdHMSOAoGaXNzdWVzGAEgAygLMiAuZGFydF9zZXJ2aWNlcy5hcGkuQW5hbHlzaXNJc3N1ZVIGaXNzdWVzEiYKDnBhY2thZ2VJbXBvcnRzGAIgAygJUg5wYWNrYWdlSW1wb3J0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use analysisIssueDescriptor instead')
-const AnalysisIssue$json = {
+const AnalysisIssue$json = const {
   '1': 'AnalysisIssue',
-  '2': [
-    {'1': 'kind', '3': 1, '4': 1, '5': 9, '10': 'kind'},
-    {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
-    {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},
-    {'1': 'sourceName', '3': 4, '4': 1, '5': 9, '10': 'sourceName'},
-    {'1': 'hasFixes', '3': 5, '4': 1, '5': 8, '10': 'hasFixes'},
-    {'1': 'charStart', '3': 6, '4': 1, '5': 5, '10': 'charStart'},
-    {'1': 'charLength', '3': 7, '4': 1, '5': 5, '10': 'charLength'},
-    {'1': 'url', '3': 8, '4': 1, '5': 9, '10': 'url'},
-    {
-      '1': 'diagnosticMessages',
-      '3': 9,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.DiagnosticMessage',
-      '10': 'diagnosticMessages'
-    },
-    {'1': 'correction', '3': 10, '4': 1, '5': 9, '10': 'correction'},
+  '2': const [
+    const {'1': 'kind', '3': 1, '4': 1, '5': 9, '10': 'kind'},
+    const {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
+    const {'1': 'message', '3': 3, '4': 1, '5': 9, '10': 'message'},
+    const {'1': 'sourceName', '3': 4, '4': 1, '5': 9, '10': 'sourceName'},
+    const {'1': 'hasFixes', '3': 5, '4': 1, '5': 8, '10': 'hasFixes'},
+    const {'1': 'charStart', '3': 6, '4': 1, '5': 5, '10': 'charStart'},
+    const {'1': 'charLength', '3': 7, '4': 1, '5': 5, '10': 'charLength'},
+    const {'1': 'url', '3': 8, '4': 1, '5': 9, '10': 'url'},
+    const {'1': 'diagnosticMessages', '3': 9, '4': 3, '5': 11, '6': '.dart_services.api.DiagnosticMessage', '10': 'diagnosticMessages'},
+    const {'1': 'correction', '3': 10, '4': 1, '5': 9, '10': 'correction'},
   ],
 };
 
 /// Descriptor for `AnalysisIssue`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List analysisIssueDescriptor = $convert.base64Decode(
-    'Cg1BbmFseXNpc0lzc3VlEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEbGluZRgCIAEoBVIEbGluZRIYCgdtZXNzYWdlGAMgASgJUgdtZXNzYWdlEh4KCnNvdXJjZU5hbWUYBCABKAlSCnNvdXJjZU5hbWUSGgoIaGFzRml4ZXMYBSABKAhSCGhhc0ZpeGVzEhwKCWNoYXJTdGFydBgGIAEoBVIJY2hhclN0YXJ0Eh4KCmNoYXJMZW5ndGgYByABKAVSCmNoYXJMZW5ndGgSEAoDdXJsGAggASgJUgN1cmwSVAoSZGlhZ25vc3RpY01lc3NhZ2VzGAkgAygLMiQuZGFydF9zZXJ2aWNlcy5hcGkuRGlhZ25vc3RpY01lc3NhZ2VSEmRpYWdub3N0aWNNZXNzYWdlcxIeCgpjb3JyZWN0aW9uGAogASgJUgpjb3JyZWN0aW9u');
+final $typed_data.Uint8List analysisIssueDescriptor = $convert.base64Decode('Cg1BbmFseXNpc0lzc3VlEhIKBGtpbmQYASABKAlSBGtpbmQSEgoEbGluZRgCIAEoBVIEbGluZRIYCgdtZXNzYWdlGAMgASgJUgdtZXNzYWdlEh4KCnNvdXJjZU5hbWUYBCABKAlSCnNvdXJjZU5hbWUSGgoIaGFzRml4ZXMYBSABKAhSCGhhc0ZpeGVzEhwKCWNoYXJTdGFydBgGIAEoBVIJY2hhclN0YXJ0Eh4KCmNoYXJMZW5ndGgYByABKAVSCmNoYXJMZW5ndGgSEAoDdXJsGAggASgJUgN1cmwSVAoSZGlhZ25vc3RpY01lc3NhZ2VzGAkgAygLMiQuZGFydF9zZXJ2aWNlcy5hcGkuRGlhZ25vc3RpY01lc3NhZ2VSEmRpYWdub3N0aWNNZXNzYWdlcxIeCgpjb3JyZWN0aW9uGAogASgJUgpjb3JyZWN0aW9u');
 @$core.Deprecated('Use diagnosticMessageDescriptor instead')
-const DiagnosticMessage$json = {
+const DiagnosticMessage$json = const {
   '1': 'DiagnosticMessage',
-  '2': [
-    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
-    {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
-    {'1': 'charStart', '3': 3, '4': 1, '5': 5, '10': 'charStart'},
-    {'1': 'charLength', '3': 4, '4': 1, '5': 5, '10': 'charLength'},
+  '2': const [
+    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+    const {'1': 'line', '3': 2, '4': 1, '5': 5, '10': 'line'},
+    const {'1': 'charStart', '3': 3, '4': 1, '5': 5, '10': 'charStart'},
+    const {'1': 'charLength', '3': 4, '4': 1, '5': 5, '10': 'charLength'},
   ],
 };
 
 /// Descriptor for `DiagnosticMessage`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List diagnosticMessageDescriptor = $convert.base64Decode(
-    'ChFEaWFnbm9zdGljTWVzc2FnZRIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlEhIKBGxpbmUYAiABKAVSBGxpbmUSHAoJY2hhclN0YXJ0GAMgASgFUgljaGFyU3RhcnQSHgoKY2hhckxlbmd0aBgEIAEoBVIKY2hhckxlbmd0aA==');
+final $typed_data.Uint8List diagnosticMessageDescriptor = $convert.base64Decode('ChFEaWFnbm9zdGljTWVzc2FnZRIYCgdtZXNzYWdlGAEgASgJUgdtZXNzYWdlEhIKBGxpbmUYAiABKAVSBGxpbmUSHAoJY2hhclN0YXJ0GAMgASgFUgljaGFyU3RhcnQSHgoKY2hhckxlbmd0aBgEIAEoBVIKY2hhckxlbmd0aA==');
 @$core.Deprecated('Use versionRequestDescriptor instead')
-const VersionRequest$json = {
+const VersionRequest$json = const {
   '1': 'VersionRequest',
 };
 
 /// Descriptor for `VersionRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List versionRequestDescriptor =
-    $convert.base64Decode('Cg5WZXJzaW9uUmVxdWVzdA==');
+final $typed_data.Uint8List versionRequestDescriptor = $convert.base64Decode('Cg5WZXJzaW9uUmVxdWVzdA==');
 @$core.Deprecated('Use compileResponseDescriptor instead')
-const CompileResponse$json = {
+const CompileResponse$json = const {
   '1': 'CompileResponse',
-  '2': [
-    {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
-    {'1': 'sourceMap', '3': 2, '4': 1, '5': 9, '10': 'sourceMap'},
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
+    const {'1': 'sourceMap', '3': 2, '4': 1, '5': 9, '10': 'sourceMap'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `CompileResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileResponseDescriptor = $convert.base64Decode(
-    'Cg9Db21waWxlUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSHAoJc291cmNlTWFwGAIgASgJUglzb3VyY2VNYXASNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
+final $typed_data.Uint8List compileResponseDescriptor = $convert.base64Decode('Cg9Db21waWxlUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSHAoJc291cmNlTWFwGAIgASgJUglzb3VyY2VNYXASNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
 @$core.Deprecated('Use compileDDCResponseDescriptor instead')
-const CompileDDCResponse$json = {
+const CompileDDCResponse$json = const {
   '1': 'CompileDDCResponse',
-  '2': [
-    {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
-    {'1': 'modulesBaseUrl', '3': 2, '4': 1, '5': 9, '10': 'modulesBaseUrl'},
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'result', '3': 1, '4': 1, '5': 9, '10': 'result'},
+    const {'1': 'modulesBaseUrl', '3': 2, '4': 1, '5': 9, '10': 'modulesBaseUrl'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `CompileDDCResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List compileDDCResponseDescriptor = $convert.base64Decode(
-    'ChJDb21waWxlRERDUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSJgoObW9kdWxlc0Jhc2VVcmwYAiABKAlSDm1vZHVsZXNCYXNlVXJsEjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
+final $typed_data.Uint8List compileDDCResponseDescriptor = $convert.base64Decode('ChJDb21waWxlRERDUmVzcG9uc2USFgoGcmVzdWx0GAEgASgJUgZyZXN1bHQSJgoObW9kdWxlc0Jhc2VVcmwYAiABKAlSDm1vZHVsZXNCYXNlVXJsEjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
 @$core.Deprecated('Use documentResponseDescriptor instead')
-const DocumentResponse$json = {
+const DocumentResponse$json = const {
   '1': 'DocumentResponse',
-  '2': [
-    {
-      '1': 'info',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.DocumentResponse.InfoEntry',
-      '10': 'info'
-    },
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'info', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.DocumentResponse.InfoEntry', '10': 'info'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
-  '3': [DocumentResponse_InfoEntry$json],
+  '3': const [DocumentResponse_InfoEntry$json],
 };
 
 @$core.Deprecated('Use documentResponseDescriptor instead')
-const DocumentResponse_InfoEntry$json = {
+const DocumentResponse_InfoEntry$json = const {
   '1': 'InfoEntry',
-  '2': [
-    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
   ],
-  '7': {'7': true},
+  '7': const {'7': true},
 };
 
 /// Descriptor for `DocumentResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List documentResponseDescriptor = $convert.base64Decode(
-    'ChBEb2N1bWVudFJlc3BvbnNlEkEKBGluZm8YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Eb2N1bWVudFJlc3BvbnNlLkluZm9FbnRyeVIEaW5mbxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3IaNwoJSW5mb0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');
+final $typed_data.Uint8List documentResponseDescriptor = $convert.base64Decode('ChBEb2N1bWVudFJlc3BvbnNlEkEKBGluZm8YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Eb2N1bWVudFJlc3BvbnNlLkluZm9FbnRyeVIEaW5mbxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3IaNwoJSW5mb0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');
 @$core.Deprecated('Use completeResponseDescriptor instead')
-const CompleteResponse$json = {
+const CompleteResponse$json = const {
   '1': 'CompleteResponse',
-  '2': [
-    {
-      '1': 'replacementOffset',
-      '3': 1,
-      '4': 1,
-      '5': 5,
-      '10': 'replacementOffset'
-    },
-    {
-      '1': 'replacementLength',
-      '3': 2,
-      '4': 1,
-      '5': 5,
-      '10': 'replacementLength'
-    },
-    {
-      '1': 'completions',
-      '3': 3,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.Completion',
-      '10': 'completions'
-    },
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'replacementOffset', '3': 1, '4': 1, '5': 5, '10': 'replacementOffset'},
+    const {'1': 'replacementLength', '3': 2, '4': 1, '5': 5, '10': 'replacementLength'},
+    const {'1': 'completions', '3': 3, '4': 3, '5': 11, '6': '.dart_services.api.Completion', '10': 'completions'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `CompleteResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List completeResponseDescriptor = $convert.base64Decode(
-    'ChBDb21wbGV0ZVJlc3BvbnNlEiwKEXJlcGxhY2VtZW50T2Zmc2V0GAEgASgFUhFyZXBsYWNlbWVudE9mZnNldBIsChFyZXBsYWNlbWVudExlbmd0aBgCIAEoBVIRcmVwbGFjZW1lbnRMZW5ndGgSPwoLY29tcGxldGlvbnMYAyADKAsyHS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uUgtjb21wbGV0aW9ucxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List completeResponseDescriptor = $convert.base64Decode('ChBDb21wbGV0ZVJlc3BvbnNlEiwKEXJlcGxhY2VtZW50T2Zmc2V0GAEgASgFUhFyZXBsYWNlbWVudE9mZnNldBIsChFyZXBsYWNlbWVudExlbmd0aBgCIAEoBVIRcmVwbGFjZW1lbnRMZW5ndGgSPwoLY29tcGxldGlvbnMYAyADKAsyHS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uUgtjb21wbGV0aW9ucxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use completionDescriptor instead')
-const Completion$json = {
+const Completion$json = const {
   '1': 'Completion',
-  '2': [
-    {
-      '1': 'completion',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.Completion.CompletionEntry',
-      '10': 'completion'
-    },
+  '2': const [
+    const {'1': 'completion', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.Completion.CompletionEntry', '10': 'completion'},
   ],
-  '3': [Completion_CompletionEntry$json],
+  '3': const [Completion_CompletionEntry$json],
 };
 
 @$core.Deprecated('Use completionDescriptor instead')
-const Completion_CompletionEntry$json = {
+const Completion_CompletionEntry$json = const {
   '1': 'CompletionEntry',
-  '2': [
-    {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
-    {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
   ],
-  '7': {'7': true},
+  '7': const {'7': true},
 };
 
 /// Descriptor for `Completion`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List completionDescriptor = $convert.base64Decode(
-    'CgpDb21wbGV0aW9uEk0KCmNvbXBsZXRpb24YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uLkNvbXBsZXRpb25FbnRyeVIKY29tcGxldGlvbho9Cg9Db21wbGV0aW9uRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');
+final $typed_data.Uint8List completionDescriptor = $convert.base64Decode('CgpDb21wbGV0aW9uEk0KCmNvbXBsZXRpb24YASADKAsyLS5kYXJ0X3NlcnZpY2VzLmFwaS5Db21wbGV0aW9uLkNvbXBsZXRpb25FbnRyeVIKY29tcGxldGlvbho9Cg9Db21wbGV0aW9uRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4AQ==');
 @$core.Deprecated('Use fixesResponseDescriptor instead')
-const FixesResponse$json = {
+const FixesResponse$json = const {
   '1': 'FixesResponse',
-  '2': [
-    {
-      '1': 'fixes',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.ProblemAndFixes',
-      '10': 'fixes'
-    },
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'fixes', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.ProblemAndFixes', '10': 'fixes'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `FixesResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List fixesResponseDescriptor = $convert.base64Decode(
-    'Cg1GaXhlc1Jlc3BvbnNlEjgKBWZpeGVzGAEgAygLMiIuZGFydF9zZXJ2aWNlcy5hcGkuUHJvYmxlbUFuZEZpeGVzUgVmaXhlcxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List fixesResponseDescriptor = $convert.base64Decode('Cg1GaXhlc1Jlc3BvbnNlEjgKBWZpeGVzGAEgAygLMiIuZGFydF9zZXJ2aWNlcy5hcGkuUHJvYmxlbUFuZEZpeGVzUgVmaXhlcxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use problemAndFixesDescriptor instead')
-const ProblemAndFixes$json = {
+const ProblemAndFixes$json = const {
   '1': 'ProblemAndFixes',
-  '2': [
-    {
-      '1': 'fixes',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.CandidateFix',
-      '10': 'fixes'
-    },
-    {'1': 'problemMessage', '3': 2, '4': 1, '5': 9, '10': 'problemMessage'},
-    {'1': 'offset', '3': 3, '4': 1, '5': 5, '10': 'offset'},
-    {'1': 'length', '3': 4, '4': 1, '5': 5, '10': 'length'},
+  '2': const [
+    const {'1': 'fixes', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.CandidateFix', '10': 'fixes'},
+    const {'1': 'problemMessage', '3': 2, '4': 1, '5': 9, '10': 'problemMessage'},
+    const {'1': 'offset', '3': 3, '4': 1, '5': 5, '10': 'offset'},
+    const {'1': 'length', '3': 4, '4': 1, '5': 5, '10': 'length'},
   ],
 };
 
 /// Descriptor for `ProblemAndFixes`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List problemAndFixesDescriptor = $convert.base64Decode(
-    'Cg9Qcm9ibGVtQW5kRml4ZXMSNQoFZml4ZXMYASADKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5DYW5kaWRhdGVGaXhSBWZpeGVzEiYKDnByb2JsZW1NZXNzYWdlGAIgASgJUg5wcm9ibGVtTWVzc2FnZRIWCgZvZmZzZXQYAyABKAVSBm9mZnNldBIWCgZsZW5ndGgYBCABKAVSBmxlbmd0aA==');
+final $typed_data.Uint8List problemAndFixesDescriptor = $convert.base64Decode('Cg9Qcm9ibGVtQW5kRml4ZXMSNQoFZml4ZXMYASADKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5DYW5kaWRhdGVGaXhSBWZpeGVzEiYKDnByb2JsZW1NZXNzYWdlGAIgASgJUg5wcm9ibGVtTWVzc2FnZRIWCgZvZmZzZXQYAyABKAVSBm9mZnNldBIWCgZsZW5ndGgYBCABKAVSBmxlbmd0aA==');
 @$core.Deprecated('Use candidateFixDescriptor instead')
-const CandidateFix$json = {
+const CandidateFix$json = const {
   '1': 'CandidateFix',
-  '2': [
-    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
-    {
-      '1': 'edits',
-      '3': 2,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.SourceEdit',
-      '10': 'edits'
-    },
-    {'1': 'selectionOffset', '3': 3, '4': 1, '5': 5, '10': 'selectionOffset'},
-    {
-      '1': 'linkedEditGroups',
-      '3': 4,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.LinkedEditGroup',
-      '10': 'linkedEditGroups'
-    },
+  '2': const [
+    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+    const {'1': 'edits', '3': 2, '4': 3, '5': 11, '6': '.dart_services.api.SourceEdit', '10': 'edits'},
+    const {'1': 'selectionOffset', '3': 3, '4': 1, '5': 5, '10': 'selectionOffset'},
+    const {'1': 'linkedEditGroups', '3': 4, '4': 3, '5': 11, '6': '.dart_services.api.LinkedEditGroup', '10': 'linkedEditGroups'},
   ],
 };
 
 /// Descriptor for `CandidateFix`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List candidateFixDescriptor = $convert.base64Decode(
-    'CgxDYW5kaWRhdGVGaXgSGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZRIzCgVlZGl0cxgCIAMoCzIdLmRhcnRfc2VydmljZXMuYXBpLlNvdXJjZUVkaXRSBWVkaXRzEigKD3NlbGVjdGlvbk9mZnNldBgDIAEoBVIPc2VsZWN0aW9uT2Zmc2V0Ek4KEGxpbmtlZEVkaXRHcm91cHMYBCADKAsyIi5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0R3JvdXBSEGxpbmtlZEVkaXRHcm91cHM=');
+final $typed_data.Uint8List candidateFixDescriptor = $convert.base64Decode('CgxDYW5kaWRhdGVGaXgSGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZRIzCgVlZGl0cxgCIAMoCzIdLmRhcnRfc2VydmljZXMuYXBpLlNvdXJjZUVkaXRSBWVkaXRzEigKD3NlbGVjdGlvbk9mZnNldBgDIAEoBVIPc2VsZWN0aW9uT2Zmc2V0Ek4KEGxpbmtlZEVkaXRHcm91cHMYBCADKAsyIi5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0R3JvdXBSEGxpbmtlZEVkaXRHcm91cHM=');
 @$core.Deprecated('Use sourceEditDescriptor instead')
-const SourceEdit$json = {
+const SourceEdit$json = const {
   '1': 'SourceEdit',
-  '2': [
-    {'1': 'offset', '3': 1, '4': 1, '5': 5, '10': 'offset'},
-    {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
-    {'1': 'replacement', '3': 3, '4': 1, '5': 9, '10': 'replacement'},
+  '2': const [
+    const {'1': 'offset', '3': 1, '4': 1, '5': 5, '10': 'offset'},
+    const {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
+    const {'1': 'replacement', '3': 3, '4': 1, '5': 9, '10': 'replacement'},
   ],
 };
 
 /// Descriptor for `SourceEdit`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List sourceEditDescriptor = $convert.base64Decode(
-    'CgpTb3VyY2VFZGl0EhYKBm9mZnNldBgBIAEoBVIGb2Zmc2V0EhYKBmxlbmd0aBgCIAEoBVIGbGVuZ3RoEiAKC3JlcGxhY2VtZW50GAMgASgJUgtyZXBsYWNlbWVudA==');
+final $typed_data.Uint8List sourceEditDescriptor = $convert.base64Decode('CgpTb3VyY2VFZGl0EhYKBm9mZnNldBgBIAEoBVIGb2Zmc2V0EhYKBmxlbmd0aBgCIAEoBVIGbGVuZ3RoEiAKC3JlcGxhY2VtZW50GAMgASgJUgtyZXBsYWNlbWVudA==');
 @$core.Deprecated('Use linkedEditGroupDescriptor instead')
-const LinkedEditGroup$json = {
+const LinkedEditGroup$json = const {
   '1': 'LinkedEditGroup',
-  '2': [
-    {'1': 'positions', '3': 1, '4': 3, '5': 5, '10': 'positions'},
-    {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
-    {
-      '1': 'suggestions',
-      '3': 3,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.LinkedEditSuggestion',
-      '10': 'suggestions'
-    },
+  '2': const [
+    const {'1': 'positions', '3': 1, '4': 3, '5': 5, '10': 'positions'},
+    const {'1': 'length', '3': 2, '4': 1, '5': 5, '10': 'length'},
+    const {'1': 'suggestions', '3': 3, '4': 3, '5': 11, '6': '.dart_services.api.LinkedEditSuggestion', '10': 'suggestions'},
   ],
 };
 
 /// Descriptor for `LinkedEditGroup`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List linkedEditGroupDescriptor = $convert.base64Decode(
-    'Cg9MaW5rZWRFZGl0R3JvdXASHAoJcG9zaXRpb25zGAEgAygFUglwb3NpdGlvbnMSFgoGbGVuZ3RoGAIgASgFUgZsZW5ndGgSSQoLc3VnZ2VzdGlvbnMYAyADKAsyJy5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0U3VnZ2VzdGlvblILc3VnZ2VzdGlvbnM=');
+final $typed_data.Uint8List linkedEditGroupDescriptor = $convert.base64Decode('Cg9MaW5rZWRFZGl0R3JvdXASHAoJcG9zaXRpb25zGAEgAygFUglwb3NpdGlvbnMSFgoGbGVuZ3RoGAIgASgFUgZsZW5ndGgSSQoLc3VnZ2VzdGlvbnMYAyADKAsyJy5kYXJ0X3NlcnZpY2VzLmFwaS5MaW5rZWRFZGl0U3VnZ2VzdGlvblILc3VnZ2VzdGlvbnM=');
 @$core.Deprecated('Use linkedEditSuggestionDescriptor instead')
-const LinkedEditSuggestion$json = {
+const LinkedEditSuggestion$json = const {
   '1': 'LinkedEditSuggestion',
-  '2': [
-    {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
-    {'1': 'kind', '3': 2, '4': 1, '5': 9, '10': 'kind'},
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
+    const {'1': 'kind', '3': 2, '4': 1, '5': 9, '10': 'kind'},
   ],
 };
 
 /// Descriptor for `LinkedEditSuggestion`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List linkedEditSuggestionDescriptor = $convert.base64Decode(
-    'ChRMaW5rZWRFZGl0U3VnZ2VzdGlvbhIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEa2luZBgCIAEoCVIEa2luZA==');
+final $typed_data.Uint8List linkedEditSuggestionDescriptor = $convert.base64Decode('ChRMaW5rZWRFZGl0U3VnZ2VzdGlvbhIUCgV2YWx1ZRgBIAEoCVIFdmFsdWUSEgoEa2luZBgCIAEoCVIEa2luZA==');
 @$core.Deprecated('Use formatResponseDescriptor instead')
-const FormatResponse$json = {
+const FormatResponse$json = const {
   '1': 'FormatResponse',
-  '2': [
-    {'1': 'newString', '3': 1, '4': 1, '5': 9, '10': 'newString'},
-    {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'newString', '3': 1, '4': 1, '5': 9, '10': 'newString'},
+    const {'1': 'offset', '3': 2, '4': 1, '5': 5, '10': 'offset'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `FormatResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List formatResponseDescriptor = $convert.base64Decode(
-    'Cg5Gb3JtYXRSZXNwb25zZRIcCgluZXdTdHJpbmcYASABKAlSCW5ld1N0cmluZxIWCgZvZmZzZXQYAiABKAVSBm9mZnNldBI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List formatResponseDescriptor = $convert.base64Decode('Cg5Gb3JtYXRSZXNwb25zZRIcCgluZXdTdHJpbmcYASABKAlSCW5ld1N0cmluZxIWCgZvZmZzZXQYAiABKAVSBm9mZnNldBI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use assistsResponseDescriptor instead')
-const AssistsResponse$json = {
+const AssistsResponse$json = const {
   '1': 'AssistsResponse',
-  '2': [
-    {
-      '1': 'assists',
-      '3': 1,
-      '4': 3,
-      '5': 11,
-      '6': '.dart_services.api.CandidateFix',
-      '10': 'assists'
-    },
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'assists', '3': 1, '4': 3, '5': 11, '6': '.dart_services.api.CandidateFix', '10': 'assists'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `AssistsResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List assistsResponseDescriptor = $convert.base64Decode(
-    'Cg9Bc3Npc3RzUmVzcG9uc2USOQoHYXNzaXN0cxgBIAMoCzIfLmRhcnRfc2VydmljZXMuYXBpLkNhbmRpZGF0ZUZpeFIHYXNzaXN0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
+final $typed_data.Uint8List assistsResponseDescriptor = $convert.base64Decode('Cg9Bc3Npc3RzUmVzcG9uc2USOQoHYXNzaXN0cxgBIAMoCzIfLmRhcnRfc2VydmljZXMuYXBpLkNhbmRpZGF0ZUZpeFIHYXNzaXN0cxI1CgVlcnJvchhjIAEoCzIfLmRhcnRfc2VydmljZXMuYXBpLkVycm9yTWVzc2FnZVIFZXJyb3I=');
 @$core.Deprecated('Use versionResponseDescriptor instead')
-const VersionResponse$json = {
+const VersionResponse$json = const {
   '1': 'VersionResponse',
-  '2': [
-    {'1': 'sdkVersion', '3': 1, '4': 1, '5': 9, '10': 'sdkVersion'},
-    {'1': 'sdkVersionFull', '3': 2, '4': 1, '5': 9, '10': 'sdkVersionFull'},
-    {'1': 'runtimeVersion', '3': 3, '4': 1, '5': 9, '10': 'runtimeVersion'},
-    {'1': 'appEngineVersion', '3': 4, '4': 1, '5': 9, '10': 'appEngineVersion'},
-    {'1': 'servicesVersion', '3': 5, '4': 1, '5': 9, '10': 'servicesVersion'},
-    {'1': 'flutterVersion', '3': 6, '4': 1, '5': 9, '10': 'flutterVersion'},
-    {
-      '1': 'flutterDartVersion',
-      '3': 7,
-      '4': 1,
-      '5': 9,
-      '10': 'flutterDartVersion'
-    },
-    {
-      '1': 'flutterDartVersionFull',
-      '3': 8,
-      '4': 1,
-      '5': 9,
-      '10': 'flutterDartVersionFull'
-    },
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'sdkVersion', '3': 1, '4': 1, '5': 9, '10': 'sdkVersion'},
+    const {'1': 'sdkVersionFull', '3': 2, '4': 1, '5': 9, '10': 'sdkVersionFull'},
+    const {'1': 'runtimeVersion', '3': 3, '4': 1, '5': 9, '10': 'runtimeVersion'},
+    const {'1': 'appEngineVersion', '3': 4, '4': 1, '5': 9, '10': 'appEngineVersion'},
+    const {'1': 'servicesVersion', '3': 5, '4': 1, '5': 9, '10': 'servicesVersion'},
+    const {'1': 'flutterVersion', '3': 6, '4': 1, '5': 9, '10': 'flutterVersion'},
+    const {'1': 'flutterDartVersion', '3': 7, '4': 1, '5': 9, '10': 'flutterDartVersion'},
+    const {'1': 'flutterDartVersionFull', '3': 8, '4': 1, '5': 9, '10': 'flutterDartVersionFull'},
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `VersionResponse`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List versionResponseDescriptor = $convert.base64Decode(
-    'Cg9WZXJzaW9uUmVzcG9uc2USHgoKc2RrVmVyc2lvbhgBIAEoCVIKc2RrVmVyc2lvbhImCg5zZGtWZXJzaW9uRnVsbBgCIAEoCVIOc2RrVmVyc2lvbkZ1bGwSJgoOcnVudGltZVZlcnNpb24YAyABKAlSDnJ1bnRpbWVWZXJzaW9uEioKEGFwcEVuZ2luZVZlcnNpb24YBCABKAlSEGFwcEVuZ2luZVZlcnNpb24SKAoPc2VydmljZXNWZXJzaW9uGAUgASgJUg9zZXJ2aWNlc1ZlcnNpb24SJgoOZmx1dHRlclZlcnNpb24YBiABKAlSDmZsdXR0ZXJWZXJzaW9uEi4KEmZsdXR0ZXJEYXJ0VmVyc2lvbhgHIAEoCVISZmx1dHRlckRhcnRWZXJzaW9uEjYKFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwYCCABKAlSFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwSNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
+final $typed_data.Uint8List versionResponseDescriptor = $convert.base64Decode('Cg9WZXJzaW9uUmVzcG9uc2USHgoKc2RrVmVyc2lvbhgBIAEoCVIKc2RrVmVyc2lvbhImCg5zZGtWZXJzaW9uRnVsbBgCIAEoCVIOc2RrVmVyc2lvbkZ1bGwSJgoOcnVudGltZVZlcnNpb24YAyABKAlSDnJ1bnRpbWVWZXJzaW9uEioKEGFwcEVuZ2luZVZlcnNpb24YBCABKAlSEGFwcEVuZ2luZVZlcnNpb24SKAoPc2VydmljZXNWZXJzaW9uGAUgASgJUg9zZXJ2aWNlc1ZlcnNpb24SJgoOZmx1dHRlclZlcnNpb24YBiABKAlSDmZsdXR0ZXJWZXJzaW9uEi4KEmZsdXR0ZXJEYXJ0VmVyc2lvbhgHIAEoCVISZmx1dHRlckRhcnRWZXJzaW9uEjYKFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwYCCABKAlSFmZsdXR0ZXJEYXJ0VmVyc2lvbkZ1bGwSNQoFZXJyb3IYYyABKAsyHy5kYXJ0X3NlcnZpY2VzLmFwaS5FcnJvck1lc3NhZ2VSBWVycm9y');
 @$core.Deprecated('Use badRequestDescriptor instead')
-const BadRequest$json = {
+const BadRequest$json = const {
   '1': 'BadRequest',
-  '2': [
-    {
-      '1': 'error',
-      '3': 99,
-      '4': 1,
-      '5': 11,
-      '6': '.dart_services.api.ErrorMessage',
-      '10': 'error'
-    },
+  '2': const [
+    const {'1': 'error', '3': 99, '4': 1, '5': 11, '6': '.dart_services.api.ErrorMessage', '10': 'error'},
   ],
 };
 
 /// Descriptor for `BadRequest`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List badRequestDescriptor = $convert.base64Decode(
-    'CgpCYWRSZXF1ZXN0EjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
+final $typed_data.Uint8List badRequestDescriptor = $convert.base64Decode('CgpCYWRSZXF1ZXN0EjUKBWVycm9yGGMgASgLMh8uZGFydF9zZXJ2aWNlcy5hcGkuRXJyb3JNZXNzYWdlUgVlcnJvcg==');
 @$core.Deprecated('Use errorMessageDescriptor instead')
-const ErrorMessage$json = {
+const ErrorMessage$json = const {
   '1': 'ErrorMessage',
-  '2': [
-    {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
+  '2': const [
+    const {'1': 'message', '3': 1, '4': 1, '5': 9, '10': 'message'},
   ],
 };
 
 /// Descriptor for `ErrorMessage`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List errorMessageDescriptor = $convert
-    .base64Decode('CgxFcnJvck1lc3NhZ2USGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZQ==');
+final $typed_data.Uint8List errorMessageDescriptor = $convert.base64Decode('CgxFcnJvck1lc3NhZ2USGAoHbWVzc2FnZRgBIAEoCVIHbWVzc2FnZQ==');
diff --git a/lib/src/protos/dart_services.pbserver.dart b/lib/src/protos/dart_services.pbserver.dart
index 02254b5..d48ef42 100644
--- a/lib/src/protos/dart_services.pbserver.dart
+++ b/lib/src/protos/dart_services.pbserver.dart
@@ -2,7 +2,8 @@
 //  Generated code. Do not modify.
 //  source: protos/dart_services.proto
 //
-// @dart = 2.7
+// @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
 
 export 'dart_services.pb.dart';
+
diff --git a/pubspec.lock b/pubspec.lock
index 98f4ffc..e1e1484 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,7 +7,7 @@
       name: _discoveryapis_commons
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.0"
+    version: "0.2.1"
   _fe_analyzer_shared:
     dependency: transitive
     description:
@@ -56,7 +56,7 @@
       name: async
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.4.2"
+    version: "2.5.0"
   bazel_worker:
     dependency: "direct main"
     description:
@@ -70,7 +70,7 @@
       name: boolean_selector
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.1.0"
   build:
     dependency: transitive
     description:
@@ -91,7 +91,7 @@
       name: build_daemon
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.7"
+    version: "2.1.8"
   build_resolvers:
     dependency: transitive
     description:
@@ -133,7 +133,7 @@
       name: charcode
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.3"
+    version: "1.2.0"
   checked_yaml:
     dependency: transitive
     description:
@@ -148,6 +148,13 @@
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.2.0"
+  clock:
+    dependency: transitive
+    description:
+      name: clock
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.1.0"
   code_builder:
     dependency: transitive
     description:
@@ -168,7 +175,7 @@
       name: collection
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.14.13"
+    version: "1.15.0"
   convert:
     dependency: transitive
     description:
@@ -322,28 +329,28 @@
       name: intl
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.16.1"
+    version: "0.17.0"
   io:
     dependency: transitive
     description:
       name: io
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.4"
+    version: "0.3.5"
   js:
     dependency: transitive
     description:
       name: js
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.6.2"
+    version: "0.6.3"
   json_annotation:
     dependency: transitive
     description:
       name: json_annotation
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.1.1"
+    version: "4.0.0"
   logging:
     dependency: "direct main"
     description:
@@ -357,14 +364,14 @@
       name: matcher
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.9"
+    version: "0.12.10"
   meta:
     dependency: "direct main"
     description:
       name: meta
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.4"
+    version: "1.3.0"
   mime:
     dependency: transitive
     description:
@@ -413,28 +420,28 @@
       name: path
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.7.0"
+    version: "1.8.0"
   pedantic:
     dependency: "direct dev"
     description:
       name: pedantic
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.9.2"
+    version: "1.11.0"
   pool:
     dependency: transitive
     description:
       name: pool
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.0"
+    version: "1.5.0"
   protobuf:
     dependency: "direct main"
     description:
       name: protobuf
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0"
+    version: "1.1.3"
   pub_semver:
     dependency: transitive
     description:
@@ -448,7 +455,7 @@
       name: pubspec_parse
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.7"
+    version: "0.1.8"
   quiver:
     dependency: "direct main"
     description:
@@ -497,63 +504,63 @@
       name: shelf_web_socket
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.4"
+    version: "0.2.4+1"
   source_gen:
     dependency: transitive
     description:
       name: source_gen
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.9.10+1"
+    version: "0.9.10+2"
   source_map_stack_trace:
     dependency: transitive
     description:
       name: source_map_stack_trace
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.1.0"
   source_maps:
     dependency: transitive
     description:
       name: source_maps
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.10.9"
+    version: "0.10.10"
   source_span:
     dependency: transitive
     description:
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.7.0"
+    version: "1.8.1"
   stack_trace:
     dependency: transitive
     description:
       name: stack_trace
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.9.6"
+    version: "1.10.0"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.1.0"
   stream_transform:
     dependency: transitive
     description:
       name: stream_transform
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0"
+    version: "2.0.0"
   string_scanner:
     dependency: transitive
     description:
       name: string_scanner
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.5"
+    version: "1.1.0"
   synchronized:
     dependency: "direct dev"
     description:
@@ -567,28 +574,28 @@
       name: term_glyph
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0"
+    version: "1.2.0"
   test:
     dependency: "direct dev"
     description:
       name: test
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.15.7"
+    version: "1.16.5"
   test_api:
     dependency: transitive
     description:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.18+1"
+    version: "0.2.19"
   test_core:
     dependency: transitive
     description:
       name: test_core
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.11+4"
+    version: "0.3.15"
   timing:
     dependency: transitive
     description:
@@ -602,14 +609,14 @@
       name: typed_data
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.0"
+    version: "1.3.0"
   vm_service:
     dependency: transitive
     description:
       name: vm_service
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.2.0"
+    version: "5.5.0"
   watcher:
     dependency: transitive
     description:
@@ -630,7 +637,7 @@
       name: webkit_inspection_protocol
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.7.4"
+    version: "0.7.5"
   yaml:
     dependency: transitive
     description:
@@ -639,4 +646,4 @@
     source: hosted
     version: "2.2.1"
 sdks:
-  dart: ">=2.10.4 <3.0.0"
+  dart: ">=2.12.0-0.0 <3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 18869a9..80888d9 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -2,7 +2,7 @@
 publish_to: none
 
 environment:
-  # Keep this aligned with .github/workflows/dart.yml and the FROM line of Dockerfile
+  # Lock to 2.10.x as this code base is not yet migrated to null safe.
   sdk: ^2.10.4
 
 dependencies:
