diff --git a/generated/googleapis/lib/adexchangebuyer/v1_3.dart b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
index 53414cf..9e74b9a 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_3.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
@@ -1963,7 +1963,7 @@
       price = _json['price'] as core.String;
     }
     if (_json.containsKey('starRating')) {
-      starRating = _json['starRating'].toDouble();
+      starRating = (_json['starRating'] as core.num).toDouble();
     }
   }
 
@@ -2121,7 +2121,8 @@
       agencyId = _json['agencyId'] as core.String;
     }
     if (_json.containsKey('apiUploadTimestamp')) {
-      apiUploadTimestamp = core.DateTime.parse(_json['apiUploadTimestamp']);
+      apiUploadTimestamp =
+          core.DateTime.parse(_json['apiUploadTimestamp'] as core.String);
     }
     if (_json.containsKey('attribute')) {
       attribute = (_json['attribute'] as core.List)
@@ -2615,10 +2616,10 @@
 
   PerformanceReport.fromJson(core.Map _json) {
     if (_json.containsKey('bidRate')) {
-      bidRate = _json['bidRate'].toDouble();
+      bidRate = (_json['bidRate'] as core.num).toDouble();
     }
     if (_json.containsKey('bidRequestRate')) {
-      bidRequestRate = _json['bidRequestRate'].toDouble();
+      bidRequestRate = (_json['bidRequestRate'] as core.num).toDouble();
     }
     if (_json.containsKey('calloutStatusRate')) {
       calloutStatusRate = (_json['calloutStatusRate'] as core.List)
@@ -2636,7 +2637,7 @@
           .toList();
     }
     if (_json.containsKey('filteredBidRate')) {
-      filteredBidRate = _json['filteredBidRate'].toDouble();
+      filteredBidRate = (_json['filteredBidRate'] as core.num).toDouble();
     }
     if (_json.containsKey('hostedMatchStatusRate')) {
       hostedMatchStatusRate = (_json['hostedMatchStatusRate'] as core.List)
@@ -2644,49 +2645,57 @@
           .toList();
     }
     if (_json.containsKey('inventoryMatchRate')) {
-      inventoryMatchRate = _json['inventoryMatchRate'].toDouble();
+      inventoryMatchRate = (_json['inventoryMatchRate'] as core.num).toDouble();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('latency50thPercentile')) {
-      latency50thPercentile = _json['latency50thPercentile'].toDouble();
+      latency50thPercentile =
+          (_json['latency50thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('latency85thPercentile')) {
-      latency85thPercentile = _json['latency85thPercentile'].toDouble();
+      latency85thPercentile =
+          (_json['latency85thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('latency95thPercentile')) {
-      latency95thPercentile = _json['latency95thPercentile'].toDouble();
+      latency95thPercentile =
+          (_json['latency95thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('noQuotaInRegion')) {
-      noQuotaInRegion = _json['noQuotaInRegion'].toDouble();
+      noQuotaInRegion = (_json['noQuotaInRegion'] as core.num).toDouble();
     }
     if (_json.containsKey('outOfQuota')) {
-      outOfQuota = _json['outOfQuota'].toDouble();
+      outOfQuota = (_json['outOfQuota'] as core.num).toDouble();
     }
     if (_json.containsKey('pixelMatchRequests')) {
-      pixelMatchRequests = _json['pixelMatchRequests'].toDouble();
+      pixelMatchRequests = (_json['pixelMatchRequests'] as core.num).toDouble();
     }
     if (_json.containsKey('pixelMatchResponses')) {
-      pixelMatchResponses = _json['pixelMatchResponses'].toDouble();
+      pixelMatchResponses =
+          (_json['pixelMatchResponses'] as core.num).toDouble();
     }
     if (_json.containsKey('quotaConfiguredLimit')) {
-      quotaConfiguredLimit = _json['quotaConfiguredLimit'].toDouble();
+      quotaConfiguredLimit =
+          (_json['quotaConfiguredLimit'] as core.num).toDouble();
     }
     if (_json.containsKey('quotaThrottledLimit')) {
-      quotaThrottledLimit = _json['quotaThrottledLimit'].toDouble();
+      quotaThrottledLimit =
+          (_json['quotaThrottledLimit'] as core.num).toDouble();
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
     }
     if (_json.containsKey('successfulRequestRate')) {
-      successfulRequestRate = _json['successfulRequestRate'].toDouble();
+      successfulRequestRate =
+          (_json['successfulRequestRate'] as core.num).toDouble();
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
     }
     if (_json.containsKey('unsuccessfulRequestRate')) {
-      unsuccessfulRequestRate = _json['unsuccessfulRequestRate'].toDouble();
+      unsuccessfulRequestRate =
+          (_json['unsuccessfulRequestRate'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_4.dart b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
index 2b7c171..2489aa5 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_4.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
@@ -3342,7 +3342,7 @@
       price = _json['price'] as core.String;
     }
     if (_json.containsKey('starRating')) {
-      starRating = _json['starRating'].toDouble();
+      starRating = (_json['starRating'] as core.num).toDouble();
     }
     if (_json.containsKey('videoURL')) {
       videoURL = _json['videoURL'] as core.String;
@@ -3701,7 +3701,8 @@
       agencyId = _json['agencyId'] as core.String;
     }
     if (_json.containsKey('apiUploadTimestamp')) {
-      apiUploadTimestamp = core.DateTime.parse(_json['apiUploadTimestamp']);
+      apiUploadTimestamp =
+          core.DateTime.parse(_json['apiUploadTimestamp'] as core.String);
     }
     if (_json.containsKey('attribute')) {
       attribute = (_json['attribute'] as core.List)
@@ -5428,10 +5429,10 @@
 
   PerformanceReport.fromJson(core.Map _json) {
     if (_json.containsKey('bidRate')) {
-      bidRate = _json['bidRate'].toDouble();
+      bidRate = (_json['bidRate'] as core.num).toDouble();
     }
     if (_json.containsKey('bidRequestRate')) {
-      bidRequestRate = _json['bidRequestRate'].toDouble();
+      bidRequestRate = (_json['bidRequestRate'] as core.num).toDouble();
     }
     if (_json.containsKey('calloutStatusRate')) {
       calloutStatusRate = (_json['calloutStatusRate'] as core.List)
@@ -5449,7 +5450,7 @@
           .toList();
     }
     if (_json.containsKey('filteredBidRate')) {
-      filteredBidRate = _json['filteredBidRate'].toDouble();
+      filteredBidRate = (_json['filteredBidRate'] as core.num).toDouble();
     }
     if (_json.containsKey('hostedMatchStatusRate')) {
       hostedMatchStatusRate = (_json['hostedMatchStatusRate'] as core.List)
@@ -5457,49 +5458,57 @@
           .toList();
     }
     if (_json.containsKey('inventoryMatchRate')) {
-      inventoryMatchRate = _json['inventoryMatchRate'].toDouble();
+      inventoryMatchRate = (_json['inventoryMatchRate'] as core.num).toDouble();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('latency50thPercentile')) {
-      latency50thPercentile = _json['latency50thPercentile'].toDouble();
+      latency50thPercentile =
+          (_json['latency50thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('latency85thPercentile')) {
-      latency85thPercentile = _json['latency85thPercentile'].toDouble();
+      latency85thPercentile =
+          (_json['latency85thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('latency95thPercentile')) {
-      latency95thPercentile = _json['latency95thPercentile'].toDouble();
+      latency95thPercentile =
+          (_json['latency95thPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('noQuotaInRegion')) {
-      noQuotaInRegion = _json['noQuotaInRegion'].toDouble();
+      noQuotaInRegion = (_json['noQuotaInRegion'] as core.num).toDouble();
     }
     if (_json.containsKey('outOfQuota')) {
-      outOfQuota = _json['outOfQuota'].toDouble();
+      outOfQuota = (_json['outOfQuota'] as core.num).toDouble();
     }
     if (_json.containsKey('pixelMatchRequests')) {
-      pixelMatchRequests = _json['pixelMatchRequests'].toDouble();
+      pixelMatchRequests = (_json['pixelMatchRequests'] as core.num).toDouble();
     }
     if (_json.containsKey('pixelMatchResponses')) {
-      pixelMatchResponses = _json['pixelMatchResponses'].toDouble();
+      pixelMatchResponses =
+          (_json['pixelMatchResponses'] as core.num).toDouble();
     }
     if (_json.containsKey('quotaConfiguredLimit')) {
-      quotaConfiguredLimit = _json['quotaConfiguredLimit'].toDouble();
+      quotaConfiguredLimit =
+          (_json['quotaConfiguredLimit'] as core.num).toDouble();
     }
     if (_json.containsKey('quotaThrottledLimit')) {
-      quotaThrottledLimit = _json['quotaThrottledLimit'].toDouble();
+      quotaThrottledLimit =
+          (_json['quotaThrottledLimit'] as core.num).toDouble();
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
     }
     if (_json.containsKey('successfulRequestRate')) {
-      successfulRequestRate = _json['successfulRequestRate'].toDouble();
+      successfulRequestRate =
+          (_json['successfulRequestRate'] as core.num).toDouble();
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
     }
     if (_json.containsKey('unsuccessfulRequestRate')) {
-      unsuccessfulRequestRate = _json['unsuccessfulRequestRate'].toDouble();
+      unsuccessfulRequestRate =
+          (_json['unsuccessfulRequestRate'] as core.num).toDouble();
     }
   }
 
@@ -6123,13 +6132,13 @@
 
   Price.fromJson(core.Map _json) {
     if (_json.containsKey('amountMicros')) {
-      amountMicros = _json['amountMicros'].toDouble();
+      amountMicros = (_json['amountMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
     }
     if (_json.containsKey('expectedCpmMicros')) {
-      expectedCpmMicros = _json['expectedCpmMicros'].toDouble();
+      expectedCpmMicros = (_json['expectedCpmMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('pricingType')) {
       pricingType = _json['pricingType'] as core.String;
diff --git a/generated/googleapis/lib/admin/datatransfer_v1.dart b/generated/googleapis/lib/admin/datatransfer_v1.dart
index 16fe8a8..806100d 100644
--- a/generated/googleapis/lib/admin/datatransfer_v1.dart
+++ b/generated/googleapis/lib/admin/datatransfer_v1.dart
@@ -621,7 +621,7 @@
           _json['overallTransferStatusCode'] as core.String;
     }
     if (_json.containsKey('requestTime')) {
-      requestTime = core.DateTime.parse(_json['requestTime']);
+      requestTime = core.DateTime.parse(_json['requestTime'] as core.String);
     }
   }
 
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index abf83ad..eae109b 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -7462,10 +7462,10 @@
 
   BuildingCoordinates.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -7865,7 +7865,7 @@
       activeTime = _json['activeTime'] as core.int;
     }
     if (_json.containsKey('date')) {
-      date = core.DateTime.parse(_json['date']);
+      date = core.DateTime.parse(_json['date'] as core.String);
     }
   }
 
@@ -7937,7 +7937,7 @@
               .toList();
     }
     if (_json.containsKey('reportTime')) {
-      reportTime = core.DateTime.parse(_json['reportTime']);
+      reportTime = core.DateTime.parse(_json['reportTime'] as core.String);
     }
   }
 
@@ -7974,7 +7974,7 @@
 
   ChromeOsDeviceDeviceFiles.fromJson(core.Map _json) {
     if (_json.containsKey('createTime')) {
-      createTime = core.DateTime.parse(_json['createTime']);
+      createTime = core.DateTime.parse(_json['createTime'] as core.String);
     }
     if (_json.containsKey('downloadUrl')) {
       downloadUrl = _json['downloadUrl'] as core.String;
@@ -8138,7 +8138,7 @@
 
   ChromeOsDeviceSystemRamFreeReports.fromJson(core.Map _json) {
     if (_json.containsKey('reportTime')) {
-      reportTime = core.DateTime.parse(_json['reportTime']);
+      reportTime = core.DateTime.parse(_json['reportTime'] as core.String);
     }
     if (_json.containsKey('systemRamFreeInfo')) {
       systemRamFreeInfo = (_json['systemRamFreeInfo'] as core.List)
@@ -8415,7 +8415,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastEnrollmentTime')) {
-      lastEnrollmentTime = core.DateTime.parse(_json['lastEnrollmentTime']);
+      lastEnrollmentTime =
+          core.DateTime.parse(_json['lastEnrollmentTime'] as core.String);
     }
     if (_json.containsKey('lastKnownNetwork')) {
       lastKnownNetwork = (_json['lastKnownNetwork'] as core.List)
@@ -8424,7 +8425,7 @@
           .toList();
     }
     if (_json.containsKey('lastSync')) {
-      lastSync = core.DateTime.parse(_json['lastSync']);
+      lastSync = core.DateTime.parse(_json['lastSync'] as core.String);
     }
     if (_json.containsKey('macAddress')) {
       macAddress = _json['macAddress'] as core.String;
@@ -8466,7 +8467,8 @@
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('supportEndDate')) {
-      supportEndDate = core.DateTime.parse(_json['supportEndDate']);
+      supportEndDate =
+          core.DateTime.parse(_json['supportEndDate'] as core.String);
     }
     if (_json.containsKey('systemRamFreeReports')) {
       systemRamFreeReports = (_json['systemRamFreeReports'] as core.List)
@@ -8752,7 +8754,8 @@
       alternateEmail = _json['alternateEmail'] as core.String;
     }
     if (_json.containsKey('customerCreationTime')) {
-      customerCreationTime = core.DateTime.parse(_json['customerCreationTime']);
+      customerCreationTime =
+          core.DateTime.parse(_json['customerCreationTime'] as core.String);
     }
     if (_json.containsKey('customerDomain')) {
       customerDomain = _json['customerDomain'] as core.String;
@@ -9832,7 +9835,7 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('firstSync')) {
-      firstSync = core.DateTime.parse(_json['firstSync']);
+      firstSync = core.DateTime.parse(_json['firstSync'] as core.String);
     }
     if (_json.containsKey('hardware')) {
       hardware = _json['hardware'] as core.String;
@@ -9850,7 +9853,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastSync')) {
-      lastSync = core.DateTime.parse(_json['lastSync']);
+      lastSync = core.DateTime.parse(_json['lastSync'] as core.String);
     }
     if (_json.containsKey('managedAccountIsOnOwnerProfile')) {
       managedAccountIsOnOwnerProfile =
@@ -10764,10 +10767,10 @@
 
   SchemaFieldSpecNumericIndexingSpec.fromJson(core.Map _json) {
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
   }
 
@@ -11311,7 +11314,7 @@
           _json['changePasswordAtNextLogin'] as core.bool;
     }
     if (_json.containsKey('creationTime')) {
-      creationTime = core.DateTime.parse(_json['creationTime']);
+      creationTime = core.DateTime.parse(_json['creationTime'] as core.String);
     }
     if (_json.containsKey('customSchemas')) {
       customSchemas = commons.mapMap<core.Map, UserCustomProperties>(
@@ -11322,7 +11325,7 @@
       customerId = _json['customerId'] as core.String;
     }
     if (_json.containsKey('deletionTime')) {
-      deletionTime = core.DateTime.parse(_json['deletionTime']);
+      deletionTime = core.DateTime.parse(_json['deletionTime'] as core.String);
     }
     if (_json.containsKey('emails')) {
       emails = _json['emails'] as core.Object;
@@ -11377,7 +11380,8 @@
       languages = _json['languages'] as core.Object;
     }
     if (_json.containsKey('lastLoginTime')) {
-      lastLoginTime = core.DateTime.parse(_json['lastLoginTime']);
+      lastLoginTime =
+          core.DateTime.parse(_json['lastLoginTime'] as core.String);
     }
     if (_json.containsKey('locations')) {
       locations = _json['locations'] as core.Object;
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index 3d9918d..b0c270f 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -1352,7 +1352,7 @@
       customerId = _json['customerId'] as core.String;
     }
     if (_json.containsKey('time')) {
-      time = core.DateTime.parse(_json['time']);
+      time = core.DateTime.parse(_json['time'] as core.String);
     }
     if (_json.containsKey('uniqueQualifier')) {
       uniqueQualifier = _json['uniqueQualifier'] as core.String;
@@ -1742,7 +1742,8 @@
       boolValue = _json['boolValue'] as core.bool;
     }
     if (_json.containsKey('datetimeValue')) {
-      datetimeValue = core.DateTime.parse(_json['datetimeValue']);
+      datetimeValue =
+          core.DateTime.parse(_json['datetimeValue'] as core.String);
     }
     if (_json.containsKey('intValue')) {
       intValue = _json['intValue'] as core.String;
diff --git a/generated/googleapis/lib/admob/v1.dart b/generated/googleapis/lib/admob/v1.dart
index 8d3f774..15d5544 100644
--- a/generated/googleapis/lib/admob/v1.dart
+++ b/generated/googleapis/lib/admob/v1.dart
@@ -1383,7 +1383,7 @@
 
   ReportRowMetricValue.fromJson(core.Map _json) {
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('integerValue')) {
       integerValue = _json['integerValue'] as core.String;
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index d910906..46b9fae 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -6731,7 +6731,7 @@
       childLink = AccountChildLink.fromJson(_json['childLink']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -6752,7 +6752,7 @@
       starred = _json['starred'] as core.bool;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
@@ -7563,7 +7563,7 @@
       childLink = CustomDataSourceChildLink.fromJson(_json['childLink']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -7600,7 +7600,7 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('uploadType')) {
       uploadType = _json['uploadType'] as core.String;
@@ -7840,7 +7840,7 @@
       active = _json['active'] as core.bool;
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -7864,7 +7864,7 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -8098,7 +8098,7 @@
       active = _json['active'] as core.bool;
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -8131,7 +8131,7 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -8774,7 +8774,7 @@
       url = _json['url'] as core.String;
     }
     if (_json.containsKey('weight')) {
-      weight = _json['weight'].toDouble();
+      weight = (_json['weight'] as core.num).toDouble();
     }
     if (_json.containsKey('won')) {
       won = _json['won'] as core.bool;
@@ -8946,7 +8946,7 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -8955,7 +8955,7 @@
       editableInGaUi = _json['editableInGaUi'] as core.bool;
     }
     if (_json.containsKey('endTime')) {
-      endTime = core.DateTime.parse(_json['endTime']);
+      endTime = core.DateTime.parse(_json['endTime'] as core.String);
     }
     if (_json.containsKey('equalWeighting')) {
       equalWeighting = _json['equalWeighting'] as core.bool;
@@ -9005,16 +9005,16 @@
       snippet = _json['snippet'] as core.String;
     }
     if (_json.containsKey('startTime')) {
-      startTime = core.DateTime.parse(_json['startTime']);
+      startTime = core.DateTime.parse(_json['startTime'] as core.String);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('trafficCoverage')) {
-      trafficCoverage = _json['trafficCoverage'].toDouble();
+      trafficCoverage = (_json['trafficCoverage'] as core.num).toDouble();
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('variations')) {
       variations = (_json['variations'] as core.List)
@@ -9026,7 +9026,8 @@
       webPropertyId = _json['webPropertyId'] as core.String;
     }
     if (_json.containsKey('winnerConfidenceLevel')) {
-      winnerConfidenceLevel = _json['winnerConfidenceLevel'].toDouble();
+      winnerConfidenceLevel =
+          (_json['winnerConfidenceLevel'] as core.num).toDouble();
     }
     if (_json.containsKey('winnerFound')) {
       winnerFound = _json['winnerFound'] as core.bool;
@@ -9566,7 +9567,7 @@
           FilterAdvancedDetails.fromJson(_json['advancedDetails']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('excludeDetails')) {
       excludeDetails = FilterExpression.fromJson(_json['excludeDetails']);
@@ -9601,7 +9602,7 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('uppercaseDetails')) {
       uppercaseDetails =
@@ -10845,7 +10846,7 @@
       active = _json['active'] as core.bool;
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('eventDetails')) {
       eventDetails = GoalEventDetails.fromJson(_json['eventDetails']);
@@ -10875,14 +10876,14 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('urlDestinationDetails')) {
       urlDestinationDetails =
           GoalUrlDestinationDetails.fromJson(_json['urlDestinationDetails']);
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
     if (_json.containsKey('visitNumPagesDetails')) {
       visitNumPagesDetails =
@@ -11957,7 +11958,7 @@
       childLink = ProfileChildLink.fromJson(_json['childLink']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('currency')) {
       currency = _json['currency'] as core.String;
@@ -12022,7 +12023,7 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -12965,7 +12966,7 @@
       audienceType = _json['audienceType'] as core.String;
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -12999,7 +13000,7 @@
               _json['stateBasedAudienceDefinition']);
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -13185,7 +13186,7 @@
 
   Segment.fromJson(core.Map _json) {
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('definition')) {
       definition = _json['definition'] as core.String;
@@ -13209,7 +13210,7 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
@@ -13468,7 +13469,7 @@
               _json['cloudStorageDownloadDetails']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('dimensions')) {
       dimensions = _json['dimensions'] as core.String;
@@ -13514,7 +13515,7 @@
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -13728,7 +13729,7 @@
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('uploadTime')) {
-      uploadTime = core.DateTime.parse(_json['uploadTime']);
+      uploadTime = core.DateTime.parse(_json['uploadTime'] as core.String);
     }
   }
 
@@ -13900,7 +13901,8 @@
 
   UserDeletionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deletionRequestTime')) {
-      deletionRequestTime = core.DateTime.parse(_json['deletionRequestTime']);
+      deletionRequestTime =
+          core.DateTime.parse(_json['deletionRequestTime'] as core.String);
     }
     if (_json.containsKey('firebaseProjectId')) {
       firebaseProjectId = _json['firebaseProjectId'] as core.String;
@@ -14397,7 +14399,7 @@
       childLink = WebpropertyChildLink.fromJson(_json['childLink']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('dataRetentionResetOnNewActivity')) {
       dataRetentionResetOnNewActivity =
@@ -14443,7 +14445,7 @@
       starred = _json['starred'] as core.bool;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('websiteUrl')) {
       websiteUrl = _json['websiteUrl'] as core.String;
diff --git a/generated/googleapis/lib/analyticsreporting/v4.dart b/generated/googleapis/lib/analyticsreporting/v4.dart
index 79059ce..d1a5bc9 100644
--- a/generated/googleapis/lib/analyticsreporting/v4.dart
+++ b/generated/googleapis/lib/analyticsreporting/v4.dart
@@ -1095,7 +1095,7 @@
       goalPreviousStep3 = _json['goalPreviousStep3'] as core.String;
     }
     if (_json.containsKey('goalValue')) {
-      goalValue = _json['goalValue'].toDouble();
+      goalValue = (_json['goalValue'] as core.num).toDouble();
     }
   }
 
@@ -1728,7 +1728,7 @@
 
   ProductData.fromJson(core.Map _json) {
     if (_json.containsKey('itemRevenue')) {
-      itemRevenue = _json['itemRevenue'].toDouble();
+      itemRevenue = (_json['itemRevenue'] as core.num).toDouble();
     }
     if (_json.containsKey('productName')) {
       productName = _json['productName'] as core.String;
@@ -2403,7 +2403,7 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('sampleRate')) {
-      sampleRate = _json['sampleRate'].toDouble();
+      sampleRate = (_json['sampleRate'] as core.num).toDouble();
     }
     if (_json.containsKey('sessions')) {
       sessions = (_json['sessions'] as core.List)
@@ -2898,13 +2898,14 @@
       transactionId = _json['transactionId'] as core.String;
     }
     if (_json.containsKey('transactionRevenue')) {
-      transactionRevenue = _json['transactionRevenue'].toDouble();
+      transactionRevenue = (_json['transactionRevenue'] as core.num).toDouble();
     }
     if (_json.containsKey('transactionShipping')) {
-      transactionShipping = _json['transactionShipping'].toDouble();
+      transactionShipping =
+          (_json['transactionShipping'] as core.num).toDouble();
     }
     if (_json.containsKey('transactionTax')) {
-      transactionTax = _json['transactionTax'].toDouble();
+      transactionTax = (_json['transactionTax'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/androidmanagement/v1.dart b/generated/googleapis/lib/androidmanagement/v1.dart
index 9c6c7fa..38b92e4 100644
--- a/generated/googleapis/lib/androidmanagement/v1.dart
+++ b/generated/googleapis/lib/androidmanagement/v1.dart
@@ -3565,13 +3565,13 @@
     if (_json.containsKey('batteryShutdownTemperatures')) {
       batteryShutdownTemperatures =
           (_json['batteryShutdownTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('batteryThrottlingTemperatures')) {
       batteryThrottlingTemperatures =
           (_json['batteryThrottlingTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('brand')) {
@@ -3579,13 +3579,13 @@
     }
     if (_json.containsKey('cpuShutdownTemperatures')) {
       cpuShutdownTemperatures = (_json['cpuShutdownTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('cpuThrottlingTemperatures')) {
       cpuThrottlingTemperatures =
           (_json['cpuThrottlingTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('deviceBasebandVersion')) {
@@ -3593,13 +3593,13 @@
     }
     if (_json.containsKey('gpuShutdownTemperatures')) {
       gpuShutdownTemperatures = (_json['gpuShutdownTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('gpuThrottlingTemperatures')) {
       gpuThrottlingTemperatures =
           (_json['gpuThrottlingTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('hardware')) {
@@ -3617,13 +3617,13 @@
     if (_json.containsKey('skinShutdownTemperatures')) {
       skinShutdownTemperatures =
           (_json['skinShutdownTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('skinThrottlingTemperatures')) {
       skinThrottlingTemperatures =
           (_json['skinThrottlingTemperatures'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
   }
@@ -3708,17 +3708,17 @@
   HardwareStatus.fromJson(core.Map _json) {
     if (_json.containsKey('batteryTemperatures')) {
       batteryTemperatures = (_json['batteryTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('cpuTemperatures')) {
       cpuTemperatures = (_json['cpuTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('cpuUsages')) {
       cpuUsages = (_json['cpuUsages'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('createTime')) {
@@ -3726,17 +3726,17 @@
     }
     if (_json.containsKey('fanSpeeds')) {
       fanSpeeds = (_json['fanSpeeds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('gpuTemperatures')) {
       gpuTemperatures = (_json['gpuTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('skinTemperatures')) {
       skinTemperatures = (_json['skinTemperatures'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -6136,7 +6136,7 @@
 
   PowerManagementEvent.fromJson(core.Map _json) {
     if (_json.containsKey('batteryLevel')) {
-      batteryLevel = _json['batteryLevel'].toDouble();
+      batteryLevel = (_json['batteryLevel'] as core.num).toDouble();
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
diff --git a/generated/googleapis/lib/androidpublisher/v3.dart b/generated/googleapis/lib/androidpublisher/v3.dart
index b63a18b..ff93f32 100644
--- a/generated/googleapis/lib/androidpublisher/v3.dart
+++ b/generated/googleapis/lib/androidpublisher/v3.dart
@@ -7081,7 +7081,7 @@
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('userFraction')) {
-      userFraction = _json['userFraction'].toDouble();
+      userFraction = (_json['userFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('versionCodes')) {
       versionCodes = (_json['versionCodes'] as core.List)
diff --git a/generated/googleapis/lib/apigee/v1.dart b/generated/googleapis/lib/apigee/v1.dart
index 3a39df1..cfed191 100644
--- a/generated/googleapis/lib/apigee/v1.dart
+++ b/generated/googleapis/lib/apigee/v1.dart
@@ -18722,7 +18722,7 @@
       sampler = _json['sampler'] as core.String;
     }
     if (_json.containsKey('samplingRate')) {
-      samplingRate = _json['samplingRate'].toDouble();
+      samplingRate = (_json['samplingRate'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/appengine/v1.dart b/generated/googleapis/lib/appengine/v1.dart
index d6ffee5..3340a69 100644
--- a/generated/googleapis/lib/appengine/v1.dart
+++ b/generated/googleapis/lib/appengine/v1.dart
@@ -3525,7 +3525,7 @@
       aggregationWindowLength = _json['aggregationWindowLength'] as core.String;
     }
     if (_json.containsKey('targetUtilization')) {
-      targetUtilization = _json['targetUtilization'].toDouble();
+      targetUtilization = (_json['targetUtilization'] as core.num).toDouble();
     }
   }
 
@@ -4335,7 +4335,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('qps')) {
-      qps = _json['qps'].toDouble();
+      qps = (_json['qps'] as core.num).toDouble();
     }
     if (_json.containsKey('requests')) {
       requests = _json['requests'] as core.int;
@@ -5726,16 +5726,16 @@
 
   Resources.fromJson(core.Map _json) {
     if (_json.containsKey('cpu')) {
-      cpu = _json['cpu'].toDouble();
+      cpu = (_json['cpu'] as core.num).toDouble();
     }
     if (_json.containsKey('diskGb')) {
-      diskGb = _json['diskGb'].toDouble();
+      diskGb = (_json['diskGb'] as core.num).toDouble();
     }
     if (_json.containsKey('kmsKeyReference')) {
       kmsKeyReference = _json['kmsKeyReference'] as core.String;
     }
     if (_json.containsKey('memoryGb')) {
-      memoryGb = _json['memoryGb'].toDouble();
+      memoryGb = (_json['memoryGb'] as core.num).toDouble();
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
@@ -5932,11 +5932,12 @@
       minInstances = _json['minInstances'] as core.int;
     }
     if (_json.containsKey('targetCpuUtilization')) {
-      targetCpuUtilization = _json['targetCpuUtilization'].toDouble();
+      targetCpuUtilization =
+          (_json['targetCpuUtilization'] as core.num).toDouble();
     }
     if (_json.containsKey('targetThroughputUtilization')) {
       targetThroughputUtilization =
-          _json['targetThroughputUtilization'].toDouble();
+          (_json['targetThroughputUtilization'] as core.num).toDouble();
     }
   }
 
@@ -6140,7 +6141,7 @@
     if (_json.containsKey('allocations')) {
       allocations = commons.mapMap<core.num, core.double>(
           _json['allocations'].cast<core.String, core.num>(),
-          (core.num item) => item.toDouble());
+          (core.num item) => (item as core.num).toDouble());
     }
     if (_json.containsKey('shardBy')) {
       shardBy = _json['shardBy'] as core.String;
@@ -6786,7 +6787,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('sizeGb')) {
-      sizeGb = _json['sizeGb'].toDouble();
+      sizeGb = (_json['sizeGb'] as core.num).toDouble();
     }
     if (_json.containsKey('volumeType')) {
       volumeType = _json['volumeType'] as core.String;
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index f8f23ac..6ae62b0 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -2567,25 +2567,25 @@
 
   AggregateClassificationMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('accuracy')) {
-      accuracy = _json['accuracy'].toDouble();
+      accuracy = (_json['accuracy'] as core.num).toDouble();
     }
     if (_json.containsKey('f1Score')) {
-      f1Score = _json['f1Score'].toDouble();
+      f1Score = (_json['f1Score'] as core.num).toDouble();
     }
     if (_json.containsKey('logLoss')) {
-      logLoss = _json['logLoss'].toDouble();
+      logLoss = (_json['logLoss'] as core.num).toDouble();
     }
     if (_json.containsKey('precision')) {
-      precision = _json['precision'].toDouble();
+      precision = (_json['precision'] as core.num).toDouble();
     }
     if (_json.containsKey('recall')) {
-      recall = _json['recall'].toDouble();
+      recall = (_json['recall'] as core.num).toDouble();
     }
     if (_json.containsKey('rocAuc')) {
-      rocAuc = _json['rocAuc'].toDouble();
+      rocAuc = (_json['rocAuc'] as core.num).toDouble();
     }
     if (_json.containsKey('threshold')) {
-      threshold = _json['threshold'].toDouble();
+      threshold = (_json['threshold'] as core.num).toDouble();
     }
   }
 
@@ -2695,16 +2695,17 @@
     if (_json.containsKey('autoRegressiveCoefficients')) {
       autoRegressiveCoefficients =
           (_json['autoRegressiveCoefficients'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
     if (_json.containsKey('interceptCoefficient')) {
-      interceptCoefficient = _json['interceptCoefficient'].toDouble();
+      interceptCoefficient =
+          (_json['interceptCoefficient'] as core.num).toDouble();
     }
     if (_json.containsKey('movingAverageCoefficients')) {
       movingAverageCoefficients =
           (_json['movingAverageCoefficients'] as core.List)
-              .map<core.double>((value) => value.toDouble())
+              .map<core.double>((value) => (value as core.num).toDouble())
               .toList();
     }
   }
@@ -2739,13 +2740,13 @@
 
   ArimaFittingMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('aic')) {
-      aic = _json['aic'].toDouble();
+      aic = (_json['aic'] as core.num).toDouble();
     }
     if (_json.containsKey('logLikelihood')) {
-      logLikelihood = _json['logLikelihood'].toDouble();
+      logLikelihood = (_json['logLikelihood'] as core.num).toDouble();
     }
     if (_json.containsKey('variance')) {
-      variance = _json['variance'].toDouble();
+      variance = (_json['variance'] as core.num).toDouble();
     }
   }
 
@@ -3513,10 +3514,10 @@
 
   BinaryConfusionMatrix.fromJson(core.Map _json) {
     if (_json.containsKey('accuracy')) {
-      accuracy = _json['accuracy'].toDouble();
+      accuracy = (_json['accuracy'] as core.num).toDouble();
     }
     if (_json.containsKey('f1Score')) {
-      f1Score = _json['f1Score'].toDouble();
+      f1Score = (_json['f1Score'] as core.num).toDouble();
     }
     if (_json.containsKey('falseNegatives')) {
       falseNegatives = _json['falseNegatives'] as core.String;
@@ -3525,13 +3526,14 @@
       falsePositives = _json['falsePositives'] as core.String;
     }
     if (_json.containsKey('positiveClassThreshold')) {
-      positiveClassThreshold = _json['positiveClassThreshold'].toDouble();
+      positiveClassThreshold =
+          (_json['positiveClassThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('precision')) {
-      precision = _json['precision'].toDouble();
+      precision = (_json['precision'] as core.num).toDouble();
     }
     if (_json.containsKey('recall')) {
-      recall = _json['recall'].toDouble();
+      recall = (_json['recall'] as core.num).toDouble();
     }
     if (_json.containsKey('trueNegatives')) {
       trueNegatives = _json['trueNegatives'] as core.String;
@@ -3682,16 +3684,16 @@
       durationMs = _json['durationMs'] as core.String;
     }
     if (_json.containsKey('evalLoss')) {
-      evalLoss = _json['evalLoss'].toDouble();
+      evalLoss = (_json['evalLoss'] as core.num).toDouble();
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
     }
     if (_json.containsKey('learnRate')) {
-      learnRate = _json['learnRate'].toDouble();
+      learnRate = (_json['learnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('trainingLoss')) {
-      trainingLoss = _json['trainingLoss'].toDouble();
+      trainingLoss = (_json['trainingLoss'] as core.num).toDouble();
     }
   }
 
@@ -3739,25 +3741,26 @@
       earlyStop = _json['earlyStop'] as core.bool;
     }
     if (_json.containsKey('l1Reg')) {
-      l1Reg = _json['l1Reg'].toDouble();
+      l1Reg = (_json['l1Reg'] as core.num).toDouble();
     }
     if (_json.containsKey('l2Reg')) {
-      l2Reg = _json['l2Reg'].toDouble();
+      l2Reg = (_json['l2Reg'] as core.num).toDouble();
     }
     if (_json.containsKey('learnRate')) {
-      learnRate = _json['learnRate'].toDouble();
+      learnRate = (_json['learnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('learnRateStrategy')) {
       learnRateStrategy = _json['learnRateStrategy'] as core.String;
     }
     if (_json.containsKey('lineSearchInitLearnRate')) {
-      lineSearchInitLearnRate = _json['lineSearchInitLearnRate'].toDouble();
+      lineSearchInitLearnRate =
+          (_json['lineSearchInitLearnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('maxIteration')) {
       maxIteration = _json['maxIteration'] as core.String;
     }
     if (_json.containsKey('minRelProgress')) {
-      minRelProgress = _json['minRelProgress'].toDouble();
+      minRelProgress = (_json['minRelProgress'] as core.num).toDouble();
     }
     if (_json.containsKey('warmStart')) {
       warmStart = _json['warmStart'] as core.bool;
@@ -3829,7 +3832,7 @@
           .toList();
     }
     if (_json.containsKey('startTime')) {
-      startTime = core.DateTime.parse(_json['startTime']);
+      startTime = core.DateTime.parse(_json['startTime'] as core.String);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -3980,7 +3983,7 @@
       centroidId = _json['centroidId'] as core.String;
     }
     if (_json.containsKey('clusterRadius')) {
-      clusterRadius = _json['clusterRadius'].toDouble();
+      clusterRadius = (_json['clusterRadius'] as core.num).toDouble();
     }
     if (_json.containsKey('clusterSize')) {
       clusterSize = _json['clusterSize'] as core.String;
@@ -4049,10 +4052,11 @@
           .toList();
     }
     if (_json.containsKey('daviesBouldinIndex')) {
-      daviesBouldinIndex = _json['daviesBouldinIndex'].toDouble();
+      daviesBouldinIndex = (_json['daviesBouldinIndex'] as core.num).toDouble();
     }
     if (_json.containsKey('meanSquaredDistance')) {
-      meanSquaredDistance = _json['meanSquaredDistance'].toDouble();
+      meanSquaredDistance =
+          (_json['meanSquaredDistance'] as core.num).toDouble();
     }
   }
 
@@ -4084,7 +4088,8 @@
 
   ConfusionMatrix.fromJson(core.Map _json) {
     if (_json.containsKey('confidenceThreshold')) {
-      confidenceThreshold = _json['confidenceThreshold'].toDouble();
+      confidenceThreshold =
+          (_json['confidenceThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
@@ -5051,10 +5056,10 @@
       computeMsMax = _json['computeMsMax'] as core.String;
     }
     if (_json.containsKey('computeRatioAvg')) {
-      computeRatioAvg = _json['computeRatioAvg'].toDouble();
+      computeRatioAvg = (_json['computeRatioAvg'] as core.num).toDouble();
     }
     if (_json.containsKey('computeRatioMax')) {
-      computeRatioMax = _json['computeRatioMax'].toDouble();
+      computeRatioMax = (_json['computeRatioMax'] as core.num).toDouble();
     }
     if (_json.containsKey('endMs')) {
       endMs = _json['endMs'] as core.String;
@@ -5080,10 +5085,10 @@
       readMsMax = _json['readMsMax'] as core.String;
     }
     if (_json.containsKey('readRatioAvg')) {
-      readRatioAvg = _json['readRatioAvg'].toDouble();
+      readRatioAvg = (_json['readRatioAvg'] as core.num).toDouble();
     }
     if (_json.containsKey('readRatioMax')) {
-      readRatioMax = _json['readRatioMax'].toDouble();
+      readRatioMax = (_json['readRatioMax'] as core.num).toDouble();
     }
     if (_json.containsKey('recordsRead')) {
       recordsRead = _json['recordsRead'] as core.String;
@@ -5119,10 +5124,10 @@
       waitMsMax = _json['waitMsMax'] as core.String;
     }
     if (_json.containsKey('waitRatioAvg')) {
-      waitRatioAvg = _json['waitRatioAvg'].toDouble();
+      waitRatioAvg = (_json['waitRatioAvg'] as core.num).toDouble();
     }
     if (_json.containsKey('waitRatioMax')) {
-      waitRatioMax = _json['waitRatioMax'].toDouble();
+      waitRatioMax = (_json['waitRatioMax'] as core.num).toDouble();
     }
     if (_json.containsKey('writeMsAvg')) {
       writeMsAvg = _json['writeMsAvg'] as core.String;
@@ -5131,10 +5136,10 @@
       writeMsMax = _json['writeMsMax'] as core.String;
     }
     if (_json.containsKey('writeRatioAvg')) {
-      writeRatioAvg = _json['writeRatioAvg'].toDouble();
+      writeRatioAvg = (_json['writeRatioAvg'] as core.num).toDouble();
     }
     if (_json.containsKey('writeRatioMax')) {
-      writeRatioMax = _json['writeRatioMax'].toDouble();
+      writeRatioMax = (_json['writeRatioMax'] as core.num).toDouble();
     }
   }
 
@@ -5509,7 +5514,7 @@
       featureColumn = _json['featureColumn'] as core.String;
     }
     if (_json.containsKey('numericalValue')) {
-      numericalValue = _json['numericalValue'].toDouble();
+      numericalValue = (_json['numericalValue'] as core.num).toDouble();
     }
   }
 
@@ -5886,16 +5891,16 @@
       durationMs = _json['durationMs'] as core.String;
     }
     if (_json.containsKey('evalLoss')) {
-      evalLoss = _json['evalLoss'].toDouble();
+      evalLoss = (_json['evalLoss'] as core.num).toDouble();
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
     }
     if (_json.containsKey('learnRate')) {
-      learnRate = _json['learnRate'].toDouble();
+      learnRate = (_json['learnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('trainingLoss')) {
-      trainingLoss = _json['trainingLoss'].toDouble();
+      trainingLoss = (_json['trainingLoss'] as core.num).toDouble();
     }
   }
 
@@ -7329,7 +7334,7 @@
 
   JobStatistics.fromJson(core.Map _json) {
     if (_json.containsKey('completionRatio')) {
-      completionRatio = _json['completionRatio'].toDouble();
+      completionRatio = (_json['completionRatio'] as core.num).toDouble();
     }
     if (_json.containsKey('creationTime')) {
       creationTime = _json['creationTime'] as core.String;
@@ -9366,17 +9371,18 @@
 
   RankingMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('averageRank')) {
-      averageRank = _json['averageRank'].toDouble();
+      averageRank = (_json['averageRank'] as core.num).toDouble();
     }
     if (_json.containsKey('meanAveragePrecision')) {
-      meanAveragePrecision = _json['meanAveragePrecision'].toDouble();
+      meanAveragePrecision =
+          (_json['meanAveragePrecision'] as core.num).toDouble();
     }
     if (_json.containsKey('meanSquaredError')) {
-      meanSquaredError = _json['meanSquaredError'].toDouble();
+      meanSquaredError = (_json['meanSquaredError'] as core.num).toDouble();
     }
     if (_json.containsKey('normalizedDiscountedCumulativeGain')) {
       normalizedDiscountedCumulativeGain =
-          _json['normalizedDiscountedCumulativeGain'].toDouble();
+          (_json['normalizedDiscountedCumulativeGain'] as core.num).toDouble();
     }
   }
 
@@ -9421,19 +9427,21 @@
 
   RegressionMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('meanAbsoluteError')) {
-      meanAbsoluteError = _json['meanAbsoluteError'].toDouble();
+      meanAbsoluteError = (_json['meanAbsoluteError'] as core.num).toDouble();
     }
     if (_json.containsKey('meanSquaredError')) {
-      meanSquaredError = _json['meanSquaredError'].toDouble();
+      meanSquaredError = (_json['meanSquaredError'] as core.num).toDouble();
     }
     if (_json.containsKey('meanSquaredLogError')) {
-      meanSquaredLogError = _json['meanSquaredLogError'].toDouble();
+      meanSquaredLogError =
+          (_json['meanSquaredLogError'] as core.num).toDouble();
     }
     if (_json.containsKey('medianAbsoluteError')) {
-      medianAbsoluteError = _json['medianAbsoluteError'].toDouble();
+      medianAbsoluteError =
+          (_json['medianAbsoluteError'] as core.num).toDouble();
     }
     if (_json.containsKey('rSquared')) {
-      rSquared = _json['rSquared'].toDouble();
+      rSquared = (_json['rSquared'] as core.num).toDouble();
     }
   }
 
@@ -9921,7 +9929,7 @@
       baseTableReference = TableReference.fromJson(_json['baseTableReference']);
     }
     if (_json.containsKey('snapshotTime')) {
-      snapshotTime = core.DateTime.parse(_json['snapshotTime']);
+      snapshotTime = core.DateTime.parse(_json['snapshotTime'] as core.String);
     }
   }
 
@@ -11498,7 +11506,8 @@
       dataSplitColumn = _json['dataSplitColumn'] as core.String;
     }
     if (_json.containsKey('dataSplitEvalFraction')) {
-      dataSplitEvalFraction = _json['dataSplitEvalFraction'].toDouble();
+      dataSplitEvalFraction =
+          (_json['dataSplitEvalFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('dataSplitMethod')) {
       dataSplitMethod = _json['dataSplitMethod'] as core.String;
@@ -11507,7 +11516,7 @@
       distanceType = _json['distanceType'] as core.String;
     }
     if (_json.containsKey('dropout')) {
-      dropout = _json['dropout'].toDouble();
+      dropout = (_json['dropout'] as core.num).toDouble();
     }
     if (_json.containsKey('earlyStop')) {
       earlyStop = _json['earlyStop'] as core.bool;
@@ -11530,7 +11539,7 @@
       includeDrift = _json['includeDrift'] as core.bool;
     }
     if (_json.containsKey('initialLearnRate')) {
-      initialLearnRate = _json['initialLearnRate'].toDouble();
+      initialLearnRate = (_json['initialLearnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('inputLabelColumns')) {
       inputLabelColumns = (_json['inputLabelColumns'] as core.List)
@@ -11549,18 +11558,18 @@
           _json['kmeansInitializationMethod'] as core.String;
     }
     if (_json.containsKey('l1Regularization')) {
-      l1Regularization = _json['l1Regularization'].toDouble();
+      l1Regularization = (_json['l1Regularization'] as core.num).toDouble();
     }
     if (_json.containsKey('l2Regularization')) {
-      l2Regularization = _json['l2Regularization'].toDouble();
+      l2Regularization = (_json['l2Regularization'] as core.num).toDouble();
     }
     if (_json.containsKey('labelClassWeights')) {
       labelClassWeights = commons.mapMap<core.num, core.double>(
           _json['labelClassWeights'].cast<core.String, core.num>(),
-          (core.num item) => item.toDouble());
+          (core.num item) => (item as core.num).toDouble());
     }
     if (_json.containsKey('learnRate')) {
-      learnRate = _json['learnRate'].toDouble();
+      learnRate = (_json['learnRate'] as core.num).toDouble();
     }
     if (_json.containsKey('learnRateStrategy')) {
       learnRateStrategy = _json['learnRateStrategy'] as core.String;
@@ -11575,10 +11584,11 @@
       maxTreeDepth = _json['maxTreeDepth'] as core.String;
     }
     if (_json.containsKey('minRelativeProgress')) {
-      minRelativeProgress = _json['minRelativeProgress'].toDouble();
+      minRelativeProgress =
+          (_json['minRelativeProgress'] as core.num).toDouble();
     }
     if (_json.containsKey('minSplitLoss')) {
-      minSplitLoss = _json['minSplitLoss'].toDouble();
+      minSplitLoss = (_json['minSplitLoss'] as core.num).toDouble();
     }
     if (_json.containsKey('modelUri')) {
       modelUri = _json['modelUri'] as core.String;
@@ -11599,7 +11609,7 @@
       preserveInputStructs = _json['preserveInputStructs'] as core.bool;
     }
     if (_json.containsKey('subsample')) {
-      subsample = _json['subsample'].toDouble();
+      subsample = (_json['subsample'] as core.num).toDouble();
     }
     if (_json.containsKey('timeSeriesDataColumn')) {
       timeSeriesDataColumn = _json['timeSeriesDataColumn'] as core.String;
@@ -11615,7 +11625,7 @@
       userColumn = _json['userColumn'] as core.String;
     }
     if (_json.containsKey('walsAlpha')) {
-      walsAlpha = _json['walsAlpha'].toDouble();
+      walsAlpha = (_json['walsAlpha'] as core.num).toDouble();
     }
     if (_json.containsKey('warmStart')) {
       warmStart = _json['warmStart'] as core.bool;
diff --git a/generated/googleapis/lib/bigquerydatatransfer/v1.dart b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
index 2abab3a..9ac417a 100644
--- a/generated/googleapis/lib/bigquerydatatransfer/v1.dart
+++ b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
@@ -2565,10 +2565,10 @@
       immutable = _json['immutable'] as core.bool;
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
     if (_json.containsKey('paramId')) {
       paramId = _json['paramId'] as core.String;
diff --git a/generated/googleapis/lib/blogger/v3.dart b/generated/googleapis/lib/blogger/v3.dart
index 8059181..42e7495 100644
--- a/generated/googleapis/lib/blogger/v3.dart
+++ b/generated/googleapis/lib/blogger/v3.dart
@@ -3707,10 +3707,10 @@
 
   PostLocation.fromJson(core.Map _json) {
     if (_json.containsKey('lat')) {
-      lat = _json['lat'].toDouble();
+      lat = (_json['lat'] as core.num).toDouble();
     }
     if (_json.containsKey('lng')) {
-      lng = _json['lng'].toDouble();
+      lng = (_json['lng'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
diff --git a/generated/googleapis/lib/books/v1.dart b/generated/googleapis/lib/books/v1.dart
index 77d8444..05de682 100644
--- a/generated/googleapis/lib/books/v1.dart
+++ b/generated/googleapis/lib/books/v1.dart
@@ -6228,10 +6228,10 @@
 
   GeolayerdataGeoViewportHi.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -6255,10 +6255,10 @@
 
   GeolayerdataGeoViewportLo.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -6349,10 +6349,10 @@
       countryCode = _json['countryCode'] as core.String;
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
     if (_json.containsKey('mapType')) {
       mapType = _json['mapType'] as core.String;
@@ -7244,7 +7244,7 @@
   SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo.fromJson(
       core.Map _json) {
     if (_json.containsKey('amountInMicros')) {
-      amountInMicros = _json['amountInMicros'].toDouble();
+      amountInMicros = (_json['amountInMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -7286,7 +7286,7 @@
   SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo.fromJson(
       core.Map _json) {
     if (_json.containsKey('amountInMicros')) {
-      amountInMicros = _json['amountInMicros'].toDouble();
+      amountInMicros = (_json['amountInMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -8068,7 +8068,7 @@
 
   VolumeSaleInfoListPrice.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = _json['amount'].toDouble();
+      amount = (_json['amount'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -8096,7 +8096,7 @@
 
   VolumeSaleInfoOffersListPrice.fromJson(core.Map _json) {
     if (_json.containsKey('amountInMicros')) {
-      amountInMicros = _json['amountInMicros'].toDouble();
+      amountInMicros = (_json['amountInMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -8124,7 +8124,7 @@
 
   VolumeSaleInfoOffersRentalDuration.fromJson(core.Map _json) {
     if (_json.containsKey('count')) {
-      count = _json['count'].toDouble();
+      count = (_json['count'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -8152,7 +8152,7 @@
 
   VolumeSaleInfoOffersRetailPrice.fromJson(core.Map _json) {
     if (_json.containsKey('amountInMicros')) {
-      amountInMicros = _json['amountInMicros'].toDouble();
+      amountInMicros = (_json['amountInMicros'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -8244,7 +8244,7 @@
 
   VolumeSaleInfoRetailPrice.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = _json['amount'].toDouble();
+      amount = (_json['amount'] as core.num).toDouble();
     }
     if (_json.containsKey('currencyCode')) {
       currencyCode = _json['currencyCode'] as core.String;
@@ -9021,7 +9021,7 @@
           .toList();
     }
     if (_json.containsKey('averageRating')) {
-      averageRating = _json['averageRating'].toDouble();
+      averageRating = (_json['averageRating'] as core.num).toDouble();
     }
     if (_json.containsKey('canonicalVolumeLink')) {
       canonicalVolumeLink = _json['canonicalVolumeLink'] as core.String;
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index ce0831e..115f966 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -3896,7 +3896,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
@@ -4983,7 +4983,7 @@
       conferenceData = ConferenceData.fromJson(_json['conferenceData']);
     }
     if (_json.containsKey('created')) {
-      created = core.DateTime.parse(_json['created']);
+      created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('creator')) {
       creator = EventCreator.fromJson(_json['creator']);
@@ -5076,7 +5076,7 @@
       transparency = _json['transparency'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('visibility')) {
       visibility = _json['visibility'] as core.String;
@@ -5399,10 +5399,10 @@
 
   EventDateTime.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = core.DateTime.parse(_json['date']);
+      date = core.DateTime.parse(_json['date'] as core.String);
     }
     if (_json.containsKey('dateTime')) {
-      dateTime = core.DateTime.parse(_json['dateTime']);
+      dateTime = core.DateTime.parse(_json['dateTime'] as core.String);
     }
     if (_json.containsKey('timeZone')) {
       timeZone = _json['timeZone'] as core.String;
@@ -5548,7 +5548,7 @@
       timeZone = _json['timeZone'] as core.String;
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
@@ -5698,10 +5698,10 @@
           .toList();
     }
     if (_json.containsKey('timeMax')) {
-      timeMax = core.DateTime.parse(_json['timeMax']);
+      timeMax = core.DateTime.parse(_json['timeMax'] as core.String);
     }
     if (_json.containsKey('timeMin')) {
-      timeMin = core.DateTime.parse(_json['timeMin']);
+      timeMin = core.DateTime.parse(_json['timeMin'] as core.String);
     }
     if (_json.containsKey('timeZone')) {
       timeZone = _json['timeZone'] as core.String;
@@ -5786,10 +5786,10 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('timeMax')) {
-      timeMax = core.DateTime.parse(_json['timeMax']);
+      timeMax = core.DateTime.parse(_json['timeMax'] as core.String);
     }
     if (_json.containsKey('timeMin')) {
-      timeMin = core.DateTime.parse(_json['timeMin']);
+      timeMin = core.DateTime.parse(_json['timeMin'] as core.String);
     }
   }
 
@@ -5941,10 +5941,10 @@
 
   TimePeriod.fromJson(core.Map _json) {
     if (_json.containsKey('end')) {
-      end = core.DateTime.parse(_json['end']);
+      end = core.DateTime.parse(_json['end'] as core.String);
     }
     if (_json.containsKey('start')) {
-      start = core.DateTime.parse(_json['start']);
+      start = core.DateTime.parse(_json['start'] as core.String);
     }
   }
 
diff --git a/generated/googleapis/lib/chat/v1.dart b/generated/googleapis/lib/chat/v1.dart
index b810e4d..243ca12 100644
--- a/generated/googleapis/lib/chat/v1.dart
+++ b/generated/googleapis/lib/chat/v1.dart
@@ -1306,7 +1306,7 @@
 
   Image.fromJson(core.Map _json) {
     if (_json.containsKey('aspectRatio')) {
-      aspectRatio = _json['aspectRatio'].toDouble();
+      aspectRatio = (_json['aspectRatio'] as core.num).toDouble();
     }
     if (_json.containsKey('imageUrl')) {
       imageUrl = _json['imageUrl'] as core.String;
diff --git a/generated/googleapis/lib/civicinfo/v2.dart b/generated/googleapis/lib/civicinfo/v2.dart
index efb0a4f..f6b6dde 100644
--- a/generated/googleapis/lib/civicinfo/v2.dart
+++ b/generated/googleapis/lib/civicinfo/v2.dart
@@ -1605,10 +1605,10 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
diff --git a/generated/googleapis/lib/classroom/v1.dart b/generated/googleapis/lib/classroom/v1.dart
index a845978..6d47078 100644
--- a/generated/googleapis/lib/classroom/v1.dart
+++ b/generated/googleapis/lib/classroom/v1.dart
@@ -5434,7 +5434,7 @@
           .toList();
     }
     if (_json.containsKey('maxPoints')) {
-      maxPoints = _json['maxPoints'].toDouble();
+      maxPoints = (_json['maxPoints'] as core.num).toDouble();
     }
     if (_json.containsKey('multipleChoiceQuestion')) {
       multipleChoiceQuestion =
@@ -6067,10 +6067,10 @@
       gradeTimestamp = _json['gradeTimestamp'] as core.String;
     }
     if (_json.containsKey('maxPoints')) {
-      maxPoints = _json['maxPoints'].toDouble();
+      maxPoints = (_json['maxPoints'] as core.num).toDouble();
     }
     if (_json.containsKey('pointsEarned')) {
-      pointsEarned = _json['pointsEarned'].toDouble();
+      pointsEarned = (_json['pointsEarned'] as core.num).toDouble();
     }
   }
 
@@ -7371,7 +7371,7 @@
       alternateLink = _json['alternateLink'] as core.String;
     }
     if (_json.containsKey('assignedGrade')) {
-      assignedGrade = _json['assignedGrade'].toDouble();
+      assignedGrade = (_json['assignedGrade'] as core.num).toDouble();
     }
     if (_json.containsKey('assignmentSubmission')) {
       assignmentSubmission =
@@ -7393,7 +7393,7 @@
       creationTime = _json['creationTime'] as core.String;
     }
     if (_json.containsKey('draftGrade')) {
-      draftGrade = _json['draftGrade'].toDouble();
+      draftGrade = (_json['draftGrade'] as core.num).toDouble();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
diff --git a/generated/googleapis/lib/cloudbilling/v1.dart b/generated/googleapis/lib/cloudbilling/v1.dart
index b17f989..da09826 100644
--- a/generated/googleapis/lib/cloudbilling/v1.dart
+++ b/generated/googleapis/lib/cloudbilling/v1.dart
@@ -1683,13 +1683,14 @@
       baseUnit = _json['baseUnit'] as core.String;
     }
     if (_json.containsKey('baseUnitConversionFactor')) {
-      baseUnitConversionFactor = _json['baseUnitConversionFactor'].toDouble();
+      baseUnitConversionFactor =
+          (_json['baseUnitConversionFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('baseUnitDescription')) {
       baseUnitDescription = _json['baseUnitDescription'] as core.String;
     }
     if (_json.containsKey('displayQuantity')) {
-      displayQuantity = _json['displayQuantity'].toDouble();
+      displayQuantity = (_json['displayQuantity'] as core.num).toDouble();
     }
     if (_json.containsKey('tieredRates')) {
       tieredRates = (_json['tieredRates'] as core.List)
@@ -1766,7 +1767,8 @@
       aggregationInfo = AggregationInfo.fromJson(_json['aggregationInfo']);
     }
     if (_json.containsKey('currencyConversionRate')) {
-      currencyConversionRate = _json['currencyConversionRate'].toDouble();
+      currencyConversionRate =
+          (_json['currencyConversionRate'] as core.num).toDouble();
     }
     if (_json.containsKey('effectiveTime')) {
       effectiveTime = _json['effectiveTime'] as core.String;
@@ -2108,7 +2110,7 @@
 
   TierRate.fromJson(core.Map _json) {
     if (_json.containsKey('startUsageAmount')) {
-      startUsageAmount = _json['startUsageAmount'].toDouble();
+      startUsageAmount = (_json['startUsageAmount'] as core.num).toDouble();
     }
     if (_json.containsKey('unitPrice')) {
       unitPrice = Money.fromJson(_json['unitPrice']);
diff --git a/generated/googleapis/lib/cloudidentity/v1.dart b/generated/googleapis/lib/cloudidentity/v1.dart
index ebfb81f..fa14ebc 100644
--- a/generated/googleapis/lib/cloudidentity/v1.dart
+++ b/generated/googleapis/lib/cloudidentity/v1.dart
@@ -2672,7 +2672,7 @@
       boolValue = _json['boolValue'] as core.bool;
     }
     if (_json.containsKey('numberValue')) {
-      numberValue = _json['numberValue'].toDouble();
+      numberValue = (_json['numberValue'] as core.num).toDouble();
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
diff --git a/generated/googleapis/lib/cloudsearch/v1.dart b/generated/googleapis/lib/cloudsearch/v1.dart
index 2bd7168..481539e 100644
--- a/generated/googleapis/lib/cloudsearch/v1.dart
+++ b/generated/googleapis/lib/cloudsearch/v1.dart
@@ -4020,7 +4020,7 @@
   DoubleValues.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -8408,7 +8408,7 @@
 
   SearchQualityMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('quality')) {
-      quality = _json['quality'].toDouble();
+      quality = (_json['quality'] as core.num).toDouble();
     }
   }
 
@@ -9668,7 +9668,7 @@
       dateValue = Date.fromJson(_json['dateValue']);
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('integerValue')) {
       integerValue = _json['integerValue'] as core.String;
diff --git a/generated/googleapis/lib/cloudtasks/v2.dart b/generated/googleapis/lib/cloudtasks/v2.dart
index 2d2e265..c5a9872 100644
--- a/generated/googleapis/lib/cloudtasks/v2.dart
+++ b/generated/googleapis/lib/cloudtasks/v2.dart
@@ -2532,7 +2532,8 @@
       maxConcurrentDispatches = _json['maxConcurrentDispatches'] as core.int;
     }
     if (_json.containsKey('maxDispatchesPerSecond')) {
-      maxDispatchesPerSecond = _json['maxDispatchesPerSecond'].toDouble();
+      maxDispatchesPerSecond =
+          (_json['maxDispatchesPerSecond'] as core.num).toDouble();
     }
   }
 
@@ -2735,7 +2736,7 @@
 
   StackdriverLoggingConfig.fromJson(core.Map _json) {
     if (_json.containsKey('samplingRatio')) {
-      samplingRatio = _json['samplingRatio'].toDouble();
+      samplingRatio = (_json['samplingRatio'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 8b7a569..829b27e 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -53531,7 +53531,7 @@
 
   AutoscalingPolicyCpuUtilization.fromJson(core.Map _json) {
     if (_json.containsKey('utilizationTarget')) {
-      utilizationTarget = _json['utilizationTarget'].toDouble();
+      utilizationTarget = (_json['utilizationTarget'] as core.num).toDouble();
     }
   }
 
@@ -53578,7 +53578,7 @@
       metric = _json['metric'] as core.String;
     }
     if (_json.containsKey('utilizationTarget')) {
-      utilizationTarget = _json['utilizationTarget'].toDouble();
+      utilizationTarget = (_json['utilizationTarget'] as core.num).toDouble();
     }
     if (_json.containsKey('utilizationTargetType')) {
       utilizationTargetType = _json['utilizationTargetType'] as core.String;
@@ -53611,7 +53611,7 @@
 
   AutoscalingPolicyLoadBalancingUtilization.fromJson(core.Map _json) {
     if (_json.containsKey('utilizationTarget')) {
-      utilizationTarget = _json['utilizationTarget'].toDouble();
+      utilizationTarget = (_json['utilizationTarget'] as core.num).toDouble();
     }
   }
 
@@ -53838,7 +53838,7 @@
       balancingMode = _json['balancingMode'] as core.String;
     }
     if (_json.containsKey('capacityScaler')) {
-      capacityScaler = _json['capacityScaler'].toDouble();
+      capacityScaler = (_json['capacityScaler'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -53864,13 +53864,13 @@
       maxRate = _json['maxRate'] as core.int;
     }
     if (_json.containsKey('maxRatePerEndpoint')) {
-      maxRatePerEndpoint = _json['maxRatePerEndpoint'].toDouble();
+      maxRatePerEndpoint = (_json['maxRatePerEndpoint'] as core.num).toDouble();
     }
     if (_json.containsKey('maxRatePerInstance')) {
-      maxRatePerInstance = _json['maxRatePerInstance'].toDouble();
+      maxRatePerInstance = (_json['maxRatePerInstance'] as core.num).toDouble();
     }
     if (_json.containsKey('maxUtilization')) {
-      maxUtilization = _json['maxUtilization'].toDouble();
+      maxUtilization = (_json['maxUtilization'] as core.num).toDouble();
     }
   }
 
@@ -55024,7 +55024,7 @@
       dropTrafficIfUnhealthy = _json['dropTrafficIfUnhealthy'] as core.bool;
     }
     if (_json.containsKey('failoverRatio')) {
-      failoverRatio = _json['failoverRatio'].toDouble();
+      failoverRatio = (_json['failoverRatio'] as core.num).toDouble();
     }
   }
 
@@ -55346,7 +55346,7 @@
       enable = _json['enable'] as core.bool;
     }
     if (_json.containsKey('sampleRate')) {
-      sampleRate = _json['sampleRate'].toDouble();
+      sampleRate = (_json['sampleRate'] as core.num).toDouble();
     }
   }
 
@@ -63276,7 +63276,7 @@
       httpStatus = _json['httpStatus'] as core.int;
     }
     if (_json.containsKey('percentage')) {
-      percentage = _json['percentage'].toDouble();
+      percentage = (_json['percentage'] as core.num).toDouble();
     }
   }
 
@@ -63310,7 +63310,7 @@
       fixedDelay = Duration.fromJson(_json['fixedDelay']);
     }
     if (_json.containsKey('percentage')) {
-      percentage = _json['percentage'].toDouble();
+      percentage = (_json['percentage'] as core.num).toDouble();
     }
   }
 
@@ -71881,7 +71881,7 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -82466,7 +82466,7 @@
 
   Quota.fromJson(core.Map _json) {
     if (_json.containsKey('limit')) {
-      limit = _json['limit'].toDouble();
+      limit = (_json['limit'] as core.num).toDouble();
     }
     if (_json.containsKey('metric')) {
       metric = _json['metric'] as core.String;
@@ -82475,7 +82475,7 @@
       owner = _json['owner'] as core.String;
     }
     if (_json.containsKey('usage')) {
-      usage = _json['usage'].toDouble();
+      usage = (_json['usage'] as core.num).toDouble();
     }
   }
 
@@ -92217,7 +92217,7 @@
       filterExpr = _json['filterExpr'] as core.String;
     }
     if (_json.containsKey('flowSampling')) {
-      flowSampling = _json['flowSampling'].toDouble();
+      flowSampling = (_json['flowSampling'] as core.num).toDouble();
     }
     if (_json.containsKey('metadata')) {
       metadata = _json['metadata'] as core.String;
@@ -94939,7 +94939,7 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('failoverRatio')) {
-      failoverRatio = _json['failoverRatio'].toDouble();
+      failoverRatio = (_json['failoverRatio'] as core.num).toDouble();
     }
     if (_json.containsKey('healthChecks')) {
       healthChecks = (_json['healthChecks'] as core.List)
diff --git a/generated/googleapis/lib/container/v1.dart b/generated/googleapis/lib/container/v1.dart
index 0836a2a..54dfbfa 100644
--- a/generated/googleapis/lib/container/v1.dart
+++ b/generated/googleapis/lib/container/v1.dart
@@ -7404,7 +7404,7 @@
 
   Metric.fromJson(core.Map _json) {
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('intValue')) {
       intValue = _json['intValue'] as core.String;
diff --git a/generated/googleapis/lib/content/v2_1.dart b/generated/googleapis/lib/content/v2_1.dart
index 4c43ce5..72a4b1e 100644
--- a/generated/googleapis/lib/content/v2_1.dart
+++ b/generated/googleapis/lib/content/v2_1.dart
@@ -12014,7 +12014,7 @@
       pointsValue = _json['pointsValue'] as core.String;
     }
     if (_json.containsKey('ratio')) {
-      ratio = _json['ratio'].toDouble();
+      ratio = (_json['ratio'] as core.num).toDouble();
     }
   }
 
@@ -18780,7 +18780,7 @@
       displayAdsTitle = _json['displayAdsTitle'] as core.String;
     }
     if (_json.containsKey('displayAdsValue')) {
-      displayAdsValue = _json['displayAdsValue'].toDouble();
+      displayAdsValue = (_json['displayAdsValue'] as core.num).toDouble();
     }
     if (_json.containsKey('energyEfficiencyClass')) {
       energyEfficiencyClass = _json['energyEfficiencyClass'] as core.String;
@@ -19392,7 +19392,7 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -19422,7 +19422,7 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -19778,7 +19778,7 @@
       postalCode = _json['postalCode'] as core.String;
     }
     if (_json.containsKey('rate')) {
-      rate = _json['rate'].toDouble();
+      rate = (_json['rate'] as core.num).toDouble();
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
@@ -19856,7 +19856,7 @@
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/customsearch/v1.dart b/generated/googleapis/lib/customsearch/v1.dart
index d786bdb..4d2a50f 100644
--- a/generated/googleapis/lib/customsearch/v1.dart
+++ b/generated/googleapis/lib/customsearch/v1.dart
@@ -2558,7 +2558,7 @@
       formattedTotalResults = _json['formattedTotalResults'] as core.String;
     }
     if (_json.containsKey('searchTime')) {
-      searchTime = _json['searchTime'].toDouble();
+      searchTime = (_json['searchTime'] as core.num).toDouble();
     }
     if (_json.containsKey('totalResults')) {
       totalResults = _json['totalResults'] as core.String;
diff --git a/generated/googleapis/lib/dataproc/v1.dart b/generated/googleapis/lib/dataproc/v1.dart
index 3572316..1a043ce 100644
--- a/generated/googleapis/lib/dataproc/v1.dart
+++ b/generated/googleapis/lib/dataproc/v1.dart
@@ -4549,17 +4549,18 @@
           _json['gracefulDecommissionTimeout'] as core.String;
     }
     if (_json.containsKey('scaleDownFactor')) {
-      scaleDownFactor = _json['scaleDownFactor'].toDouble();
+      scaleDownFactor = (_json['scaleDownFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('scaleDownMinWorkerFraction')) {
       scaleDownMinWorkerFraction =
-          _json['scaleDownMinWorkerFraction'].toDouble();
+          (_json['scaleDownMinWorkerFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('scaleUpFactor')) {
-      scaleUpFactor = _json['scaleUpFactor'].toDouble();
+      scaleUpFactor = (_json['scaleUpFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('scaleUpMinWorkerFraction')) {
-      scaleUpMinWorkerFraction = _json['scaleUpMinWorkerFraction'].toDouble();
+      scaleUpMinWorkerFraction =
+          (_json['scaleUpMinWorkerFraction'] as core.num).toDouble();
     }
   }
 
@@ -8997,7 +8998,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = _json['progress'].toDouble();
+      progress = (_json['progress'] as core.num).toDouble();
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
diff --git a/generated/googleapis/lib/datastore/v1.dart b/generated/googleapis/lib/datastore/v1.dart
index ae9d499..6e9bc35 100644
--- a/generated/googleapis/lib/datastore/v1.dart
+++ b/generated/googleapis/lib/datastore/v1.dart
@@ -2748,10 +2748,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -3839,7 +3839,7 @@
       booleanValue = _json['booleanValue'] as core.bool;
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('entityValue')) {
       entityValue = Entity.fromJson(_json['entityValue']);
diff --git a/generated/googleapis/lib/dfareporting/v3_4.dart b/generated/googleapis/lib/dfareporting/v3_4.dart
index 822a932..f514381 100644
--- a/generated/googleapis/lib/dfareporting/v3_4.dart
+++ b/generated/googleapis/lib/dfareporting/v3_4.dart
@@ -16000,7 +16000,7 @@
       dynamicClickTracker = _json['dynamicClickTracker'] as core.bool;
     }
     if (_json.containsKey('endTime')) {
-      endTime = core.DateTime.parse(_json['endTime']);
+      endTime = core.DateTime.parse(_json['endTime'] as core.String);
     }
     if (_json.containsKey('eventTagOverrides')) {
       eventTagOverrides = (_json['eventTagOverrides'] as core.List)
@@ -16053,7 +16053,7 @@
       sslRequired = _json['sslRequired'] as core.bool;
     }
     if (_json.containsKey('startTime')) {
-      startTime = core.DateTime.parse(_json['startTime']);
+      startTime = core.DateTime.parse(_json['startTime'] as core.String);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
@@ -17135,7 +17135,7 @@
       defaultLandingPageId = _json['defaultLandingPageId'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('eventTagOverrides')) {
       eventTagOverrides = (_json['eventTagOverrides'] as core.List)
@@ -17164,7 +17164,7 @@
       nielsenOcrEnabled = _json['nielsenOcrEnabled'] as core.bool;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
@@ -17521,7 +17521,7 @@
       action = _json['action'] as core.String;
     }
     if (_json.containsKey('changeTime')) {
-      changeTime = core.DateTime.parse(_json['changeTime']);
+      changeTime = core.DateTime.parse(_json['changeTime'] as core.String);
     }
     if (_json.containsKey('fieldName')) {
       fieldName = _json['fieldName'] as core.String;
@@ -18534,7 +18534,7 @@
       treatmentForUnderage = _json['treatmentForUnderage'] as core.bool;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -19501,7 +19501,7 @@
       mediaDescription = _json['mediaDescription'] as core.String;
     }
     if (_json.containsKey('mediaDuration')) {
-      mediaDuration = _json['mediaDuration'].toDouble();
+      mediaDuration = (_json['mediaDuration'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -20201,7 +20201,7 @@
       flashVersion = _json['flashVersion'] as core.int;
     }
     if (_json.containsKey('frameRate')) {
-      frameRate = _json['frameRate'].toDouble();
+      frameRate = (_json['frameRate'] as core.num).toDouble();
     }
     if (_json.containsKey('hideFlashObjects')) {
       hideFlashObjects = _json['hideFlashObjects'] as core.bool;
@@ -20219,7 +20219,7 @@
       idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
     }
     if (_json.containsKey('mediaDuration')) {
-      mediaDuration = _json['mediaDuration'].toDouble();
+      mediaDuration = (_json['mediaDuration'] as core.num).toDouble();
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -20252,7 +20252,7 @@
       pushdown = _json['pushdown'] as core.bool;
     }
     if (_json.containsKey('pushdownDuration')) {
-      pushdownDuration = _json['pushdownDuration'].toDouble();
+      pushdownDuration = (_json['pushdownDuration'] as core.num).toDouble();
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
@@ -20766,7 +20766,7 @@
           DimensionValue.fromJson(_json['creativeIdDimensionValue']);
     }
     if (_json.containsKey('endTime')) {
-      endTime = core.DateTime.parse(_json['endTime']);
+      endTime = core.DateTime.parse(_json['endTime'] as core.String);
     }
     if (_json.containsKey('richMediaExitOverrides')) {
       richMediaExitOverrides = (_json['richMediaExitOverrides'] as core.List)
@@ -20781,7 +20781,7 @@
       sslCompliant = _json['sslCompliant'] as core.bool;
     }
     if (_json.containsKey('startTime')) {
-      startTime = core.DateTime.parse(_json['startTime']);
+      startTime = core.DateTime.parse(_json['startTime'] as core.String);
     }
     if (_json.containsKey('weight')) {
       weight = _json['weight'] as core.int;
@@ -22525,7 +22525,7 @@
 
   DateRange.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -22534,7 +22534,7 @@
       relativeDateRange = _json['relativeDateRange'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
   }
 
@@ -23065,7 +23065,7 @@
       dimensionName = _json['dimensionName'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
@@ -23076,7 +23076,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
   }
 
@@ -24020,13 +24020,13 @@
 
   Flight.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('rateOrCost')) {
       rateOrCost = _json['rateOrCost'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
     if (_json.containsKey('units')) {
       units = _json['units'] as core.String;
@@ -27178,7 +27178,8 @@
       createdInfo = LastModifiedInfo.fromJson(_json['createdInfo']);
     }
     if (_json.containsKey('effectiveDate')) {
-      effectiveDate = core.DateTime.parse(_json['effectiveDate']);
+      effectiveDate =
+          core.DateTime.parse(_json['effectiveDate'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -27192,7 +27193,7 @@
           .toList();
     }
     if (_json.containsKey('lastSentTime')) {
-      lastSentTime = core.DateTime.parse(_json['lastSentTime']);
+      lastSentTime = core.DateTime.parse(_json['lastSentTime'] as core.String);
     }
     if (_json.containsKey('orderId')) {
       orderId = _json['orderId'] as core.String;
@@ -29016,7 +29017,7 @@
       capCostType = _json['capCostType'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('flights')) {
       flights = (_json['flights'] as core.List)
@@ -29030,7 +29031,7 @@
       pricingType = _json['pricingType'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
   }
 
@@ -29100,7 +29101,7 @@
       capCostOption = _json['capCostOption'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('flighted')) {
       flighted = _json['flighted'] as core.bool;
@@ -29118,10 +29119,11 @@
       pricingType = _json['pricingType'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
     if (_json.containsKey('testingStartDate')) {
-      testingStartDate = core.DateTime.parse(_json['testingStartDate']);
+      testingStartDate =
+          core.DateTime.parse(_json['testingStartDate'] as core.String);
     }
   }
 
@@ -29179,7 +29181,7 @@
 
   PricingSchedulePricingPeriod.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('pricingComment')) {
       pricingComment = _json['pricingComment'] as core.String;
@@ -29188,7 +29190,7 @@
       rateOrCostNanos = _json['rateOrCostNanos'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
     if (_json.containsKey('units')) {
       units = _json['units'] as core.String;
@@ -29322,7 +29324,7 @@
       clientName = _json['clientName'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = core.DateTime.parse(_json['endDate']);
+      endDate = core.DateTime.parse(_json['endDate'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -29340,7 +29342,7 @@
       overview = _json['overview'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
@@ -30894,7 +30896,8 @@
       every = _json['every'] as core.int;
     }
     if (_json.containsKey('expirationDate')) {
-      expirationDate = core.DateTime.parse(_json['expirationDate']);
+      expirationDate =
+          core.DateTime.parse(_json['expirationDate'] as core.String);
     }
     if (_json.containsKey('repeats')) {
       repeats = _json['repeats'] as core.String;
@@ -30908,7 +30911,7 @@
       runsOnDayOfMonth = _json['runsOnDayOfMonth'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = core.DateTime.parse(_json['startDate']);
+      startDate = core.DateTime.parse(_json['startDate'] as core.String);
     }
   }
 
diff --git a/generated/googleapis/lib/dialogflow/v2.dart b/generated/googleapis/lib/dialogflow/v2.dart
index 5748762..625d0e9 100644
--- a/generated/googleapis/lib/dialogflow/v2.dart
+++ b/generated/googleapis/lib/dialogflow/v2.dart
@@ -5037,7 +5037,8 @@
       avatarUri = _json['avatarUri'] as core.String;
     }
     if (_json.containsKey('classificationThreshold')) {
-      classificationThreshold = _json['classificationThreshold'].toDouble();
+      classificationThreshold =
+          (_json['classificationThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('defaultLanguageCode')) {
       defaultLanguageCode = _json['defaultLanguageCode'] as core.String;
@@ -9075,7 +9076,8 @@
       intent = GoogleCloudDialogflowV2Intent.fromJson(_json['intent']);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
-      intentDetectionConfidence = _json['intentDetectionConfidence'].toDouble();
+      intentDetectionConfidence =
+          (_json['intentDetectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -9101,7 +9103,7 @@
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
-          _json['speechRecognitionConfidence'].toDouble();
+          (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
@@ -9257,10 +9259,10 @@
 
   GoogleCloudDialogflowV2Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -9425,7 +9427,7 @@
 
   GoogleCloudDialogflowV2SpeechContext.fromJson(core.Map _json) {
     if (_json.containsKey('boost')) {
-      boost = _json['boost'].toDouble();
+      boost = (_json['boost'] as core.num).toDouble();
     }
     if (_json.containsKey('phrases')) {
       phrases = (_json['phrases'] as core.List)
@@ -9486,17 +9488,17 @@
           .toList();
     }
     if (_json.containsKey('pitch')) {
-      pitch = _json['pitch'].toDouble();
+      pitch = (_json['pitch'] as core.num).toDouble();
     }
     if (_json.containsKey('speakingRate')) {
-      speakingRate = _json['speakingRate'].toDouble();
+      speakingRate = (_json['speakingRate'] as core.num).toDouble();
     }
     if (_json.containsKey('voice')) {
       voice =
           GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(_json['voice']);
     }
     if (_json.containsKey('volumeGainDb')) {
-      volumeGainDb = _json['volumeGainDb'].toDouble();
+      volumeGainDb = (_json['volumeGainDb'] as core.num).toDouble();
     }
   }
 
@@ -12958,7 +12960,7 @@
       faqQuestion = _json['faqQuestion'] as core.String;
     }
     if (_json.containsKey('matchConfidence')) {
-      matchConfidence = _json['matchConfidence'].toDouble();
+      matchConfidence = (_json['matchConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('matchConfidenceLevel')) {
       matchConfidenceLevel = _json['matchConfidenceLevel'] as core.String;
@@ -13228,7 +13230,8 @@
       intent = GoogleCloudDialogflowV2beta1Intent.fromJson(_json['intent']);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
-      intentDetectionConfidence = _json['intentDetectionConfidence'].toDouble();
+      intentDetectionConfidence =
+          (_json['intentDetectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('knowledgeAnswers')) {
       knowledgeAnswers = GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(
@@ -13258,7 +13261,7 @@
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
-          _json['speechRecognitionConfidence'].toDouble();
+          (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
@@ -13342,10 +13345,10 @@
 
   GoogleCloudDialogflowV2beta1Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -14134,10 +14137,10 @@
 
   GoogleTypeLatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/displayvideo/v1.dart b/generated/googleapis/lib/displayvideo/v1.dart
index a3cfba1..321edd8 100644
--- a/generated/googleapis/lib/displayvideo/v1.dart
+++ b/generated/googleapis/lib/displayvideo/v1.dart
@@ -22400,7 +22400,7 @@
       fileSizeBytes = _json['fileSizeBytes'] as core.String;
     }
     if (_json.containsKey('frameRate')) {
-      frameRate = _json['frameRate'].toDouble();
+      frameRate = (_json['frameRate'] as core.num).toDouble();
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
diff --git a/generated/googleapis/lib/dlp/v2.dart b/generated/googleapis/lib/dlp/v2.dart
index 52b295a..98378af 100644
--- a/generated/googleapis/lib/dlp/v2.dart
+++ b/generated/googleapis/lib/dlp/v2.dart
@@ -7870,13 +7870,13 @@
 
   GooglePrivacyDlpV2Color.fromJson(core.Map _json) {
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
@@ -9317,10 +9317,10 @@
           .toList();
     }
     if (_json.containsKey('maxProbability')) {
-      maxProbability = _json['maxProbability'].toDouble();
+      maxProbability = (_json['maxProbability'] as core.num).toDouble();
     }
     if (_json.containsKey('minProbability')) {
-      minProbability = _json['minProbability'].toDouble();
+      minProbability = (_json['minProbability'] as core.num).toDouble();
     }
   }
 
@@ -9366,7 +9366,8 @@
   GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues.fromJson(
       core.Map _json) {
     if (_json.containsKey('estimatedProbability')) {
-      estimatedProbability = _json['estimatedProbability'].toDouble();
+      estimatedProbability =
+          (_json['estimatedProbability'] as core.num).toDouble();
     }
     if (_json.containsKey('quasiIdsValues')) {
       quasiIdsValues = (_json['quasiIdsValues'] as core.List)
@@ -10207,7 +10208,7 @@
 
   GooglePrivacyDlpV2FixedSizeBucketingConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bucketSize')) {
-      bucketSize = _json['bucketSize'].toDouble();
+      bucketSize = (_json['bucketSize'] as core.num).toDouble();
     }
     if (_json.containsKey('lowerBound')) {
       lowerBound = GooglePrivacyDlpV2Value.fromJson(_json['lowerBound']);
@@ -15185,7 +15186,7 @@
       dayOfWeekValue = _json['dayOfWeekValue'] as core.String;
     }
     if (_json.containsKey('floatValue')) {
-      floatValue = _json['floatValue'].toDouble();
+      floatValue = (_json['floatValue'] as core.num).toDouble();
     }
     if (_json.containsKey('integerValue')) {
       integerValue = _json['integerValue'] as core.String;
diff --git a/generated/googleapis/lib/docs/v1.dart b/generated/googleapis/lib/docs/v1.dart
index 3f832d4..8294a00 100644
--- a/generated/googleapis/lib/docs/v1.dart
+++ b/generated/googleapis/lib/docs/v1.dart
@@ -1017,19 +1017,19 @@
 
   CropProperties.fromJson(core.Map _json) {
     if (_json.containsKey('angle')) {
-      angle = _json['angle'].toDouble();
+      angle = (_json['angle'] as core.num).toDouble();
     }
     if (_json.containsKey('offsetBottom')) {
-      offsetBottom = _json['offsetBottom'].toDouble();
+      offsetBottom = (_json['offsetBottom'] as core.num).toDouble();
     }
     if (_json.containsKey('offsetLeft')) {
-      offsetLeft = _json['offsetLeft'].toDouble();
+      offsetLeft = (_json['offsetLeft'] as core.num).toDouble();
     }
     if (_json.containsKey('offsetRight')) {
-      offsetRight = _json['offsetRight'].toDouble();
+      offsetRight = (_json['offsetRight'] as core.num).toDouble();
     }
     if (_json.containsKey('offsetTop')) {
-      offsetTop = _json['offsetTop'].toDouble();
+      offsetTop = (_json['offsetTop'] as core.num).toDouble();
     }
   }
 
@@ -1345,7 +1345,7 @@
 
   Dimension.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -2731,16 +2731,16 @@
 
   ImageProperties.fromJson(core.Map _json) {
     if (_json.containsKey('angle')) {
-      angle = _json['angle'].toDouble();
+      angle = (_json['angle'] as core.num).toDouble();
     }
     if (_json.containsKey('brightness')) {
-      brightness = _json['brightness'].toDouble();
+      brightness = (_json['brightness'] as core.num).toDouble();
     }
     if (_json.containsKey('contentUri')) {
       contentUri = _json['contentUri'] as core.String;
     }
     if (_json.containsKey('contrast')) {
-      contrast = _json['contrast'].toDouble();
+      contrast = (_json['contrast'] as core.num).toDouble();
     }
     if (_json.containsKey('cropProperties')) {
       cropProperties = CropProperties.fromJson(_json['cropProperties']);
@@ -2749,7 +2749,7 @@
       sourceUri = _json['sourceUri'] as core.String;
     }
     if (_json.containsKey('transparency')) {
-      transparency = _json['transparency'].toDouble();
+      transparency = (_json['transparency'] as core.num).toDouble();
     }
   }
 
@@ -4769,7 +4769,7 @@
       keepWithNext = _json['keepWithNext'] as core.bool;
     }
     if (_json.containsKey('lineSpacing')) {
-      lineSpacing = _json['lineSpacing'].toDouble();
+      lineSpacing = (_json['lineSpacing'] as core.num).toDouble();
     }
     if (_json.containsKey('namedStyleType')) {
       namedStyleType = _json['namedStyleType'] as core.String;
@@ -5926,13 +5926,13 @@
 
   RgbColor.fromJson(core.Map _json) {
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index 35e9162..2aa3068 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -1107,7 +1107,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index d7f0837..252990f 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -5857,7 +5857,7 @@
       featureName = _json['featureName'] as core.String;
     }
     if (_json.containsKey('featureRate')) {
-      featureRate = _json['featureRate'].toDouble();
+      featureRate = (_json['featureRate'] as core.num).toDouble();
     }
   }
 
@@ -6739,7 +6739,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('modificationDate')) {
-      modificationDate = core.DateTime.parse(_json['modificationDate']);
+      modificationDate =
+          core.DateTime.parse(_json['modificationDate'] as core.String);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -7232,7 +7233,7 @@
       context = CommentContext.fromJson(_json['context']);
     }
     if (_json.containsKey('createdDate')) {
-      createdDate = core.DateTime.parse(_json['createdDate']);
+      createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
@@ -7250,7 +7251,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('modifiedDate')) {
-      modifiedDate = core.DateTime.parse(_json['modifiedDate']);
+      modifiedDate = core.DateTime.parse(_json['modifiedDate'] as core.String);
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
@@ -7429,7 +7430,7 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('createdDate')) {
-      createdDate = core.DateTime.parse(_json['createdDate']);
+      createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
@@ -7441,7 +7442,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('modifiedDate')) {
-      modifiedDate = core.DateTime.parse(_json['modifiedDate']);
+      modifiedDate = core.DateTime.parse(_json['modifiedDate'] as core.String);
     }
     if (_json.containsKey('replyId')) {
       replyId = _json['replyId'] as core.String;
@@ -7584,7 +7585,8 @@
       restrictingUser = User.fromJson(_json['restrictingUser']);
     }
     if (_json.containsKey('restrictionDate')) {
-      restrictionDate = core.DateTime.parse(_json['restrictionDate']);
+      restrictionDate =
+          core.DateTime.parse(_json['restrictionDate'] as core.String);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -7648,13 +7650,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
     if (_json.containsKey('xCoordinate')) {
-      xCoordinate = _json['xCoordinate'].toDouble();
+      xCoordinate = (_json['xCoordinate'] as core.num).toDouble();
     }
     if (_json.containsKey('yCoordinate')) {
-      yCoordinate = _json['yCoordinate'].toDouble();
+      yCoordinate = (_json['yCoordinate'] as core.num).toDouble();
     }
   }
 
@@ -7990,7 +7992,7 @@
       colorRgb = _json['colorRgb'] as core.String;
     }
     if (_json.containsKey('createdDate')) {
-      createdDate = core.DateTime.parse(_json['createdDate']);
+      createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
     }
     if (_json.containsKey('hidden')) {
       hidden = _json['hidden'] as core.bool;
@@ -8470,13 +8472,13 @@
 
   FileImageMediaMetadataLocation.fromJson(core.Map _json) {
     if (_json.containsKey('altitude')) {
-      altitude = _json['altitude'].toDouble();
+      altitude = (_json['altitude'] as core.num).toDouble();
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -8567,7 +8569,7 @@
 
   FileImageMediaMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('aperture')) {
-      aperture = _json['aperture'].toDouble();
+      aperture = (_json['aperture'] as core.num).toDouble();
     }
     if (_json.containsKey('cameraMake')) {
       cameraMake = _json['cameraMake'] as core.String;
@@ -8582,19 +8584,19 @@
       date = _json['date'] as core.String;
     }
     if (_json.containsKey('exposureBias')) {
-      exposureBias = _json['exposureBias'].toDouble();
+      exposureBias = (_json['exposureBias'] as core.num).toDouble();
     }
     if (_json.containsKey('exposureMode')) {
       exposureMode = _json['exposureMode'] as core.String;
     }
     if (_json.containsKey('exposureTime')) {
-      exposureTime = _json['exposureTime'].toDouble();
+      exposureTime = (_json['exposureTime'] as core.num).toDouble();
     }
     if (_json.containsKey('flashUsed')) {
       flashUsed = _json['flashUsed'] as core.bool;
     }
     if (_json.containsKey('focalLength')) {
-      focalLength = _json['focalLength'].toDouble();
+      focalLength = (_json['focalLength'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -8609,7 +8611,7 @@
       location = FileImageMediaMetadataLocation.fromJson(_json['location']);
     }
     if (_json.containsKey('maxApertureValue')) {
-      maxApertureValue = _json['maxApertureValue'].toDouble();
+      maxApertureValue = (_json['maxApertureValue'] as core.num).toDouble();
     }
     if (_json.containsKey('meteringMode')) {
       meteringMode = _json['meteringMode'] as core.String;
@@ -9215,7 +9217,7 @@
       copyable = _json['copyable'] as core.bool;
     }
     if (_json.containsKey('createdDate')) {
-      createdDate = core.DateTime.parse(_json['createdDate']);
+      createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
     }
     if (_json.containsKey('defaultOpenWithLink')) {
       defaultOpenWithLink = _json['defaultOpenWithLink'] as core.String;
@@ -9296,10 +9298,12 @@
       lastModifyingUserName = _json['lastModifyingUserName'] as core.String;
     }
     if (_json.containsKey('lastViewedByMeDate')) {
-      lastViewedByMeDate = core.DateTime.parse(_json['lastViewedByMeDate']);
+      lastViewedByMeDate =
+          core.DateTime.parse(_json['lastViewedByMeDate'] as core.String);
     }
     if (_json.containsKey('markedViewedByMeDate')) {
-      markedViewedByMeDate = core.DateTime.parse(_json['markedViewedByMeDate']);
+      markedViewedByMeDate =
+          core.DateTime.parse(_json['markedViewedByMeDate'] as core.String);
     }
     if (_json.containsKey('md5Checksum')) {
       md5Checksum = _json['md5Checksum'] as core.String;
@@ -9308,10 +9312,11 @@
       mimeType = _json['mimeType'] as core.String;
     }
     if (_json.containsKey('modifiedByMeDate')) {
-      modifiedByMeDate = core.DateTime.parse(_json['modifiedByMeDate']);
+      modifiedByMeDate =
+          core.DateTime.parse(_json['modifiedByMeDate'] as core.String);
     }
     if (_json.containsKey('modifiedDate')) {
-      modifiedDate = core.DateTime.parse(_json['modifiedDate']);
+      modifiedDate = core.DateTime.parse(_json['modifiedDate'] as core.String);
     }
     if (_json.containsKey('openWithLinks')) {
       openWithLinks = commons.mapMap<core.String, core.String>(
@@ -9367,7 +9372,8 @@
       shared = _json['shared'] as core.bool;
     }
     if (_json.containsKey('sharedWithMeDate')) {
-      sharedWithMeDate = core.DateTime.parse(_json['sharedWithMeDate']);
+      sharedWithMeDate =
+          core.DateTime.parse(_json['sharedWithMeDate'] as core.String);
     }
     if (_json.containsKey('sharingUser')) {
       sharingUser = User.fromJson(_json['sharingUser']);
@@ -9396,7 +9402,7 @@
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('trashedDate')) {
-      trashedDate = core.DateTime.parse(_json['trashedDate']);
+      trashedDate = core.DateTime.parse(_json['trashedDate'] as core.String);
     }
     if (_json.containsKey('trashingUser')) {
       trashingUser = User.fromJson(_json['trashingUser']);
@@ -10124,7 +10130,8 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('expirationDate')) {
-      expirationDate = core.DateTime.parse(_json['expirationDate']);
+      expirationDate =
+          core.DateTime.parse(_json['expirationDate'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -10559,7 +10566,7 @@
       mimeType = _json['mimeType'] as core.String;
     }
     if (_json.containsKey('modifiedDate')) {
-      modifiedDate = core.DateTime.parse(_json['modifiedDate']);
+      modifiedDate = core.DateTime.parse(_json['modifiedDate'] as core.String);
     }
     if (_json.containsKey('originalFilename')) {
       originalFilename = _json['originalFilename'] as core.String;
@@ -10775,13 +10782,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
     if (_json.containsKey('xCoordinate')) {
-      xCoordinate = _json['xCoordinate'].toDouble();
+      xCoordinate = (_json['xCoordinate'] as core.num).toDouble();
     }
     if (_json.containsKey('yCoordinate')) {
-      yCoordinate = _json['yCoordinate'].toDouble();
+      yCoordinate = (_json['yCoordinate'] as core.num).toDouble();
     }
   }
 
@@ -11124,7 +11131,7 @@
       colorRgb = _json['colorRgb'] as core.String;
     }
     if (_json.containsKey('createdDate')) {
-      createdDate = core.DateTime.parse(_json['createdDate']);
+      createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
diff --git a/generated/googleapis/lib/drive/v3.dart b/generated/googleapis/lib/drive/v3.dart
index 6fcde5a..b40df63 100644
--- a/generated/googleapis/lib/drive/v3.dart
+++ b/generated/googleapis/lib/drive/v3.dart
@@ -4019,7 +4019,7 @@
       teamDriveId = _json['teamDriveId'] as core.String;
     }
     if (_json.containsKey('time')) {
-      time = core.DateTime.parse(_json['time']);
+      time = core.DateTime.parse(_json['time'] as core.String);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -4324,7 +4324,7 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('createdTime')) {
-      createdTime = core.DateTime.parse(_json['createdTime']);
+      createdTime = core.DateTime.parse(_json['createdTime'] as core.String);
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
@@ -4339,7 +4339,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('modifiedTime')) {
-      modifiedTime = core.DateTime.parse(_json['modifiedTime']);
+      modifiedTime = core.DateTime.parse(_json['modifiedTime'] as core.String);
     }
     if (_json.containsKey('quotedFileContent')) {
       quotedFileContent =
@@ -4480,7 +4480,8 @@
       restrictingUser = User.fromJson(_json['restrictingUser']);
     }
     if (_json.containsKey('restrictionTime')) {
-      restrictionTime = core.DateTime.parse(_json['restrictionTime']);
+      restrictionTime =
+          core.DateTime.parse(_json['restrictionTime'] as core.String);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -4544,13 +4545,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
     if (_json.containsKey('xCoordinate')) {
-      xCoordinate = _json['xCoordinate'].toDouble();
+      xCoordinate = (_json['xCoordinate'] as core.num).toDouble();
     }
     if (_json.containsKey('yCoordinate')) {
-      yCoordinate = _json['yCoordinate'].toDouble();
+      yCoordinate = (_json['yCoordinate'] as core.num).toDouble();
     }
   }
 
@@ -4887,7 +4888,7 @@
       colorRgb = _json['colorRgb'] as core.String;
     }
     if (_json.containsKey('createdTime')) {
-      createdTime = core.DateTime.parse(_json['createdTime']);
+      createdTime = core.DateTime.parse(_json['createdTime'] as core.String);
     }
     if (_json.containsKey('hidden')) {
       hidden = _json['hidden'] as core.bool;
@@ -5440,13 +5441,13 @@
 
   FileImageMediaMetadataLocation.fromJson(core.Map _json) {
     if (_json.containsKey('altitude')) {
-      altitude = _json['altitude'].toDouble();
+      altitude = (_json['altitude'] as core.num).toDouble();
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -5536,7 +5537,7 @@
 
   FileImageMediaMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('aperture')) {
-      aperture = _json['aperture'].toDouble();
+      aperture = (_json['aperture'] as core.num).toDouble();
     }
     if (_json.containsKey('cameraMake')) {
       cameraMake = _json['cameraMake'] as core.String;
@@ -5548,19 +5549,19 @@
       colorSpace = _json['colorSpace'] as core.String;
     }
     if (_json.containsKey('exposureBias')) {
-      exposureBias = _json['exposureBias'].toDouble();
+      exposureBias = (_json['exposureBias'] as core.num).toDouble();
     }
     if (_json.containsKey('exposureMode')) {
       exposureMode = _json['exposureMode'] as core.String;
     }
     if (_json.containsKey('exposureTime')) {
-      exposureTime = _json['exposureTime'].toDouble();
+      exposureTime = (_json['exposureTime'] as core.num).toDouble();
     }
     if (_json.containsKey('flashUsed')) {
       flashUsed = _json['flashUsed'] as core.bool;
     }
     if (_json.containsKey('focalLength')) {
-      focalLength = _json['focalLength'].toDouble();
+      focalLength = (_json['focalLength'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -5575,7 +5576,7 @@
       location = FileImageMediaMetadataLocation.fromJson(_json['location']);
     }
     if (_json.containsKey('maxApertureValue')) {
-      maxApertureValue = _json['maxApertureValue'].toDouble();
+      maxApertureValue = (_json['maxApertureValue'] as core.num).toDouble();
     }
     if (_json.containsKey('meteringMode')) {
       meteringMode = _json['meteringMode'] as core.String;
@@ -6006,7 +6007,7 @@
           _json['copyRequiresWriterPermission'] as core.bool;
     }
     if (_json.containsKey('createdTime')) {
-      createdTime = core.DateTime.parse(_json['createdTime']);
+      createdTime = core.DateTime.parse(_json['createdTime'] as core.String);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -6069,10 +6070,11 @@
       modifiedByMe = _json['modifiedByMe'] as core.bool;
     }
     if (_json.containsKey('modifiedByMeTime')) {
-      modifiedByMeTime = core.DateTime.parse(_json['modifiedByMeTime']);
+      modifiedByMeTime =
+          core.DateTime.parse(_json['modifiedByMeTime'] as core.String);
     }
     if (_json.containsKey('modifiedTime')) {
-      modifiedTime = core.DateTime.parse(_json['modifiedTime']);
+      modifiedTime = core.DateTime.parse(_json['modifiedTime'] as core.String);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6115,7 +6117,8 @@
       shared = _json['shared'] as core.bool;
     }
     if (_json.containsKey('sharedWithMeTime')) {
-      sharedWithMeTime = core.DateTime.parse(_json['sharedWithMeTime']);
+      sharedWithMeTime =
+          core.DateTime.parse(_json['sharedWithMeTime'] as core.String);
     }
     if (_json.containsKey('sharingUser')) {
       sharingUser = User.fromJson(_json['sharingUser']);
@@ -6147,7 +6150,7 @@
       trashed = _json['trashed'] as core.bool;
     }
     if (_json.containsKey('trashedTime')) {
-      trashedTime = core.DateTime.parse(_json['trashedTime']);
+      trashedTime = core.DateTime.parse(_json['trashedTime'] as core.String);
     }
     if (_json.containsKey('trashingUser')) {
       trashingUser = User.fromJson(_json['trashingUser']);
@@ -6163,7 +6166,8 @@
       viewedByMe = _json['viewedByMe'] as core.bool;
     }
     if (_json.containsKey('viewedByMeTime')) {
-      viewedByMeTime = core.DateTime.parse(_json['viewedByMeTime']);
+      viewedByMeTime =
+          core.DateTime.parse(_json['viewedByMeTime'] as core.String);
     }
     if (_json.containsKey('viewersCanCopyContent')) {
       viewersCanCopyContent = _json['viewersCanCopyContent'] as core.bool;
@@ -6665,7 +6669,8 @@
       emailAddress = _json['emailAddress'] as core.String;
     }
     if (_json.containsKey('expirationTime')) {
-      expirationTime = core.DateTime.parse(_json['expirationTime']);
+      expirationTime =
+          core.DateTime.parse(_json['expirationTime'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -6846,7 +6851,7 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('createdTime')) {
-      createdTime = core.DateTime.parse(_json['createdTime']);
+      createdTime = core.DateTime.parse(_json['createdTime'] as core.String);
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
@@ -6861,7 +6866,7 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('modifiedTime')) {
-      modifiedTime = core.DateTime.parse(_json['modifiedTime']);
+      modifiedTime = core.DateTime.parse(_json['modifiedTime'] as core.String);
     }
   }
 
@@ -7027,7 +7032,7 @@
       mimeType = _json['mimeType'] as core.String;
     }
     if (_json.containsKey('modifiedTime')) {
-      modifiedTime = core.DateTime.parse(_json['modifiedTime']);
+      modifiedTime = core.DateTime.parse(_json['modifiedTime'] as core.String);
     }
     if (_json.containsKey('originalFilename')) {
       originalFilename = _json['originalFilename'] as core.String;
@@ -7211,13 +7216,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
     if (_json.containsKey('xCoordinate')) {
-      xCoordinate = _json['xCoordinate'].toDouble();
+      xCoordinate = (_json['xCoordinate'] as core.num).toDouble();
     }
     if (_json.containsKey('yCoordinate')) {
-      yCoordinate = _json['yCoordinate'].toDouble();
+      yCoordinate = (_json['yCoordinate'] as core.num).toDouble();
     }
   }
 
@@ -7561,7 +7566,7 @@
       colorRgb = _json['colorRgb'] as core.String;
     }
     if (_json.containsKey('createdTime')) {
-      createdTime = core.DateTime.parse(_json['createdTime']);
+      createdTime = core.DateTime.parse(_json['createdTime'] as core.String);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
diff --git a/generated/googleapis/lib/fcm/v1.dart b/generated/googleapis/lib/fcm/v1.dart
index 9ee5d3a..4a92971 100644
--- a/generated/googleapis/lib/fcm/v1.dart
+++ b/generated/googleapis/lib/fcm/v1.dart
@@ -777,16 +777,16 @@
 
   Color.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/firestore/v1.dart b/generated/googleapis/lib/firestore/v1.dart
index 0f1f08f..4c78b61 100644
--- a/generated/googleapis/lib/firestore/v1.dart
+++ b/generated/googleapis/lib/firestore/v1.dart
@@ -4186,10 +4186,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -5439,7 +5439,7 @@
       bytesValue = _json['bytesValue'] as core.String;
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('geoPointValue')) {
       geoPointValue = LatLng.fromJson(_json['geoPointValue']);
diff --git a/generated/googleapis/lib/fitness/v1.dart b/generated/googleapis/lib/fitness/v1.dart
index 8c010f7..6dda893 100644
--- a/generated/googleapis/lib/fitness/v1.dart
+++ b/generated/googleapis/lib/fitness/v1.dart
@@ -2185,7 +2185,7 @@
 
   MapValue.fromJson(core.Map _json) {
     if (_json.containsKey('fpVal')) {
-      fpVal = _json['fpVal'].toDouble();
+      fpVal = (_json['fpVal'] as core.num).toDouble();
     }
   }
 
@@ -2323,7 +2323,7 @@
 
   Value.fromJson(core.Map _json) {
     if (_json.containsKey('fpVal')) {
-      fpVal = _json['fpVal'].toDouble();
+      fpVal = (_json['fpVal'] as core.num).toDouble();
     }
     if (_json.containsKey('intVal')) {
       intVal = _json['intVal'] as core.int;
diff --git a/generated/googleapis/lib/games/v1.dart b/generated/googleapis/lib/games/v1.dart
index 0cc5b89..f52f0f7 100644
--- a/generated/googleapis/lib/games/v1.dart
+++ b/generated/googleapis/lib/games/v1.dart
@@ -5516,16 +5516,18 @@
 
   StatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('avg_session_length_minutes')) {
-      avgSessionLengthMinutes = _json['avg_session_length_minutes'].toDouble();
+      avgSessionLengthMinutes =
+          (_json['avg_session_length_minutes'] as core.num).toDouble();
     }
     if (_json.containsKey('churn_probability')) {
-      churnProbability = _json['churn_probability'].toDouble();
+      churnProbability = (_json['churn_probability'] as core.num).toDouble();
     }
     if (_json.containsKey('days_since_last_played')) {
       daysSinceLastPlayed = _json['days_since_last_played'] as core.int;
     }
     if (_json.containsKey('high_spender_probability')) {
-      highSpenderProbability = _json['high_spender_probability'].toDouble();
+      highSpenderProbability =
+          (_json['high_spender_probability'] as core.num).toDouble();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -5537,16 +5539,18 @@
       numSessions = _json['num_sessions'] as core.int;
     }
     if (_json.containsKey('num_sessions_percentile')) {
-      numSessionsPercentile = _json['num_sessions_percentile'].toDouble();
+      numSessionsPercentile =
+          (_json['num_sessions_percentile'] as core.num).toDouble();
     }
     if (_json.containsKey('spend_percentile')) {
-      spendPercentile = _json['spend_percentile'].toDouble();
+      spendPercentile = (_json['spend_percentile'] as core.num).toDouble();
     }
     if (_json.containsKey('spend_probability')) {
-      spendProbability = _json['spend_probability'].toDouble();
+      spendProbability = (_json['spend_probability'] as core.num).toDouble();
     }
     if (_json.containsKey('total_spend_next_28_days')) {
-      totalSpendNext28Days = _json['total_spend_next_28_days'].toDouble();
+      totalSpendNext28Days =
+          (_json['total_spend_next_28_days'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/identitytoolkit/v3.dart b/generated/googleapis/lib/identitytoolkit/v3.dart
index 94d966b..969f957 100644
--- a/generated/googleapis/lib/identitytoolkit/v3.dart
+++ b/generated/googleapis/lib/identitytoolkit/v3.dart
@@ -4065,7 +4065,7 @@
       passwordHash = _json['passwordHash'] as core.String;
     }
     if (_json.containsKey('passwordUpdatedAt')) {
-      passwordUpdatedAt = _json['passwordUpdatedAt'].toDouble();
+      passwordUpdatedAt = (_json['passwordUpdatedAt'] as core.num).toDouble();
     }
     if (_json.containsKey('phoneNumber')) {
       phoneNumber = _json['phoneNumber'] as core.String;
diff --git a/generated/googleapis/lib/jobs/v2.dart b/generated/googleapis/lib/jobs/v2.dart
index babb7b1..47ed21b 100644
--- a/generated/googleapis/lib/jobs/v2.dart
+++ b/generated/googleapis/lib/jobs/v2.dart
@@ -1145,10 +1145,10 @@
 
   BucketRange.fromJson(core.Map _json) {
     if (_json.containsKey('from')) {
-      from = _json['from'].toDouble();
+      from = (_json['from'] as core.num).toDouble();
     }
     if (_json.containsKey('to')) {
-      to = _json['to'].toDouble();
+      to = (_json['to'] as core.num).toDouble();
     }
   }
 
@@ -1671,7 +1671,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('expectedUnitsPerYear')) {
-      expectedUnitsPerYear = _json['expectedUnitsPerYear'].toDouble();
+      expectedUnitsPerYear =
+          (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
       range = CompensationRange.fromJson(_json['range']);
@@ -3282,7 +3283,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('expectedUnitsPerYear')) {
-      expectedUnitsPerYear = _json['expectedUnitsPerYear'].toDouble();
+      expectedUnitsPerYear =
+          (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
       range = GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
@@ -4080,7 +4082,7 @@
       postalAddress = PostalAddress.fromJson(_json['postalAddress']);
     }
     if (_json.containsKey('radiusMiles')) {
-      radiusMiles = _json['radiusMiles'].toDouble();
+      radiusMiles = (_json['radiusMiles'] as core.num).toDouble();
     }
   }
 
@@ -5177,7 +5179,7 @@
       postalAddress = PostalAddress.fromJson(_json['postalAddress']);
     }
     if (_json.containsKey('radiusMeters')) {
-      radiusMeters = _json['radiusMeters'].toDouble();
+      radiusMeters = (_json['radiusMeters'] as core.num).toDouble();
     }
   }
 
@@ -5448,10 +5450,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -5649,7 +5651,7 @@
 
   LocationFilter.fromJson(core.Map _json) {
     if (_json.containsKey('distanceInMiles')) {
-      distanceInMiles = _json['distanceInMiles'].toDouble();
+      distanceInMiles = (_json['distanceInMiles'] as core.num).toDouble();
     }
     if (_json.containsKey('isTelecommute')) {
       isTelecommute = _json['isTelecommute'] as core.bool;
@@ -6054,7 +6056,7 @@
   NumericBucketingOption.fromJson(core.Map _json) {
     if (_json.containsKey('bucketBounds')) {
       bucketBounds = (_json['bucketBounds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('requiresMinMax')) {
@@ -6097,10 +6099,10 @@
           .toList();
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/jobs/v3.dart b/generated/googleapis/lib/jobs/v3.dart
index a63a50d..54cf73d 100644
--- a/generated/googleapis/lib/jobs/v3.dart
+++ b/generated/googleapis/lib/jobs/v3.dart
@@ -1166,10 +1166,10 @@
 
   BucketRange.fromJson(core.Map _json) {
     if (_json.containsKey('from')) {
-      from = _json['from'].toDouble();
+      from = (_json['from'] as core.num).toDouble();
     }
     if (_json.containsKey('to')) {
-      to = _json['to'].toDouble();
+      to = (_json['to'] as core.num).toDouble();
     }
   }
 
@@ -1677,7 +1677,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('expectedUnitsPerYear')) {
-      expectedUnitsPerYear = _json['expectedUnitsPerYear'].toDouble();
+      expectedUnitsPerYear =
+          (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
       range = CompensationRange.fromJson(_json['range']);
@@ -2627,7 +2628,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('expectedUnitsPerYear')) {
-      expectedUnitsPerYear = _json['expectedUnitsPerYear'].toDouble();
+      expectedUnitsPerYear =
+          (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
       range = GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
@@ -3425,7 +3427,7 @@
       postalAddress = PostalAddress.fromJson(_json['postalAddress']);
     }
     if (_json.containsKey('radiusMiles')) {
-      radiusMiles = _json['radiusMiles'].toDouble();
+      radiusMiles = (_json['radiusMiles'] as core.num).toDouble();
     }
   }
 
@@ -4423,10 +4425,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -4583,7 +4585,7 @@
       postalAddress = PostalAddress.fromJson(_json['postalAddress']);
     }
     if (_json.containsKey('radiusInMiles')) {
-      radiusInMiles = _json['radiusInMiles'].toDouble();
+      radiusInMiles = (_json['radiusInMiles'] as core.num).toDouble();
     }
   }
 
@@ -4656,7 +4658,7 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('distanceInMiles')) {
-      distanceInMiles = _json['distanceInMiles'].toDouble();
+      distanceInMiles = (_json['distanceInMiles'] as core.num).toDouble();
     }
     if (_json.containsKey('latLng')) {
       latLng = LatLng.fromJson(_json['latLng']);
@@ -5057,7 +5059,7 @@
   NumericBucketingOption.fromJson(core.Map _json) {
     if (_json.containsKey('bucketBounds')) {
       bucketBounds = (_json['bucketBounds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('requiresMinMax')) {
@@ -5100,10 +5102,10 @@
           .toList();
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/language/v1.dart b/generated/googleapis/lib/language/v1.dart
index 887a935..04c3521 100644
--- a/generated/googleapis/lib/language/v1.dart
+++ b/generated/googleapis/lib/language/v1.dart
@@ -836,7 +836,7 @@
 
   ClassificationCategory.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1166,7 +1166,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('salience')) {
-      salience = _json['salience'].toDouble();
+      salience = (_json['salience'] as core.num).toDouble();
     }
     if (_json.containsKey('sentiment')) {
       sentiment = Sentiment.fromJson(_json['sentiment']);
@@ -1583,10 +1583,10 @@
 
   Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/logging/v2.dart b/generated/googleapis/lib/logging/v2.dart
index 0d8d242..6e7bf74 100644
--- a/generated/googleapis/lib/logging/v2.dart
+++ b/generated/googleapis/lib/logging/v2.dart
@@ -7523,7 +7523,7 @@
   Explicit.fromJson(core.Map _json) {
     if (_json.containsKey('bounds')) {
       bounds = (_json['bounds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -7557,13 +7557,13 @@
 
   Exponential.fromJson(core.Map _json) {
     if (_json.containsKey('growthFactor')) {
-      growthFactor = _json['growthFactor'].toDouble();
+      growthFactor = (_json['growthFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('numFiniteBuckets')) {
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('scale')) {
-      scale = _json['scale'].toDouble();
+      scale = (_json['scale'] as core.num).toDouble();
     }
   }
 
@@ -7813,10 +7813,10 @@
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('offset')) {
-      offset = _json['offset'].toDouble();
+      offset = (_json['offset'] as core.num).toDouble();
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
   }
 
@@ -9799,7 +9799,7 @@
       appId = _json['appId'] as core.String;
     }
     if (_json.containsKey('cost')) {
-      cost = _json['cost'].toDouble();
+      cost = (_json['cost'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
diff --git a/generated/googleapis/lib/ml/v1.dart b/generated/googleapis/lib/ml/v1.dart
index cc2e64a..27ade3c 100644
--- a/generated/googleapis/lib/ml/v1.dart
+++ b/generated/googleapis/lib/ml/v1.dart
@@ -2938,7 +2938,7 @@
   GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(
       core.Map _json) {
     if (_json.containsKey('objectiveValue')) {
-      objectiveValue = _json['objectiveValue'].toDouble();
+      objectiveValue = (_json['objectiveValue'] as core.num).toDouble();
     }
     if (_json.containsKey('trainingStep')) {
       trainingStep = _json['trainingStep'] as core.String;
@@ -2972,7 +2972,7 @@
       metric = _json['metric'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -3026,7 +3026,7 @@
       core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -3052,10 +3052,10 @@
   GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec.fromJson(
       core.Map _json) {
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
   }
 
@@ -3140,7 +3140,7 @@
       core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -3384,7 +3384,7 @@
 
   GoogleCloudMlV1TrialParameter.fromJson(core.Map _json) {
     if (_json.containsKey('floatValue')) {
-      floatValue = _json['floatValue'].toDouble();
+      floatValue = (_json['floatValue'] as core.num).toDouble();
     }
     if (_json.containsKey('intValue')) {
       intValue = _json['intValue'] as core.String;
@@ -5138,14 +5138,14 @@
     }
     if (_json.containsKey('discreteValues')) {
       discreteValues = (_json['discreteValues'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
     if (_json.containsKey('parameterName')) {
       parameterName = _json['parameterName'] as core.String;
@@ -5397,7 +5397,7 @@
       errorCount = _json['errorCount'] as core.String;
     }
     if (_json.containsKey('nodeHours')) {
-      nodeHours = _json['nodeHours'].toDouble();
+      nodeHours = (_json['nodeHours'] as core.num).toDouble();
     }
     if (_json.containsKey('outputPath')) {
       outputPath = _json['outputPath'] as core.String;
@@ -5552,7 +5552,7 @@
       bigqueryTableName = _json['bigqueryTableName'] as core.String;
     }
     if (_json.containsKey('samplingPercentage')) {
-      samplingPercentage = _json['samplingPercentage'].toDouble();
+      samplingPercentage = (_json['samplingPercentage'] as core.num).toDouble();
     }
   }
 
@@ -6437,7 +6437,7 @@
       completedTrialCount = _json['completedTrialCount'] as core.String;
     }
     if (_json.containsKey('consumedMLUnits')) {
-      consumedMLUnits = _json['consumedMLUnits'].toDouble();
+      consumedMLUnits = (_json['consumedMLUnits'] as core.num).toDouble();
     }
     if (_json.containsKey('hyperparameterMetricTag')) {
       hyperparameterMetricTag = _json['hyperparameterMetricTag'] as core.String;
diff --git a/generated/googleapis/lib/monitoring/v3.dart b/generated/googleapis/lib/monitoring/v3.dart
index 6f8cdf1..2830e6a 100644
--- a/generated/googleapis/lib/monitoring/v3.dart
+++ b/generated/googleapis/lib/monitoring/v3.dart
@@ -4848,13 +4848,14 @@
           .toList();
     }
     if (_json.containsKey('mean')) {
-      mean = _json['mean'].toDouble();
+      mean = (_json['mean'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
       range = Range.fromJson(_json['range']);
     }
     if (_json.containsKey('sumOfSquaredDeviation')) {
-      sumOfSquaredDeviation = _json['sumOfSquaredDeviation'].toDouble();
+      sumOfSquaredDeviation =
+          (_json['sumOfSquaredDeviation'] as core.num).toDouble();
     }
   }
 
@@ -5081,7 +5082,7 @@
       timestamp = _json['timestamp'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -5115,7 +5116,7 @@
   Explicit.fromJson(core.Map _json) {
     if (_json.containsKey('bounds')) {
       bounds = (_json['bounds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -5149,13 +5150,13 @@
 
   Exponential.fromJson(core.Map _json) {
     if (_json.containsKey('growthFactor')) {
-      growthFactor = _json['growthFactor'].toDouble();
+      growthFactor = (_json['growthFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('numFiniteBuckets')) {
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('scale')) {
-      scale = _json['scale'].toDouble();
+      scale = (_json['scale'] as core.num).toDouble();
     }
   }
 
@@ -5386,10 +5387,10 @@
 
   GoogleMonitoringV3Range.fromJson(core.Map _json) {
     if (_json.containsKey('max')) {
-      max = _json['max'].toDouble();
+      max = (_json['max'] as core.num).toDouble();
     }
     if (_json.containsKey('min')) {
-      min = _json['min'].toDouble();
+      min = (_json['min'] as core.num).toDouble();
     }
   }
 
@@ -5863,10 +5864,10 @@
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('offset')) {
-      offset = _json['offset'].toDouble();
+      offset = (_json['offset'] as core.num).toDouble();
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
   }
 
@@ -7002,7 +7003,7 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('thresholdValue')) {
-      thresholdValue = _json['thresholdValue'].toDouble();
+      thresholdValue = (_json['thresholdValue'] as core.num).toDouble();
     }
     if (_json.containsKey('trigger')) {
       trigger = Trigger.fromJson(_json['trigger']);
@@ -7655,7 +7656,7 @@
       performance = RequestBasedSli.fromJson(_json['performance']);
     }
     if (_json.containsKey('threshold')) {
-      threshold = _json['threshold'].toDouble();
+      threshold = (_json['threshold'] as core.num).toDouble();
     }
   }
 
@@ -7863,10 +7864,10 @@
 
   Range.fromJson(core.Map _json) {
     if (_json.containsKey('max')) {
-      max = _json['max'].toDouble();
+      max = (_json['max'] as core.num).toDouble();
     }
     if (_json.containsKey('min')) {
-      min = _json['min'].toDouble();
+      min = (_json['min'] as core.num).toDouble();
     }
   }
 
@@ -8166,7 +8167,7 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('goal')) {
-      goal = _json['goal'].toDouble();
+      goal = (_json['goal'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8690,7 +8691,7 @@
       count = _json['count'] as core.int;
     }
     if (_json.containsKey('percent')) {
-      percent = _json['percent'].toDouble();
+      percent = (_json['percent'] as core.num).toDouble();
     }
   }
 
@@ -8810,7 +8811,7 @@
       distributionValue = Distribution.fromJson(_json['distributionValue']);
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('int64Value')) {
       int64Value = _json['int64Value'] as core.String;
diff --git a/generated/googleapis/lib/osconfig/v1.dart b/generated/googleapis/lib/osconfig/v1.dart
index c654662..d5e5f23 100644
--- a/generated/googleapis/lib/osconfig/v1.dart
+++ b/generated/googleapis/lib/osconfig/v1.dart
@@ -1581,7 +1581,7 @@
       patchDeployment = _json['patchDeployment'] as core.String;
     }
     if (_json.containsKey('percentComplete')) {
-      percentComplete = _json['percentComplete'].toDouble();
+      percentComplete = (_json['percentComplete'] as core.num).toDouble();
     }
     if (_json.containsKey('rollout')) {
       rollout = PatchRollout.fromJson(_json['rollout']);
diff --git a/generated/googleapis/lib/pagespeedonline/v5.dart b/generated/googleapis/lib/pagespeedonline/v5.dart
index ac99335..4ce91d4 100644
--- a/generated/googleapis/lib/pagespeedonline/v5.dart
+++ b/generated/googleapis/lib/pagespeedonline/v5.dart
@@ -170,7 +170,7 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('weight')) {
-      weight = _json['weight'].toDouble();
+      weight = (_json['weight'] as core.num).toDouble();
     }
   }
 
@@ -212,7 +212,7 @@
       min = _json['min'] as core.int;
     }
     if (_json.containsKey('proportion')) {
-      proportion = _json['proportion'].toDouble();
+      proportion = (_json['proportion'] as core.num).toDouble();
     }
   }
 
@@ -389,7 +389,7 @@
 
   Environment.fromJson(core.Map _json) {
     if (_json.containsKey('benchmarkIndex')) {
-      benchmarkIndex = _json['benchmarkIndex'].toDouble();
+      benchmarkIndex = (_json['benchmarkIndex'] as core.num).toDouble();
     }
     if (_json.containsKey('hostUserAgent')) {
       hostUserAgent = _json['hostUserAgent'] as core.String;
@@ -508,7 +508,7 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('numericValue')) {
-      numericValue = _json['numericValue'].toDouble();
+      numericValue = (_json['numericValue'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
       score = _json['score'] as core.Object;
@@ -1237,7 +1237,7 @@
 
   Timing.fromJson(core.Map _json) {
     if (_json.containsKey('total')) {
-      total = _json['total'].toDouble();
+      total = (_json['total'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/poly/v1.dart b/generated/googleapis/lib/poly/v1.dart
index 329c432..71c99b0 100644
--- a/generated/googleapis/lib/poly/v1.dart
+++ b/generated/googleapis/lib/poly/v1.dart
@@ -1212,16 +1212,16 @@
 
   Quaternion.fromJson(core.Map _json) {
     if (_json.containsKey('w')) {
-      w = _json['w'].toDouble();
+      w = (_json['w'] as core.num).toDouble();
     }
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/remotebuildexecution/v2.dart b/generated/googleapis/lib/remotebuildexecution/v2.dart
index 6dcca48..53a008c 100644
--- a/generated/googleapis/lib/remotebuildexecution/v2.dart
+++ b/generated/googleapis/lib/remotebuildexecution/v2.dart
@@ -3228,7 +3228,7 @@
       dockerImageName = _json['dockerImageName'] as core.String;
     }
     if (_json.containsKey('inputCacheMiss')) {
-      inputCacheMiss = _json['inputCacheMiss'].toDouble();
+      inputCacheMiss = (_json['inputCacheMiss'] as core.num).toDouble();
     }
     if (_json.containsKey('numErrors')) {
       numErrors = _json['numErrors'] as core.String;
@@ -3360,7 +3360,7 @@
 
   GoogleDevtoolsRemotebuildbotResourceUsage.fromJson(core.Map _json) {
     if (_json.containsKey('cpuUsedPercent')) {
-      cpuUsedPercent = _json['cpuUsedPercent'].toDouble();
+      cpuUsedPercent = (_json['cpuUsedPercent'] as core.num).toDouble();
     }
     if (_json.containsKey('diskUsage')) {
       diskUsage = GoogleDevtoolsRemotebuildbotResourceUsageStat.fromJson(
diff --git a/generated/googleapis/lib/script/v1.dart b/generated/googleapis/lib/script/v1.dart
index 9b6b4cb..4a5cc97 100644
--- a/generated/googleapis/lib/script/v1.dart
+++ b/generated/googleapis/lib/script/v1.dart
@@ -2778,7 +2778,7 @@
       nullValue = _json['nullValue'] as core.String;
     }
     if (_json.containsKey('numberValue')) {
-      numberValue = _json['numberValue'].toDouble();
+      numberValue = (_json['numberValue'] as core.num).toDouble();
     }
     if (_json.containsKey('protoValue')) {
       protoValue = commons.mapMap<core.Object, core.Object>(
diff --git a/generated/googleapis/lib/searchconsole/v1.dart b/generated/googleapis/lib/searchconsole/v1.dart
index 7b491e1..81af7c0 100644
--- a/generated/googleapis/lib/searchconsole/v1.dart
+++ b/generated/googleapis/lib/searchconsole/v1.dart
@@ -638,13 +638,13 @@
 
   ApiDataRow.fromJson(core.Map _json) {
     if (_json.containsKey('clicks')) {
-      clicks = _json['clicks'].toDouble();
+      clicks = (_json['clicks'] as core.num).toDouble();
     }
     if (_json.containsKey('ctr')) {
-      ctr = _json['ctr'].toDouble();
+      ctr = (_json['ctr'] as core.num).toDouble();
     }
     if (_json.containsKey('impressions')) {
-      impressions = _json['impressions'].toDouble();
+      impressions = (_json['impressions'] as core.num).toDouble();
     }
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
@@ -652,7 +652,7 @@
           .toList();
     }
     if (_json.containsKey('position')) {
-      position = _json['position'].toDouble();
+      position = (_json['position'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/serviceconsumermanagement/v1.dart b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
index 9c160c1..68c60d1 100644
--- a/generated/googleapis/lib/serviceconsumermanagement/v1.dart
+++ b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
@@ -1556,7 +1556,7 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('deadline')) {
-      deadline = _json['deadline'].toDouble();
+      deadline = (_json['deadline'] as core.num).toDouble();
     }
     if (_json.containsKey('disableAuth')) {
       disableAuth = _json['disableAuth'] as core.bool;
@@ -1565,10 +1565,10 @@
       jwtAudience = _json['jwtAudience'] as core.String;
     }
     if (_json.containsKey('minDeadline')) {
-      minDeadline = _json['minDeadline'].toDouble();
+      minDeadline = (_json['minDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('operationDeadline')) {
-      operationDeadline = _json['operationDeadline'].toDouble();
+      operationDeadline = (_json['operationDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('pathTranslation')) {
       pathTranslation = _json['pathTranslation'] as core.String;
diff --git a/generated/googleapis/lib/servicecontrol/v1.dart b/generated/googleapis/lib/servicecontrol/v1.dart
index 51775b4..8df7bf4 100644
--- a/generated/googleapis/lib/servicecontrol/v1.dart
+++ b/generated/googleapis/lib/servicecontrol/v1.dart
@@ -1322,16 +1322,17 @@
       linearBuckets = LinearBuckets.fromJson(_json['linearBuckets']);
     }
     if (_json.containsKey('maximum')) {
-      maximum = _json['maximum'].toDouble();
+      maximum = (_json['maximum'] as core.num).toDouble();
     }
     if (_json.containsKey('mean')) {
-      mean = _json['mean'].toDouble();
+      mean = (_json['mean'] as core.num).toDouble();
     }
     if (_json.containsKey('minimum')) {
-      minimum = _json['minimum'].toDouble();
+      minimum = (_json['minimum'] as core.num).toDouble();
     }
     if (_json.containsKey('sumOfSquaredDeviation')) {
-      sumOfSquaredDeviation = _json['sumOfSquaredDeviation'].toDouble();
+      sumOfSquaredDeviation =
+          (_json['sumOfSquaredDeviation'] as core.num).toDouble();
     }
   }
 
@@ -1410,7 +1411,7 @@
       timestamp = _json['timestamp'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -1447,7 +1448,7 @@
   ExplicitBuckets.fromJson(core.Map _json) {
     if (_json.containsKey('bounds')) {
       bounds = (_json['bounds'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -1482,13 +1483,13 @@
 
   ExponentialBuckets.fromJson(core.Map _json) {
     if (_json.containsKey('growthFactor')) {
-      growthFactor = _json['growthFactor'].toDouble();
+      growthFactor = (_json['growthFactor'] as core.num).toDouble();
     }
     if (_json.containsKey('numFiniteBuckets')) {
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('scale')) {
-      scale = _json['scale'].toDouble();
+      scale = (_json['scale'] as core.num).toDouble();
     }
   }
 
@@ -1731,10 +1732,10 @@
       numFiniteBuckets = _json['numFiniteBuckets'] as core.int;
     }
     if (_json.containsKey('offset')) {
-      offset = _json['offset'].toDouble();
+      offset = (_json['offset'] as core.num).toDouble();
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
   }
 
@@ -2059,7 +2060,7 @@
       distributionValue = Distribution.fromJson(_json['distributionValue']);
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
diff --git a/generated/googleapis/lib/servicemanagement/v1.dart b/generated/googleapis/lib/servicemanagement/v1.dart
index 1f75e51..5a463fd 100644
--- a/generated/googleapis/lib/servicemanagement/v1.dart
+++ b/generated/googleapis/lib/servicemanagement/v1.dart
@@ -2122,7 +2122,7 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('deadline')) {
-      deadline = _json['deadline'].toDouble();
+      deadline = (_json['deadline'] as core.num).toDouble();
     }
     if (_json.containsKey('disableAuth')) {
       disableAuth = _json['disableAuth'] as core.bool;
@@ -2131,10 +2131,10 @@
       jwtAudience = _json['jwtAudience'] as core.String;
     }
     if (_json.containsKey('minDeadline')) {
-      minDeadline = _json['minDeadline'].toDouble();
+      minDeadline = (_json['minDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('operationDeadline')) {
-      operationDeadline = _json['operationDeadline'].toDouble();
+      operationDeadline = (_json['operationDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('pathTranslation')) {
       pathTranslation = _json['pathTranslation'] as core.String;
@@ -6587,7 +6587,7 @@
     if (_json.containsKey('percentages')) {
       percentages = commons.mapMap<core.num, core.double>(
           _json['percentages'].cast<core.String, core.num>(),
-          (core.num item) => item.toDouble());
+          (core.num item) => (item as core.num).toDouble());
     }
   }
 
diff --git a/generated/googleapis/lib/servicenetworking/v1.dart b/generated/googleapis/lib/servicenetworking/v1.dart
index d8ed810..5f6d08d 100644
--- a/generated/googleapis/lib/servicenetworking/v1.dart
+++ b/generated/googleapis/lib/servicenetworking/v1.dart
@@ -2254,7 +2254,7 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('deadline')) {
-      deadline = _json['deadline'].toDouble();
+      deadline = (_json['deadline'] as core.num).toDouble();
     }
     if (_json.containsKey('disableAuth')) {
       disableAuth = _json['disableAuth'] as core.bool;
@@ -2263,10 +2263,10 @@
       jwtAudience = _json['jwtAudience'] as core.String;
     }
     if (_json.containsKey('minDeadline')) {
-      minDeadline = _json['minDeadline'].toDouble();
+      minDeadline = (_json['minDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('operationDeadline')) {
-      operationDeadline = _json['operationDeadline'].toDouble();
+      operationDeadline = (_json['operationDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('pathTranslation')) {
       pathTranslation = _json['pathTranslation'] as core.String;
diff --git a/generated/googleapis/lib/serviceusage/v1.dart b/generated/googleapis/lib/serviceusage/v1.dart
index 5fd93e5..770ddc1 100644
--- a/generated/googleapis/lib/serviceusage/v1.dart
+++ b/generated/googleapis/lib/serviceusage/v1.dart
@@ -1237,7 +1237,7 @@
       address = _json['address'] as core.String;
     }
     if (_json.containsKey('deadline')) {
-      deadline = _json['deadline'].toDouble();
+      deadline = (_json['deadline'] as core.num).toDouble();
     }
     if (_json.containsKey('disableAuth')) {
       disableAuth = _json['disableAuth'] as core.bool;
@@ -1246,10 +1246,10 @@
       jwtAudience = _json['jwtAudience'] as core.String;
     }
     if (_json.containsKey('minDeadline')) {
-      minDeadline = _json['minDeadline'].toDouble();
+      minDeadline = (_json['minDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('operationDeadline')) {
-      operationDeadline = _json['operationDeadline'].toDouble();
+      operationDeadline = (_json['operationDeadline'] as core.num).toDouble();
     }
     if (_json.containsKey('pathTranslation')) {
       pathTranslation = _json['pathTranslation'] as core.String;
diff --git a/generated/googleapis/lib/sheets/v4.dart b/generated/googleapis/lib/sheets/v4.dart
index 3b9563b..c8c1424 100644
--- a/generated/googleapis/lib/sheets/v4.dart
+++ b/generated/googleapis/lib/sheets/v4.dart
@@ -3983,7 +3983,7 @@
       bubbleMinRadiusSize = _json['bubbleMinRadiusSize'] as core.int;
     }
     if (_json.containsKey('bubbleOpacity')) {
-      bubbleOpacity = _json['bubbleOpacity'].toDouble();
+      bubbleOpacity = (_json['bubbleOpacity'] as core.num).toDouble();
     }
     if (_json.containsKey('bubbleSizes')) {
       bubbleSizes = ChartData.fromJson(_json['bubbleSizes']);
@@ -4539,10 +4539,10 @@
 
   ChartAxisViewWindowOptions.fromJson(core.Map _json) {
     if (_json.containsKey('viewWindowMax')) {
-      viewWindowMax = _json['viewWindowMax'].toDouble();
+      viewWindowMax = (_json['viewWindowMax'] as core.num).toDouble();
     }
     if (_json.containsKey('viewWindowMin')) {
-      viewWindowMin = _json['viewWindowMin'].toDouble();
+      viewWindowMin = (_json['viewWindowMin'] as core.num).toDouble();
     }
     if (_json.containsKey('viewWindowMode')) {
       viewWindowMode = _json['viewWindowMode'] as core.String;
@@ -4764,13 +4764,13 @@
 
   ChartHistogramRule.fromJson(core.Map _json) {
     if (_json.containsKey('intervalSize')) {
-      intervalSize = _json['intervalSize'].toDouble();
+      intervalSize = (_json['intervalSize'] as core.num).toDouble();
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
   }
 
@@ -5217,16 +5217,16 @@
 
   Color.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
@@ -7740,7 +7740,7 @@
       formulaValue = _json['formulaValue'] as core.String;
     }
     if (_json.containsKey('numberValue')) {
-      numberValue = _json['numberValue'].toDouble();
+      numberValue = (_json['numberValue'] as core.num).toDouble();
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
@@ -8527,13 +8527,13 @@
 
   HistogramChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('bucketSize')) {
-      bucketSize = _json['bucketSize'].toDouble();
+      bucketSize = (_json['bucketSize'] as core.num).toDouble();
     }
     if (_json.containsKey('legendPosition')) {
       legendPosition = _json['legendPosition'] as core.String;
     }
     if (_json.containsKey('outlierPercentile')) {
-      outlierPercentile = _json['outlierPercentile'].toDouble();
+      outlierPercentile = (_json['outlierPercentile'] as core.num).toDouble();
     }
     if (_json.containsKey('series')) {
       series = (_json['series'] as core.List)
@@ -8601,13 +8601,13 @@
 
   HistogramRule.fromJson(core.Map _json) {
     if (_json.containsKey('end')) {
-      end = _json['end'].toDouble();
+      end = (_json['end'] as core.num).toDouble();
     }
     if (_json.containsKey('interval')) {
-      interval = _json['interval'].toDouble();
+      interval = (_json['interval'] as core.num).toDouble();
     }
     if (_json.containsKey('start')) {
-      start = _json['start'].toDouble();
+      start = (_json['start'] as core.num).toDouble();
     }
   }
 
@@ -8865,7 +8865,8 @@
 
   IterativeCalculationSettings.fromJson(core.Map _json) {
     if (_json.containsKey('convergenceThreshold')) {
-      convergenceThreshold = _json['convergenceThreshold'].toDouble();
+      convergenceThreshold =
+          (_json['convergenceThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('maxIterations')) {
       maxIterations = _json['maxIterations'] as core.int;
@@ -9581,7 +9582,7 @@
       legendPosition = _json['legendPosition'] as core.String;
     }
     if (_json.containsKey('pieHole')) {
-      pieHole = _json['pieHole'].toDouble();
+      pieHole = (_json['pieHole'] as core.num).toDouble();
     }
     if (_json.containsKey('series')) {
       series = ChartData.fromJson(_json['series']);
@@ -11450,7 +11451,7 @@
       numberFormatSource = _json['numberFormatSource'] as core.String;
     }
     if (_json.containsKey('scaleFactor')) {
-      scaleFactor = _json['scaleFactor'].toDouble();
+      scaleFactor = (_json['scaleFactor'] as core.num).toDouble();
     }
   }
 
@@ -12956,10 +12957,10 @@
       levels = _json['levels'] as core.int;
     }
     if (_json.containsKey('maxValue')) {
-      maxValue = _json['maxValue'].toDouble();
+      maxValue = (_json['maxValue'] as core.num).toDouble();
     }
     if (_json.containsKey('minValue')) {
-      minValue = _json['minValue'].toDouble();
+      minValue = (_json['minValue'] as core.num).toDouble();
     }
     if (_json.containsKey('parentLabels')) {
       parentLabels = ChartData.fromJson(_json['parentLabels']);
diff --git a/generated/googleapis/lib/slides/v1.dart b/generated/googleapis/lib/slides/v1.dart
index ce32662..718e577 100644
--- a/generated/googleapis/lib/slides/v1.dart
+++ b/generated/googleapis/lib/slides/v1.dart
@@ -442,22 +442,22 @@
 
   AffineTransform.fromJson(core.Map _json) {
     if (_json.containsKey('scaleX')) {
-      scaleX = _json['scaleX'].toDouble();
+      scaleX = (_json['scaleX'] as core.num).toDouble();
     }
     if (_json.containsKey('scaleY')) {
-      scaleY = _json['scaleY'].toDouble();
+      scaleY = (_json['scaleY'] as core.num).toDouble();
     }
     if (_json.containsKey('shearX')) {
-      shearX = _json['shearX'].toDouble();
+      shearX = (_json['shearX'] as core.num).toDouble();
     }
     if (_json.containsKey('shearY')) {
-      shearY = _json['shearY'].toDouble();
+      shearY = (_json['shearY'] as core.num).toDouble();
     }
     if (_json.containsKey('translateX')) {
-      translateX = _json['translateX'].toDouble();
+      translateX = (_json['translateX'] as core.num).toDouble();
     }
     if (_json.containsKey('translateY')) {
-      translateY = _json['translateY'].toDouble();
+      translateY = (_json['translateY'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -701,13 +701,13 @@
 
   ColorStop.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('color')) {
       color = OpaqueColor.fromJson(_json['color']);
     }
     if (_json.containsKey('position')) {
-      position = _json['position'].toDouble();
+      position = (_json['position'] as core.num).toDouble();
     }
   }
 
@@ -1740,19 +1740,19 @@
 
   CropProperties.fromJson(core.Map _json) {
     if (_json.containsKey('angle')) {
-      angle = _json['angle'].toDouble();
+      angle = (_json['angle'] as core.num).toDouble();
     }
     if (_json.containsKey('bottomOffset')) {
-      bottomOffset = _json['bottomOffset'].toDouble();
+      bottomOffset = (_json['bottomOffset'] as core.num).toDouble();
     }
     if (_json.containsKey('leftOffset')) {
-      leftOffset = _json['leftOffset'].toDouble();
+      leftOffset = (_json['leftOffset'] as core.num).toDouble();
     }
     if (_json.containsKey('rightOffset')) {
-      rightOffset = _json['rightOffset'].toDouble();
+      rightOffset = (_json['rightOffset'] as core.num).toDouble();
     }
     if (_json.containsKey('topOffset')) {
-      topOffset = _json['topOffset'].toDouble();
+      topOffset = (_json['topOffset'] as core.num).toDouble();
     }
   }
 
@@ -1983,7 +1983,7 @@
 
   Dimension.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -2244,10 +2244,10 @@
 
   ImageProperties.fromJson(core.Map _json) {
     if (_json.containsKey('brightness')) {
-      brightness = _json['brightness'].toDouble();
+      brightness = (_json['brightness'] as core.num).toDouble();
     }
     if (_json.containsKey('contrast')) {
-      contrast = _json['contrast'].toDouble();
+      contrast = (_json['contrast'] as core.num).toDouble();
     }
     if (_json.containsKey('cropProperties')) {
       cropProperties = CropProperties.fromJson(_json['cropProperties']);
@@ -2265,7 +2265,7 @@
       shadow = Shadow.fromJson(_json['shadow']);
     }
     if (_json.containsKey('transparency')) {
-      transparency = _json['transparency'].toDouble();
+      transparency = (_json['transparency'] as core.num).toDouble();
     }
   }
 
@@ -3786,7 +3786,7 @@
       indentStart = Dimension.fromJson(_json['indentStart']);
     }
     if (_json.containsKey('lineSpacing')) {
-      lineSpacing = _json['lineSpacing'].toDouble();
+      lineSpacing = (_json['lineSpacing'] as core.num).toDouble();
     }
     if (_json.containsKey('spaceAbove')) {
       spaceAbove = Dimension.fromJson(_json['spaceAbove']);
@@ -5119,13 +5119,13 @@
 
   RgbColor.fromJson(core.Map _json) {
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
@@ -5219,7 +5219,7 @@
       alignment = _json['alignment'] as core.String;
     }
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blurRadius')) {
       blurRadius = Dimension.fromJson(_json['blurRadius']);
@@ -5899,7 +5899,7 @@
 
   SolidFill.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('color')) {
       color = OpaqueColor.fromJson(_json['color']);
diff --git a/generated/googleapis/lib/speech/v1.dart b/generated/googleapis/lib/speech/v1.dart
index e5b1da4..9f68a5a 100644
--- a/generated/googleapis/lib/speech/v1.dart
+++ b/generated/googleapis/lib/speech/v1.dart
@@ -1261,7 +1261,7 @@
 
   SpeechRecognitionAlternative.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index 9f2c9ab..93cc921 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -5157,7 +5157,7 @@
       enabled = _json['enabled'] as core.bool;
     }
     if (_json.containsKey('lockedTime')) {
-      lockedTime = core.DateTime.parse(_json['lockedTime']);
+      lockedTime = core.DateTime.parse(_json['lockedTime'] as core.String);
     }
   }
 
@@ -5192,7 +5192,7 @@
       enabled = _json['enabled'] as core.bool;
     }
     if (_json.containsKey('lockedTime')) {
-      lockedTime = core.DateTime.parse(_json['lockedTime']);
+      lockedTime = core.DateTime.parse(_json['lockedTime'] as core.String);
     }
   }
 
@@ -5343,10 +5343,12 @@
       age = _json['age'] as core.int;
     }
     if (_json.containsKey('createdBefore')) {
-      createdBefore = core.DateTime.parse(_json['createdBefore']);
+      createdBefore =
+          core.DateTime.parse(_json['createdBefore'] as core.String);
     }
     if (_json.containsKey('customTimeBefore')) {
-      customTimeBefore = core.DateTime.parse(_json['customTimeBefore']);
+      customTimeBefore =
+          core.DateTime.parse(_json['customTimeBefore'] as core.String);
     }
     if (_json.containsKey('daysSinceCustomTime')) {
       daysSinceCustomTime = _json['daysSinceCustomTime'] as core.int;
@@ -5366,7 +5368,8 @@
           .toList();
     }
     if (_json.containsKey('noncurrentTimeBefore')) {
-      noncurrentTimeBefore = core.DateTime.parse(_json['noncurrentTimeBefore']);
+      noncurrentTimeBefore =
+          core.DateTime.parse(_json['noncurrentTimeBefore'] as core.String);
     }
     if (_json.containsKey('numNewerVersions')) {
       numNewerVersions = _json['numNewerVersions'] as core.int;
@@ -5559,7 +5562,8 @@
 
   BucketRetentionPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('effectiveTime')) {
-      effectiveTime = core.DateTime.parse(_json['effectiveTime']);
+      effectiveTime =
+          core.DateTime.parse(_json['effectiveTime'] as core.String);
     }
     if (_json.containsKey('isLocked')) {
       isLocked = _json['isLocked'] as core.bool;
@@ -5846,10 +5850,10 @@
       storageClass = _json['storageClass'] as core.String;
     }
     if (_json.containsKey('timeCreated')) {
-      timeCreated = core.DateTime.parse(_json['timeCreated']);
+      timeCreated = core.DateTime.parse(_json['timeCreated'] as core.String);
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('versioning')) {
       versioning = BucketVersioning.fromJson(_json['versioning']);
@@ -6566,10 +6570,10 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('timeCreated')) {
-      timeCreated = core.DateTime.parse(_json['timeCreated']);
+      timeCreated = core.DateTime.parse(_json['timeCreated'] as core.String);
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
@@ -7021,7 +7025,7 @@
       crc32c = _json['crc32c'] as core.String;
     }
     if (_json.containsKey('customTime')) {
-      customTime = core.DateTime.parse(_json['customTime']);
+      customTime = core.DateTime.parse(_json['customTime'] as core.String);
     }
     if (_json.containsKey('customerEncryption')) {
       customerEncryption =
@@ -7067,7 +7071,7 @@
     }
     if (_json.containsKey('retentionExpirationTime')) {
       retentionExpirationTime =
-          core.DateTime.parse(_json['retentionExpirationTime']);
+          core.DateTime.parse(_json['retentionExpirationTime'] as core.String);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -7082,17 +7086,17 @@
       temporaryHold = _json['temporaryHold'] as core.bool;
     }
     if (_json.containsKey('timeCreated')) {
-      timeCreated = core.DateTime.parse(_json['timeCreated']);
+      timeCreated = core.DateTime.parse(_json['timeCreated'] as core.String);
     }
     if (_json.containsKey('timeDeleted')) {
-      timeDeleted = core.DateTime.parse(_json['timeDeleted']);
+      timeDeleted = core.DateTime.parse(_json['timeDeleted'] as core.String);
     }
     if (_json.containsKey('timeStorageClassUpdated')) {
       timeStorageClassUpdated =
-          core.DateTime.parse(_json['timeStorageClassUpdated']);
+          core.DateTime.parse(_json['timeStorageClassUpdated'] as core.String);
     }
     if (_json.containsKey('updated')) {
-      updated = core.DateTime.parse(_json['updated']);
+      updated = core.DateTime.parse(_json['updated'] as core.String);
     }
   }
 
diff --git a/generated/googleapis/lib/streetviewpublish/v1.dart b/generated/googleapis/lib/streetviewpublish/v1.dart
index e7046ee..8da5850 100644
--- a/generated/googleapis/lib/streetviewpublish/v1.dart
+++ b/generated/googleapis/lib/streetviewpublish/v1.dart
@@ -846,10 +846,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -884,7 +884,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('number')) {
-      number = _json['number'].toDouble();
+      number = (_json['number'] as core.num).toDouble();
     }
   }
 
@@ -1307,13 +1307,13 @@
 
   Pose.fromJson(core.Map _json) {
     if (_json.containsKey('accuracyMeters')) {
-      accuracyMeters = _json['accuracyMeters'].toDouble();
+      accuracyMeters = (_json['accuracyMeters'] as core.num).toDouble();
     }
     if (_json.containsKey('altitude')) {
-      altitude = _json['altitude'].toDouble();
+      altitude = (_json['altitude'] as core.num).toDouble();
     }
     if (_json.containsKey('heading')) {
-      heading = _json['heading'].toDouble();
+      heading = (_json['heading'] as core.num).toDouble();
     }
     if (_json.containsKey('latLngPair')) {
       latLngPair = LatLng.fromJson(_json['latLngPair']);
@@ -1322,10 +1322,10 @@
       level = Level.fromJson(_json['level']);
     }
     if (_json.containsKey('pitch')) {
-      pitch = _json['pitch'].toDouble();
+      pitch = (_json['pitch'] as core.num).toDouble();
     }
     if (_json.containsKey('roll')) {
-      roll = _json['roll'].toDouble();
+      roll = (_json['roll'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/testing/v1.dart b/generated/googleapis/lib/testing/v1.dart
index 8f480b8..ccd13e2 100644
--- a/generated/googleapis/lib/testing/v1.dart
+++ b/generated/googleapis/lib/testing/v1.dart
@@ -1637,7 +1637,7 @@
 
   Distribution.fromJson(core.Map _json) {
     if (_json.containsKey('marketShare')) {
-      marketShare = _json['marketShare'].toDouble();
+      marketShare = (_json['marketShare'] as core.num).toDouble();
     }
     if (_json.containsKey('measurementTime')) {
       measurementTime = _json['measurementTime'] as core.String;
@@ -3906,19 +3906,20 @@
 
   TrafficRule.fromJson(core.Map _json) {
     if (_json.containsKey('bandwidth')) {
-      bandwidth = _json['bandwidth'].toDouble();
+      bandwidth = (_json['bandwidth'] as core.num).toDouble();
     }
     if (_json.containsKey('burst')) {
-      burst = _json['burst'].toDouble();
+      burst = (_json['burst'] as core.num).toDouble();
     }
     if (_json.containsKey('delay')) {
       delay = _json['delay'] as core.String;
     }
     if (_json.containsKey('packetDuplicationRatio')) {
-      packetDuplicationRatio = _json['packetDuplicationRatio'].toDouble();
+      packetDuplicationRatio =
+          (_json['packetDuplicationRatio'] as core.num).toDouble();
     }
     if (_json.containsKey('packetLossRatio')) {
-      packetLossRatio = _json['packetLossRatio'].toDouble();
+      packetLossRatio = (_json['packetLossRatio'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/texttospeech/v1.dart b/generated/googleapis/lib/texttospeech/v1.dart
index 0d7cf0e..600fa69 100644
--- a/generated/googleapis/lib/texttospeech/v1.dart
+++ b/generated/googleapis/lib/texttospeech/v1.dart
@@ -229,16 +229,16 @@
           .toList();
     }
     if (_json.containsKey('pitch')) {
-      pitch = _json['pitch'].toDouble();
+      pitch = (_json['pitch'] as core.num).toDouble();
     }
     if (_json.containsKey('sampleRateHertz')) {
       sampleRateHertz = _json['sampleRateHertz'] as core.int;
     }
     if (_json.containsKey('speakingRate')) {
-      speakingRate = _json['speakingRate'].toDouble();
+      speakingRate = (_json['speakingRate'] as core.num).toDouble();
     }
     if (_json.containsKey('volumeGainDb')) {
-      volumeGainDb = _json['volumeGainDb'].toDouble();
+      volumeGainDb = (_json['volumeGainDb'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis/lib/translate/v3.dart b/generated/googleapis/lib/translate/v3.dart
index 1072858..f01b3b7 100644
--- a/generated/googleapis/lib/translate/v3.dart
+++ b/generated/googleapis/lib/translate/v3.dart
@@ -1463,7 +1463,7 @@
 
   DetectedLanguage.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
diff --git a/generated/googleapis/lib/videointelligence/v1.dart b/generated/googleapis/lib/videointelligence/v1.dart
index 4675280..010d58a 100644
--- a/generated/googleapis/lib/videointelligence/v1.dart
+++ b/generated/googleapis/lib/videointelligence/v1.dart
@@ -895,7 +895,7 @@
 
   GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -937,7 +937,7 @@
 
   GoogleCloudVideointelligenceV1DetectedLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1216,7 +1216,8 @@
 
   GoogleCloudVideointelligenceV1LabelDetectionConfig.fromJson(core.Map _json) {
     if (_json.containsKey('frameConfidenceThreshold')) {
-      frameConfidenceThreshold = _json['frameConfidenceThreshold'].toDouble();
+      frameConfidenceThreshold =
+          (_json['frameConfidenceThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('labelDetectionMode')) {
       labelDetectionMode = _json['labelDetectionMode'] as core.String;
@@ -1228,7 +1229,8 @@
       stationaryCamera = _json['stationaryCamera'] as core.bool;
     }
     if (_json.containsKey('videoConfidenceThreshold')) {
-      videoConfidenceThreshold = _json['videoConfidenceThreshold'].toDouble();
+      videoConfidenceThreshold =
+          (_json['videoConfidenceThreshold'] as core.num).toDouble();
     }
   }
 
@@ -1266,7 +1268,7 @@
 
   GoogleCloudVideointelligenceV1LabelFrame.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -1297,7 +1299,7 @@
 
   GoogleCloudVideointelligenceV1LabelSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment =
@@ -1386,16 +1388,16 @@
 
   GoogleCloudVideointelligenceV1NormalizedBoundingBox.fromJson(core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = _json['bottom'].toDouble();
+      bottom = (_json['bottom'] as core.num).toDouble();
     }
     if (_json.containsKey('left')) {
-      left = _json['left'].toDouble();
+      left = (_json['left'] as core.num).toDouble();
     }
     if (_json.containsKey('right')) {
-      right = _json['right'].toDouble();
+      right = (_json['right'] as core.num).toDouble();
     }
     if (_json.containsKey('top')) {
-      top = _json['top'].toDouble();
+      top = (_json['top'] as core.num).toDouble();
     }
   }
 
@@ -1463,10 +1465,10 @@
 
   GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -1515,7 +1517,7 @@
   GoogleCloudVideointelligenceV1ObjectTrackingAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
       entity = GoogleCloudVideointelligenceV1Entity.fromJson(_json['entity']);
@@ -1696,7 +1698,7 @@
   GoogleCloudVideointelligenceV1SpeechRecognitionAlternative.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -2028,7 +2030,7 @@
 
   GoogleCloudVideointelligenceV1TextSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
@@ -2140,7 +2142,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment =
@@ -2634,7 +2636,7 @@
 
   GoogleCloudVideointelligenceV1WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -2753,7 +2755,7 @@
   GoogleCloudVideointelligenceV1beta2DetectedAttribute.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2795,7 +2797,7 @@
 
   GoogleCloudVideointelligenceV1beta2DetectedLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3024,7 +3026,7 @@
 
   GoogleCloudVideointelligenceV1beta2LabelFrame.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -3055,7 +3057,7 @@
 
   GoogleCloudVideointelligenceV1beta2LabelSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
@@ -3146,16 +3148,16 @@
   GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox.fromJson(
       core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = _json['bottom'].toDouble();
+      bottom = (_json['bottom'] as core.num).toDouble();
     }
     if (_json.containsKey('left')) {
-      left = _json['left'].toDouble();
+      left = (_json['left'] as core.num).toDouble();
     }
     if (_json.containsKey('right')) {
-      right = _json['right'].toDouble();
+      right = (_json['right'] as core.num).toDouble();
     }
     if (_json.containsKey('top')) {
-      top = _json['top'].toDouble();
+      top = (_json['top'] as core.num).toDouble();
     }
   }
 
@@ -3224,10 +3226,10 @@
 
   GoogleCloudVideointelligenceV1beta2NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -3276,7 +3278,7 @@
   GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
       entity =
@@ -3384,7 +3386,7 @@
   GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -3552,7 +3554,7 @@
 
   GoogleCloudVideointelligenceV1beta2TextSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
@@ -3670,7 +3672,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
@@ -4078,7 +4080,7 @@
 
   GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -4197,7 +4199,7 @@
   GoogleCloudVideointelligenceV1p1beta1DetectedAttribute.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4240,7 +4242,7 @@
   GoogleCloudVideointelligenceV1p1beta1DetectedLandmark.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4471,7 +4473,7 @@
 
   GoogleCloudVideointelligenceV1p1beta1LabelFrame.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -4502,7 +4504,7 @@
 
   GoogleCloudVideointelligenceV1p1beta1LabelSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
@@ -4593,16 +4595,16 @@
   GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox.fromJson(
       core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = _json['bottom'].toDouble();
+      bottom = (_json['bottom'] as core.num).toDouble();
     }
     if (_json.containsKey('left')) {
-      left = _json['left'].toDouble();
+      left = (_json['left'] as core.num).toDouble();
     }
     if (_json.containsKey('right')) {
-      right = _json['right'].toDouble();
+      right = (_json['right'] as core.num).toDouble();
     }
     if (_json.containsKey('top')) {
-      top = _json['top'].toDouble();
+      top = (_json['top'] as core.num).toDouble();
     }
   }
 
@@ -4672,10 +4674,10 @@
   GoogleCloudVideointelligenceV1p1beta1NormalizedVertex.fromJson(
       core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -4724,7 +4726,7 @@
   GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
       entity =
@@ -4833,7 +4835,7 @@
   GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -5002,7 +5004,7 @@
 
   GoogleCloudVideointelligenceV1p1beta1TextSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
@@ -5120,7 +5122,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
@@ -5532,7 +5534,7 @@
 
   GoogleCloudVideointelligenceV1p1beta1WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -5651,7 +5653,7 @@
   GoogleCloudVideointelligenceV1p2beta1DetectedAttribute.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5694,7 +5696,7 @@
   GoogleCloudVideointelligenceV1p2beta1DetectedLandmark.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5925,7 +5927,7 @@
 
   GoogleCloudVideointelligenceV1p2beta1LabelFrame.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -5956,7 +5958,7 @@
 
   GoogleCloudVideointelligenceV1p2beta1LabelSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
@@ -6047,16 +6049,16 @@
   GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox.fromJson(
       core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = _json['bottom'].toDouble();
+      bottom = (_json['bottom'] as core.num).toDouble();
     }
     if (_json.containsKey('left')) {
-      left = _json['left'].toDouble();
+      left = (_json['left'] as core.num).toDouble();
     }
     if (_json.containsKey('right')) {
-      right = _json['right'].toDouble();
+      right = (_json['right'] as core.num).toDouble();
     }
     if (_json.containsKey('top')) {
-      top = _json['top'].toDouble();
+      top = (_json['top'] as core.num).toDouble();
     }
   }
 
@@ -6126,10 +6128,10 @@
   GoogleCloudVideointelligenceV1p2beta1NormalizedVertex.fromJson(
       core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -6178,7 +6180,7 @@
   GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
       entity =
@@ -6287,7 +6289,7 @@
   GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -6456,7 +6458,7 @@
 
   GoogleCloudVideointelligenceV1p2beta1TextSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
@@ -6574,7 +6576,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
@@ -6986,7 +6988,7 @@
 
   GoogleCloudVideointelligenceV1p2beta1WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -7228,7 +7230,7 @@
   GoogleCloudVideointelligenceV1p3beta1DetectedAttribute.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7271,7 +7273,7 @@
   GoogleCloudVideointelligenceV1p3beta1DetectedLandmark.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7552,7 +7554,7 @@
 
   GoogleCloudVideointelligenceV1p3beta1LabelFrame.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -7583,7 +7585,7 @@
 
   GoogleCloudVideointelligenceV1p3beta1LabelSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
@@ -7674,16 +7676,16 @@
   GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox.fromJson(
       core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = _json['bottom'].toDouble();
+      bottom = (_json['bottom'] as core.num).toDouble();
     }
     if (_json.containsKey('left')) {
-      left = _json['left'].toDouble();
+      left = (_json['left'] as core.num).toDouble();
     }
     if (_json.containsKey('right')) {
-      right = _json['right'].toDouble();
+      right = (_json['right'] as core.num).toDouble();
     }
     if (_json.containsKey('top')) {
-      top = _json['top'].toDouble();
+      top = (_json['top'] as core.num).toDouble();
     }
   }
 
@@ -7753,10 +7755,10 @@
   GoogleCloudVideointelligenceV1p3beta1NormalizedVertex.fromJson(
       core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -7805,7 +7807,7 @@
   GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
       entity =
@@ -7943,7 +7945,7 @@
           _json['celebrity']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
   }
 
@@ -7982,7 +7984,7 @@
   GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -8271,7 +8273,7 @@
 
   GoogleCloudVideointelligenceV1p3beta1TextSegment.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
@@ -8389,7 +8391,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
@@ -8851,7 +8853,7 @@
 
   GoogleCloudVideointelligenceV1p3beta1WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
diff --git a/generated/googleapis/lib/vision/v1.dart b/generated/googleapis/lib/vision/v1.dart
index 5ff63ec..541bfdc 100644
--- a/generated/googleapis/lib/vision/v1.dart
+++ b/generated/googleapis/lib/vision/v1.dart
@@ -3309,7 +3309,7 @@
       boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
@@ -3465,16 +3465,16 @@
 
   Color.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
@@ -3516,10 +3516,10 @@
       color = Color.fromJson(_json['color']);
     }
     if (_json.containsKey('pixelFraction')) {
-      pixelFraction = _json['pixelFraction'].toDouble();
+      pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -3558,10 +3558,10 @@
       boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('importanceFraction')) {
-      importanceFraction = _json['importanceFraction'].toDouble();
+      importanceFraction = (_json['importanceFraction'] as core.num).toDouble();
     }
   }
 
@@ -3618,7 +3618,7 @@
   CropHintsParams.fromJson(core.Map _json) {
     if (_json.containsKey('aspectRatios')) {
       aspectRatios = (_json['aspectRatios'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -3685,7 +3685,7 @@
 
   DetectedLanguage.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -3797,7 +3797,7 @@
       boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3819,10 +3819,10 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('topicality')) {
-      topicality = _json['topicality'].toDouble();
+      topicality = (_json['topicality'] as core.num).toDouble();
     }
   }
 
@@ -3983,7 +3983,8 @@
       boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
     }
     if (_json.containsKey('detectionConfidence')) {
-      detectionConfidence = _json['detectionConfidence'].toDouble();
+      detectionConfidence =
+          (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = BoundingPoly.fromJson(_json['fdBoundingPoly']);
@@ -3995,7 +3996,8 @@
       joyLikelihood = _json['joyLikelihood'] as core.String;
     }
     if (_json.containsKey('landmarkingConfidence')) {
-      landmarkingConfidence = _json['landmarkingConfidence'].toDouble();
+      landmarkingConfidence =
+          (_json['landmarkingConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
@@ -4003,10 +4005,10 @@
           .toList();
     }
     if (_json.containsKey('panAngle')) {
-      panAngle = _json['panAngle'].toDouble();
+      panAngle = (_json['panAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('rollAngle')) {
-      rollAngle = _json['rollAngle'].toDouble();
+      rollAngle = (_json['rollAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('sorrowLikelihood')) {
       sorrowLikelihood = _json['sorrowLikelihood'] as core.String;
@@ -4015,7 +4017,7 @@
       surpriseLikelihood = _json['surpriseLikelihood'] as core.String;
     }
     if (_json.containsKey('tiltAngle')) {
-      tiltAngle = _json['tiltAngle'].toDouble();
+      tiltAngle = (_json['tiltAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('underExposedLikelihood')) {
       underExposedLikelihood = _json['underExposedLikelihood'] as core.String;
@@ -4527,7 +4529,7 @@
           GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
@@ -4620,10 +4622,10 @@
       color = Color.fromJson(_json['color']);
     }
     if (_json.containsKey('pixelFraction')) {
-      pixelFraction = _json['pixelFraction'].toDouble();
+      pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -4663,10 +4665,10 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('importanceFraction')) {
-      importanceFraction = _json['importanceFraction'].toDouble();
+      importanceFraction = (_json['importanceFraction'] as core.num).toDouble();
     }
   }
 
@@ -4787,7 +4789,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -4811,10 +4813,10 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('topicality')) {
-      topicality = _json['topicality'].toDouble();
+      topicality = (_json['topicality'] as core.num).toDouble();
     }
   }
 
@@ -4976,7 +4978,8 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('detectionConfidence')) {
-      detectionConfidence = _json['detectionConfidence'].toDouble();
+      detectionConfidence =
+          (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
@@ -4989,7 +4992,8 @@
       joyLikelihood = _json['joyLikelihood'] as core.String;
     }
     if (_json.containsKey('landmarkingConfidence')) {
-      landmarkingConfidence = _json['landmarkingConfidence'].toDouble();
+      landmarkingConfidence =
+          (_json['landmarkingConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
@@ -4998,10 +5002,10 @@
           .toList();
     }
     if (_json.containsKey('panAngle')) {
-      panAngle = _json['panAngle'].toDouble();
+      panAngle = (_json['panAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('rollAngle')) {
-      rollAngle = _json['rollAngle'].toDouble();
+      rollAngle = (_json['rollAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('sorrowLikelihood')) {
       sorrowLikelihood = _json['sorrowLikelihood'] as core.String;
@@ -5010,7 +5014,7 @@
       surpriseLikelihood = _json['surpriseLikelihood'] as core.String;
     }
     if (_json.containsKey('tiltAngle')) {
-      tiltAngle = _json['tiltAngle'].toDouble();
+      tiltAngle = (_json['tiltAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('underExposedLikelihood')) {
       underExposedLikelihood = _json['underExposedLikelihood'] as core.String;
@@ -5342,7 +5346,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -5402,10 +5406,10 @@
 
   GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -5535,7 +5539,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -5599,7 +5603,7 @@
           GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
@@ -5648,13 +5652,13 @@
 
   GoogleCloudVisionV1p1beta1Position.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
@@ -5923,7 +5927,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -5969,7 +5973,7 @@
       product = GoogleCloudVisionV1p1beta1Product.fromJson(_json['product']);
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -6157,7 +6161,7 @@
           GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
@@ -6281,7 +6285,7 @@
   GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -6493,7 +6497,7 @@
       entityId = _json['entityId'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -6524,7 +6528,7 @@
 
   GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(core.Map _json) {
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -6616,7 +6620,7 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -6675,7 +6679,7 @@
           GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
@@ -7038,7 +7042,7 @@
           GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
@@ -7131,10 +7135,10 @@
       color = Color.fromJson(_json['color']);
     }
     if (_json.containsKey('pixelFraction')) {
-      pixelFraction = _json['pixelFraction'].toDouble();
+      pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -7174,10 +7178,10 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('importanceFraction')) {
-      importanceFraction = _json['importanceFraction'].toDouble();
+      importanceFraction = (_json['importanceFraction'] as core.num).toDouble();
     }
   }
 
@@ -7298,7 +7302,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -7322,10 +7326,10 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('topicality')) {
-      topicality = _json['topicality'].toDouble();
+      topicality = (_json['topicality'] as core.num).toDouble();
     }
   }
 
@@ -7487,7 +7491,8 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('detectionConfidence')) {
-      detectionConfidence = _json['detectionConfidence'].toDouble();
+      detectionConfidence =
+          (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
@@ -7500,7 +7505,8 @@
       joyLikelihood = _json['joyLikelihood'] as core.String;
     }
     if (_json.containsKey('landmarkingConfidence')) {
-      landmarkingConfidence = _json['landmarkingConfidence'].toDouble();
+      landmarkingConfidence =
+          (_json['landmarkingConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
@@ -7509,10 +7515,10 @@
           .toList();
     }
     if (_json.containsKey('panAngle')) {
-      panAngle = _json['panAngle'].toDouble();
+      panAngle = (_json['panAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('rollAngle')) {
-      rollAngle = _json['rollAngle'].toDouble();
+      rollAngle = (_json['rollAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('sorrowLikelihood')) {
       sorrowLikelihood = _json['sorrowLikelihood'] as core.String;
@@ -7521,7 +7527,7 @@
       surpriseLikelihood = _json['surpriseLikelihood'] as core.String;
     }
     if (_json.containsKey('tiltAngle')) {
-      tiltAngle = _json['tiltAngle'].toDouble();
+      tiltAngle = (_json['tiltAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('underExposedLikelihood')) {
       underExposedLikelihood = _json['underExposedLikelihood'] as core.String;
@@ -7853,7 +7859,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -7913,10 +7919,10 @@
 
   GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -8046,7 +8052,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -8110,7 +8116,7 @@
           GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
@@ -8159,13 +8165,13 @@
 
   GoogleCloudVisionV1p2beta1Position.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
@@ -8434,7 +8440,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -8480,7 +8486,7 @@
       product = GoogleCloudVisionV1p2beta1Product.fromJson(_json['product']);
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -8668,7 +8674,7 @@
           GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
@@ -8792,7 +8798,7 @@
   GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -9004,7 +9010,7 @@
       entityId = _json['entityId'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -9035,7 +9041,7 @@
 
   GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(core.Map _json) {
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -9127,7 +9133,7 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -9186,7 +9192,7 @@
           GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
@@ -9603,7 +9609,7 @@
           GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
@@ -9696,10 +9702,10 @@
       color = Color.fromJson(_json['color']);
     }
     if (_json.containsKey('pixelFraction')) {
-      pixelFraction = _json['pixelFraction'].toDouble();
+      pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -9739,10 +9745,10 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('importanceFraction')) {
-      importanceFraction = _json['importanceFraction'].toDouble();
+      importanceFraction = (_json['importanceFraction'] as core.num).toDouble();
     }
   }
 
@@ -9863,7 +9869,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -9887,10 +9893,10 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('topicality')) {
-      topicality = _json['topicality'].toDouble();
+      topicality = (_json['topicality'] as core.num).toDouble();
     }
   }
 
@@ -10052,7 +10058,8 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('detectionConfidence')) {
-      detectionConfidence = _json['detectionConfidence'].toDouble();
+      detectionConfidence =
+          (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
@@ -10065,7 +10072,8 @@
       joyLikelihood = _json['joyLikelihood'] as core.String;
     }
     if (_json.containsKey('landmarkingConfidence')) {
-      landmarkingConfidence = _json['landmarkingConfidence'].toDouble();
+      landmarkingConfidence =
+          (_json['landmarkingConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
@@ -10074,10 +10082,10 @@
           .toList();
     }
     if (_json.containsKey('panAngle')) {
-      panAngle = _json['panAngle'].toDouble();
+      panAngle = (_json['panAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('rollAngle')) {
-      rollAngle = _json['rollAngle'].toDouble();
+      rollAngle = (_json['rollAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('sorrowLikelihood')) {
       sorrowLikelihood = _json['sorrowLikelihood'] as core.String;
@@ -10086,7 +10094,7 @@
       surpriseLikelihood = _json['surpriseLikelihood'] as core.String;
     }
     if (_json.containsKey('tiltAngle')) {
-      tiltAngle = _json['tiltAngle'].toDouble();
+      tiltAngle = (_json['tiltAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('underExposedLikelihood')) {
       underExposedLikelihood = _json['underExposedLikelihood'] as core.String;
@@ -10460,7 +10468,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -10520,10 +10528,10 @@
 
   GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -10653,7 +10661,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -10717,7 +10725,7 @@
           GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
@@ -10766,13 +10774,13 @@
 
   GoogleCloudVisionV1p3beta1Position.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
@@ -11041,7 +11049,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -11087,7 +11095,7 @@
       product = GoogleCloudVisionV1p3beta1Product.fromJson(_json['product']);
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -11328,7 +11336,7 @@
           GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
@@ -11452,7 +11460,7 @@
   GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -11664,7 +11672,7 @@
       entityId = _json['entityId'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -11695,7 +11703,7 @@
 
   GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(core.Map _json) {
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -11787,7 +11795,7 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -11846,7 +11854,7 @@
           GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
@@ -12314,7 +12322,7 @@
           GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
@@ -12448,10 +12456,10 @@
       color = Color.fromJson(_json['color']);
     }
     if (_json.containsKey('pixelFraction')) {
-      pixelFraction = _json['pixelFraction'].toDouble();
+      pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -12491,10 +12499,10 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('importanceFraction')) {
-      importanceFraction = _json['importanceFraction'].toDouble();
+      importanceFraction = (_json['importanceFraction'] as core.num).toDouble();
     }
   }
 
@@ -12615,7 +12623,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -12639,10 +12647,10 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('topicality')) {
-      topicality = _json['topicality'].toDouble();
+      topicality = (_json['topicality'] as core.num).toDouble();
     }
   }
 
@@ -12810,7 +12818,8 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('detectionConfidence')) {
-      detectionConfidence = _json['detectionConfidence'].toDouble();
+      detectionConfidence =
+          (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
@@ -12823,7 +12832,8 @@
       joyLikelihood = _json['joyLikelihood'] as core.String;
     }
     if (_json.containsKey('landmarkingConfidence')) {
-      landmarkingConfidence = _json['landmarkingConfidence'].toDouble();
+      landmarkingConfidence =
+          (_json['landmarkingConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
@@ -12832,7 +12842,7 @@
           .toList();
     }
     if (_json.containsKey('panAngle')) {
-      panAngle = _json['panAngle'].toDouble();
+      panAngle = (_json['panAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('recognitionResult')) {
       recognitionResult = (_json['recognitionResult'] as core.List)
@@ -12841,7 +12851,7 @@
           .toList();
     }
     if (_json.containsKey('rollAngle')) {
-      rollAngle = _json['rollAngle'].toDouble();
+      rollAngle = (_json['rollAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('sorrowLikelihood')) {
       sorrowLikelihood = _json['sorrowLikelihood'] as core.String;
@@ -12850,7 +12860,7 @@
       surpriseLikelihood = _json['surpriseLikelihood'] as core.String;
     }
     if (_json.containsKey('tiltAngle')) {
-      tiltAngle = _json['tiltAngle'].toDouble();
+      tiltAngle = (_json['tiltAngle'] as core.num).toDouble();
     }
     if (_json.containsKey('underExposedLikelihood')) {
       underExposedLikelihood = _json['underExposedLikelihood'] as core.String;
@@ -12998,7 +13008,7 @@
           GoogleCloudVisionV1p4beta1Celebrity.fromJson(_json['celebrity']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
   }
 
@@ -13260,7 +13270,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -13320,10 +13330,10 @@
 
   GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -13453,7 +13463,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -13517,7 +13527,7 @@
           GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
@@ -13566,13 +13576,13 @@
 
   GoogleCloudVisionV1p4beta1Position.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
@@ -13841,7 +13851,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -13887,7 +13897,7 @@
       product = GoogleCloudVisionV1p4beta1Product.fromJson(_json['product']);
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -14128,7 +14138,7 @@
           GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
@@ -14252,7 +14262,7 @@
   GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -14464,7 +14474,7 @@
       entityId = _json['entityId'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -14495,7 +14505,7 @@
 
   GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(core.Map _json) {
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -14587,7 +14597,7 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -14646,7 +14656,7 @@
           GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
@@ -15246,10 +15256,10 @@
 
   LatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -15510,7 +15520,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -15570,10 +15580,10 @@
 
   NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -15618,7 +15628,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -15834,7 +15844,7 @@
           .toList();
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -15896,7 +15906,7 @@
       boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = TextProperty.fromJson(_json['property']);
@@ -15943,13 +15953,13 @@
 
   Position.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
     if (_json.containsKey('z')) {
-      z = _json['z'].toDouble();
+      z = (_json['z'] as core.num).toDouble();
     }
   }
 
@@ -16425,7 +16435,7 @@
       product = Product.fromJson(_json['product']);
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -16628,7 +16638,7 @@
       boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = TextProperty.fromJson(_json['property']);
@@ -16894,7 +16904,7 @@
       entityId = _json['entityId'] as core.String;
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -16925,7 +16935,7 @@
 
   WebImage.fromJson(core.Map _json) {
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -17014,7 +17024,7 @@
           .toList();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -17072,7 +17082,7 @@
       boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = TextProperty.fromJson(_json['property']);
diff --git a/generated/googleapis/lib/webmasters/v3.dart b/generated/googleapis/lib/webmasters/v3.dart
index fafd6d6..8bbdd40 100644
--- a/generated/googleapis/lib/webmasters/v3.dart
+++ b/generated/googleapis/lib/webmasters/v3.dart
@@ -573,13 +573,13 @@
 
   ApiDataRow.fromJson(core.Map _json) {
     if (_json.containsKey('clicks')) {
-      clicks = _json['clicks'].toDouble();
+      clicks = (_json['clicks'] as core.num).toDouble();
     }
     if (_json.containsKey('ctr')) {
-      ctr = _json['ctr'].toDouble();
+      ctr = (_json['ctr'] as core.num).toDouble();
     }
     if (_json.containsKey('impressions')) {
-      impressions = _json['impressions'].toDouble();
+      impressions = (_json['impressions'] as core.num).toDouble();
     }
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
@@ -587,7 +587,7 @@
           .toList();
     }
     if (_json.containsKey('position')) {
-      position = _json['position'].toDouble();
+      position = (_json['position'] as core.num).toDouble();
     }
   }
 
@@ -958,10 +958,12 @@
       isSitemapsIndex = _json['isSitemapsIndex'] as core.bool;
     }
     if (_json.containsKey('lastDownloaded')) {
-      lastDownloaded = core.DateTime.parse(_json['lastDownloaded']);
+      lastDownloaded =
+          core.DateTime.parse(_json['lastDownloaded'] as core.String);
     }
     if (_json.containsKey('lastSubmitted')) {
-      lastSubmitted = core.DateTime.parse(_json['lastSubmitted']);
+      lastSubmitted =
+          core.DateTime.parse(_json['lastSubmitted'] as core.String);
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index 8b45878..718928d 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -11491,13 +11491,13 @@
 
   GeoPoint.fromJson(core.Map _json) {
     if (_json.containsKey('altitude')) {
-      altitude = _json['altitude'].toDouble();
+      altitude = (_json['altitude'] as core.num).toDouble();
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
@@ -18311,7 +18311,7 @@
 
   VideoFileDetailsVideoStream.fromJson(core.Map _json) {
     if (_json.containsKey('aspectRatio')) {
-      aspectRatio = _json['aspectRatio'].toDouble();
+      aspectRatio = (_json['aspectRatio'] as core.num).toDouble();
     }
     if (_json.containsKey('bitrateBps')) {
       bitrateBps = _json['bitrateBps'] as core.String;
@@ -18320,7 +18320,7 @@
       codec = _json['codec'] as core.String;
     }
     if (_json.containsKey('frameRateFps')) {
-      frameRateFps = _json['frameRateFps'].toDouble();
+      frameRateFps = (_json['frameRateFps'] as core.num).toDouble();
     }
     if (_json.containsKey('heightPixels')) {
       heightPixels = _json['heightPixels'] as core.int;
diff --git a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
index d93a0c1..cd0f744 100644
--- a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/abusiveexperiencereport/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -168,7 +176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -215,7 +224,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
index de0965e..07be052 100644
--- a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
+++ b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/acceleratedmobilepageurl/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -250,7 +258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/accessapproval/v1_test.dart b/generated/googleapis/test/accessapproval/v1_test.dart
index 44f9a5b..becec3f 100644
--- a/generated/googleapis/test/accessapproval/v1_test.dart
+++ b/generated/googleapis/test/accessapproval/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/accessapproval/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -478,7 +486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -525,7 +534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -577,7 +587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -633,7 +644,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -684,7 +696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -731,7 +744,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -781,7 +795,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -839,7 +854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -886,7 +902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -938,7 +955,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -994,7 +1012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1045,7 +1064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1092,7 +1112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1142,7 +1163,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1200,7 +1222,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1247,7 +1270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1299,7 +1323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1355,7 +1380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1406,7 +1432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1453,7 +1480,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1503,7 +1531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/accesscontextmanager/v1_test.dart b/generated/googleapis/test/accesscontextmanager/v1_test.dart
index cc5a11b..5fa4df8 100644
--- a/generated/googleapis/test/accesscontextmanager/v1_test.dart
+++ b/generated/googleapis/test/accesscontextmanager/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/accesscontextmanager/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1311,7 +1319,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1358,7 +1367,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1405,7 +1415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1453,7 +1464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1514,7 +1526,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1570,7 +1583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1617,7 +1631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1665,7 +1680,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1718,7 +1734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1780,7 +1797,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1834,7 +1852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1888,7 +1907,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1940,7 +1960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1988,7 +2009,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2036,7 +2058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2086,7 +2109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2146,7 +2170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2201,7 +2226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2254,7 +2280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2301,7 +2328,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2348,7 +2376,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2398,7 +2427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2461,7 +2491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2509,7 +2540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2557,7 +2589,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2607,7 +2640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2668,7 +2702,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index 73452ef..2dd1d2c 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/adexchangebuyer/v1_3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1735,7 +1743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1783,7 +1792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1837,7 +1847,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1893,7 +1904,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1947,7 +1959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1995,7 +2008,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2057,7 +2071,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2123,7 +2138,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2190,7 +2206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2255,7 +2272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2307,7 +2325,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2360,7 +2379,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2430,7 +2450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2478,7 +2499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2531,7 +2553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2608,7 +2631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2668,7 +2692,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2724,7 +2749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2776,7 +2802,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2842,7 +2869,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2908,7 +2936,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
index 21da50c..882fbb1 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/adexchangebuyer/v1_4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4386,7 +4394,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4434,7 +4443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4489,7 +4499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4550,7 +4561,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4608,7 +4620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4656,7 +4669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4718,7 +4732,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4784,7 +4799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4851,7 +4867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4926,7 +4943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4987,7 +5005,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5039,7 +5058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5093,7 +5113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5180,7 +5201,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5252,7 +5274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5315,7 +5338,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5377,7 +5401,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5436,7 +5461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5500,7 +5526,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5564,7 +5591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5623,7 +5651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5689,7 +5718,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5743,7 +5773,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5820,7 +5851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5880,7 +5912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5936,7 +5969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5988,7 +6022,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6054,7 +6089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6120,7 +6156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6175,7 +6212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6224,7 +6262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6280,7 +6319,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6332,7 +6372,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6408,7 +6449,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6459,7 +6501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6519,7 +6562,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6593,7 +6637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6655,7 +6700,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/adexperiencereport/v1_test.dart b/generated/googleapis/test/adexperiencereport/v1_test.dart
index d452249..2b73c19 100644
--- a/generated/googleapis/test/adexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/adexperiencereport/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/adexperiencereport/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -212,7 +220,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -259,7 +268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/admin/datatransfer_v1_test.dart b/generated/googleapis/test/admin/datatransfer_v1_test.dart
index 149ebdc..3ab098f 100644
--- a/generated/googleapis/test/admin/datatransfer_v1_test.dart
+++ b/generated/googleapis/test/admin/datatransfer_v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/admin/datatransfer_v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -372,7 +380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -420,7 +429,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -481,7 +491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -530,7 +541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -581,7 +593,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index d84abb8..77c17f8 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/admin/directory_v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3977,7 +3985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4034,7 +4043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4089,7 +4099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4140,7 +4151,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4209,7 +4221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4268,7 +4281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4333,7 +4347,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4414,7 +4429,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4479,7 +4495,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4546,7 +4563,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4600,7 +4618,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4653,7 +4672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4706,7 +4726,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4767,7 +4788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4824,7 +4846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4883,7 +4906,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4939,7 +4963,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5003,7 +5028,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5060,7 +5086,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5119,7 +5146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5174,7 +5202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5225,7 +5254,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5272,7 +5302,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5321,7 +5352,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5374,7 +5406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5450,7 +5483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5503,7 +5537,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5564,7 +5599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5621,7 +5657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5676,7 +5713,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5737,7 +5775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5794,7 +5833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5853,7 +5893,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5912,7 +5953,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5971,7 +6013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6046,7 +6089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6109,7 +6153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6181,7 +6226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6239,7 +6285,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6297,7 +6344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6361,7 +6409,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6438,7 +6487,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6493,7 +6543,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6552,7 +6603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6609,7 +6661,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6676,7 +6729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6738,7 +6792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6796,7 +6851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6857,7 +6913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6914,7 +6971,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6974,7 +7032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7034,7 +7093,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7105,7 +7165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7172,7 +7233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7236,7 +7298,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7293,7 +7356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7352,7 +7416,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7411,7 +7476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7486,7 +7552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7550,7 +7617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7612,7 +7680,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7669,7 +7738,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7728,7 +7798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7785,7 +7856,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7855,7 +7927,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7925,7 +7998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7986,7 +8060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8048,7 +8123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8105,7 +8181,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8164,7 +8241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8223,7 +8301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8296,7 +8375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8353,7 +8433,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8412,7 +8493,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8469,7 +8551,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8539,7 +8622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8602,7 +8686,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8663,7 +8748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8720,7 +8806,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8779,7 +8866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8834,7 +8922,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8897,7 +8986,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8961,7 +9051,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9023,7 +9114,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9080,7 +9172,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9135,7 +9228,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9192,7 +9286,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9241,7 +9336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9291,7 +9387,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9350,7 +9447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9406,7 +9504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9497,7 +9596,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9548,7 +9648,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9603,7 +9704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9660,7 +9762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9711,7 +9814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9772,7 +9876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9867,7 +9972,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9924,7 +10030,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9979,7 +10086,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10039,7 +10147,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10098,7 +10207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10151,7 +10261,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10210,7 +10321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10269,7 +10381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10326,7 +10439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10379,7 +10493,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10432,7 +10547,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index 41fba2a..fadf651 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/admin/reports_v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -918,7 +926,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1024,7 +1033,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1103,7 +1113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1155,7 +1166,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1241,7 +1253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1324,7 +1337,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/admob/v1_test.dart b/generated/googleapis/test/admob/v1_test.dart
index 6901240..766b5dc 100644
--- a/generated/googleapis/test/admob/v1_test.dart
+++ b/generated/googleapis/test/admob/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/admob/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -937,7 +945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -984,7 +993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1044,7 +1054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1097,7 +1108,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 0221592..4247924 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/adsense/v1_4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1545,7 +1553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1596,7 +1605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1674,7 +1684,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1737,7 +1748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1818,7 +1830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1897,7 +1910,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1969,7 +1983,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2061,7 +2076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2132,7 +2148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2189,7 +2206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2264,7 +2282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2335,7 +2354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2425,7 +2445,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2495,7 +2516,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2569,7 +2591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2663,7 +2686,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2732,7 +2756,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2803,7 +2828,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2863,7 +2889,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2942,7 +2969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3001,7 +3029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3072,7 +3101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3140,7 +3170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3201,7 +3232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3283,7 +3315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3344,7 +3377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3391,7 +3425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3456,7 +3491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3516,7 +3552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3596,7 +3633,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3656,7 +3694,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3704,7 +3743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3752,7 +3792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3815,7 +3856,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3901,7 +3943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3960,7 +4003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4021,7 +4065,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4071,7 +4116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4140,7 +4186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 12be122..5ed931c 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/adsensehost/v4_1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1065,7 +1073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1114,7 +1123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1180,7 +1190,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1240,7 +1251,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1321,7 +1333,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1394,7 +1407,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1474,7 +1488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1550,7 +1565,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1622,7 +1638,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1705,7 +1722,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1780,7 +1798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1850,7 +1869,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1925,7 +1945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1975,7 +1996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2037,7 +2059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2100,7 +2123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2165,7 +2189,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2227,7 +2252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2289,7 +2315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2349,7 +2376,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2419,7 +2447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2484,7 +2513,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2543,7 +2573,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2628,7 +2659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2690,7 +2722,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2750,7 +2783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 16b67ef..42edb2b 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/analytics/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4939,7 +4947,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5032,7 +5041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5113,7 +5123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5180,7 +5191,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5251,7 +5263,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5311,7 +5324,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5371,7 +5385,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5444,7 +5459,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5496,7 +5512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5557,7 +5574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5629,7 +5647,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5710,7 +5729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5783,7 +5803,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5854,7 +5875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5938,7 +5960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6020,7 +6043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6099,7 +6123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6172,7 +6197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6243,7 +6269,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6327,7 +6354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6409,7 +6437,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6498,7 +6527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6580,7 +6610,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6664,7 +6695,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6745,7 +6777,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6838,7 +6871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6926,7 +6960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6992,7 +7027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7054,7 +7090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7116,7 +7153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7176,7 +7214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7249,7 +7288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7315,7 +7355,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7400,7 +7441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7483,7 +7525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7564,7 +7607,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7657,7 +7701,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7745,7 +7790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7831,7 +7877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7912,7 +7959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7995,7 +8043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8076,7 +8125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8169,7 +8219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8257,7 +8308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8343,7 +8395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8424,7 +8477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8505,7 +8559,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8598,7 +8653,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8674,7 +8730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8745,7 +8802,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8818,7 +8876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8889,7 +8948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8972,7 +9032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9049,7 +9110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9124,7 +9186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9195,7 +9258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9268,7 +9332,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9340,7 +9405,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9425,7 +9491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9503,7 +9570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9557,7 +9625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9648,7 +9717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9730,7 +9800,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9814,7 +9885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9895,7 +9967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9986,7 +10059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10068,7 +10142,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10150,7 +10225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10238,7 +10314,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10314,7 +10391,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10387,7 +10465,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10460,7 +10539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10531,7 +10611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10615,7 +10696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10694,7 +10776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10760,7 +10843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10822,7 +10906,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10882,7 +10967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10955,7 +11041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11022,7 +11109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11097,7 +11185,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11168,7 +11257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11239,7 +11329,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11322,7 +11413,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11383,7 +11475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11437,7 +11530,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11489,7 +11583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11543,7 +11638,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/analyticsreporting/v4_test.dart b/generated/googleapis/test/analyticsreporting/v4_test.dart
index a7453b7..57404bc 100644
--- a/generated/googleapis/test/analyticsreporting/v4_test.dart
+++ b/generated/googleapis/test/analyticsreporting/v4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/analyticsreporting/v4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2314,7 +2322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2365,7 +2374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index 1fa6dc8..546a35d 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/androiddeviceprovisioning/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1674,7 +1682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1734,7 +1743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1781,7 +1791,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1828,7 +1839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1875,7 +1887,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1928,7 +1941,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1984,7 +1998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2031,7 +2046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2080,7 +2096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2138,7 +2155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2189,7 +2207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2238,7 +2257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2287,7 +2307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2340,7 +2361,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2389,7 +2411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2449,7 +2472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2500,7 +2524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2551,7 +2576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2603,7 +2629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2650,7 +2677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2702,7 +2730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2754,7 +2783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2805,7 +2835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2856,7 +2887,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2907,7 +2939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2966,7 +2999,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/androidenterprise/v1_test.dart b/generated/googleapis/test/androidenterprise/v1_test.dart
index 8ec0abc..01a6645 100644
--- a/generated/googleapis/test/androidenterprise/v1_test.dart
+++ b/generated/googleapis/test/androidenterprise/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/androidenterprise/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3411,7 +3419,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3479,7 +3488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3554,7 +3564,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3620,7 +3631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3699,7 +3711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3774,7 +3787,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3827,7 +3841,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3875,7 +3890,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3941,7 +3957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3991,7 +4008,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4038,7 +4056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4089,7 +4108,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4145,7 +4165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4203,7 +4224,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4249,7 +4271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4298,7 +4321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4356,7 +4380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4416,7 +4441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4475,7 +4501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4530,7 +4557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4599,7 +4627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4667,7 +4696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4733,7 +4763,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4807,7 +4838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4871,7 +4903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4926,7 +4959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4993,7 +5027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5074,7 +5109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5152,7 +5188,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5228,7 +5265,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5312,7 +5350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5396,7 +5435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5476,7 +5516,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5553,7 +5594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5639,7 +5681,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5713,7 +5756,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5783,7 +5827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5849,7 +5894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5924,7 +5970,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5993,7 +6040,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6046,7 +6094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6119,7 +6168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6184,7 +6234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6248,7 +6299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6317,7 +6369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6385,7 +6438,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6445,7 +6499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6524,7 +6579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6583,7 +6639,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6640,7 +6697,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6695,7 +6753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6766,7 +6825,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6834,7 +6894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6904,7 +6965,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6970,7 +7032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7043,7 +7106,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7105,7 +7169,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7162,7 +7227,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7221,7 +7287,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7276,7 +7343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7339,7 +7407,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7401,7 +7470,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7464,7 +7534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7524,7 +7595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7589,7 +7661,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7649,7 +7722,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7705,7 +7779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7771,7 +7846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7839,7 +7915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7903,7 +7980,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7965,7 +8043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8022,7 +8101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8081,7 +8161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8136,7 +8217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8199,7 +8281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/androidmanagement/v1_test.dart b/generated/googleapis/test/androidmanagement/v1_test.dart
index 0abceff..a8ab25a 100644
--- a/generated/googleapis/test/androidmanagement/v1_test.dart
+++ b/generated/googleapis/test/androidmanagement/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/androidmanagement/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3657,7 +3665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3714,7 +3723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3766,7 +3776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3819,7 +3830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3872,7 +3884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3926,7 +3939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3977,7 +3991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4026,7 +4041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4085,7 +4101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4137,7 +4154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4184,7 +4202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4231,7 +4250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4281,7 +4301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4343,7 +4364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4390,7 +4412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4439,7 +4462,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4486,7 +4510,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4535,7 +4560,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4594,7 +4620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4650,7 +4677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4697,7 +4725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4744,7 +4773,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4793,7 +4823,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4852,7 +4883,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4908,7 +4940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4957,7 +4990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/androidpublisher/v3_test.dart b/generated/googleapis/test/androidpublisher/v3_test.dart
index aba0a45..9eb4cba 100644
--- a/generated/googleapis/test/androidpublisher/v3_test.dart
+++ b/generated/googleapis/test/androidpublisher/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/androidpublisher/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2338,7 +2346,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2397,7 +2406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2454,7 +2464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2513,7 +2524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2578,7 +2590,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2649,7 +2662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2715,7 +2729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2783,7 +2798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2850,7 +2866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2919,7 +2936,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3007,7 +3025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3076,7 +3095,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3145,7 +3165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3214,7 +3235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3296,7 +3318,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3381,7 +3404,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3466,7 +3490,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3550,7 +3575,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3643,7 +3669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3722,7 +3749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3802,7 +3830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3885,7 +3914,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3957,7 +3987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4021,7 +4052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4088,7 +4120,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4153,7 +4186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4226,7 +4260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4300,7 +4335,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4372,7 +4408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4445,7 +4482,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4519,7 +4557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4591,7 +4630,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4656,7 +4696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4729,7 +4770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4803,7 +4845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4865,7 +4908,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4922,7 +4966,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4982,7 +5027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5044,7 +5090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5117,7 +5164,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5185,7 +5233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5251,7 +5300,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5311,7 +5361,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5379,7 +5430,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5461,7 +5513,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5529,7 +5582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5610,7 +5664,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5675,7 +5730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5752,7 +5808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5823,7 +5880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5899,7 +5957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5973,7 +6032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6035,7 +6095,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6115,7 +6176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6178,7 +6240,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6259,7 +6322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6331,7 +6395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6410,7 +6475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6478,7 +6544,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6544,7 +6611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/apigee/v1_test.dart b/generated/googleapis/test/apigee/v1_test.dart
index bd6f9a3..7b59566 100644
--- a/generated/googleapis/test/apigee/v1_test.dart
+++ b/generated/googleapis/test/apigee/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/apigee/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -7612,7 +7620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7665,7 +7674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7713,7 +7723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7761,7 +7772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7815,7 +7827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7863,7 +7876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7915,7 +7929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7967,7 +7982,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8020,7 +8036,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8067,7 +8084,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8114,7 +8132,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8162,7 +8181,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8216,7 +8236,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8268,7 +8289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8321,7 +8343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8372,7 +8395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8419,7 +8443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8466,7 +8491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8518,7 +8544,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8585,7 +8612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8634,7 +8662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8681,7 +8710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8728,7 +8758,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8779,7 +8810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8836,7 +8868,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8892,7 +8925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8939,7 +8973,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8988,7 +9023,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9045,7 +9081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9099,7 +9136,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9146,7 +9184,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9195,7 +9234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9244,7 +9284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9297,7 +9338,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9351,7 +9393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9401,7 +9444,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9457,7 +9501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9533,7 +9578,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9589,7 +9635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9640,7 +9687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9687,7 +9735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9735,7 +9784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9788,7 +9838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9851,7 +9902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9904,7 +9956,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9957,7 +10010,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10008,7 +10062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10055,7 +10110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10107,7 +10163,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10158,7 +10215,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10212,7 +10270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10276,7 +10335,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10326,7 +10386,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10373,7 +10434,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10420,7 +10482,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10471,7 +10534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10525,7 +10589,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10573,7 +10638,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10621,7 +10687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10673,7 +10740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10726,7 +10794,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10780,7 +10849,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10830,7 +10900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10886,7 +10957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10936,7 +11008,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10983,7 +11056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11030,7 +11104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11081,7 +11156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11135,7 +11211,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11183,7 +11260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11230,7 +11308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11280,7 +11359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11340,7 +11420,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11397,7 +11478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11444,7 +11526,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11491,7 +11574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11541,7 +11625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11604,7 +11689,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11652,7 +11738,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11699,7 +11786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11746,7 +11834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11793,7 +11882,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11842,7 +11932,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11899,7 +11990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11946,7 +12038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11997,7 +12090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12049,7 +12143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12100,7 +12195,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12153,7 +12249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12211,7 +12308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12262,7 +12360,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12318,7 +12417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12366,7 +12466,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12414,7 +12515,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12465,7 +12567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12518,7 +12621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12572,7 +12676,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12620,7 +12725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12684,7 +12790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12739,7 +12846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12791,7 +12899,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12845,7 +12954,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12910,7 +13020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12968,7 +13079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13024,7 +13136,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13074,7 +13187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13125,7 +13239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13181,7 +13296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13229,7 +13345,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13276,7 +13393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13330,7 +13448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13378,7 +13497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13425,7 +13545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13485,7 +13606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13547,7 +13669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13595,7 +13718,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13643,7 +13767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13691,7 +13816,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13745,7 +13871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13806,7 +13933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13853,7 +13981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13918,7 +14047,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14009,7 +14139,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14056,7 +14187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14103,7 +14235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14156,7 +14289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14226,7 +14360,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14273,7 +14408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14320,7 +14456,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14371,7 +14508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14427,7 +14565,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14479,7 +14618,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14528,7 +14668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14576,7 +14717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14626,7 +14768,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14680,7 +14823,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14736,7 +14880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14789,7 +14934,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14839,7 +14985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14887,7 +15034,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14951,7 +15099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15043,7 +15192,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15091,7 +15241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15138,7 +15289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15189,7 +15341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15242,7 +15395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15289,7 +15443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15336,7 +15491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15385,7 +15541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15445,7 +15602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15499,7 +15657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15546,7 +15705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15593,7 +15753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15643,7 +15804,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15704,7 +15866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15751,7 +15914,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15800,7 +15964,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15850,7 +16015,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15913,7 +16079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15960,7 +16127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16008,7 +16176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16056,7 +16225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16110,7 +16280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16165,7 +16336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16216,7 +16388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16263,7 +16436,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16312,7 +16486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16369,7 +16544,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16419,7 +16595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16468,7 +16645,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16521,7 +16699,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16576,7 +16755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16630,7 +16810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16677,7 +16858,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16725,7 +16907,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16772,7 +16955,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16824,7 +17008,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16878,7 +17063,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/appengine/v1_test.dart b/generated/googleapis/test/appengine/v1_test.dart
index 349b734..c623dda 100644
--- a/generated/googleapis/test/appengine/v1_test.dart
+++ b/generated/googleapis/test/appengine/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/appengine/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2959,7 +2967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3008,7 +3017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3062,7 +3072,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3124,7 +3135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3185,7 +3197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3245,7 +3258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3307,7 +3321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3367,7 +3382,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3442,7 +3458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3504,7 +3521,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3573,7 +3591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3635,7 +3654,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3694,7 +3714,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3751,7 +3772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3822,7 +3844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3886,7 +3909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3945,7 +3969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4004,7 +4029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4063,7 +4089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4121,7 +4148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4195,7 +4223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4259,7 +4288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4317,7 +4347,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4387,7 +4418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4445,7 +4477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4515,7 +4548,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4574,7 +4608,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4631,7 +4666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4703,7 +4739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4781,7 +4818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4850,7 +4888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4921,7 +4960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4991,7 +5031,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5074,7 +5115,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5168,7 +5210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5249,7 +5292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5329,7 +5373,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5407,7 +5452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index a09f406..d45ac8b 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/bigquery/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -6182,7 +6190,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6245,7 +6254,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6307,7 +6317,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6369,7 +6380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6446,7 +6458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6513,7 +6526,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6585,7 +6599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6651,7 +6666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6721,7 +6737,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6802,7 +6819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6868,7 +6886,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6955,7 +6974,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7009,7 +7029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7060,7 +7081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7113,7 +7135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7176,7 +7199,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7237,7 +7261,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7287,7 +7312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7348,7 +7374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7400,7 +7427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7458,7 +7486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7514,7 +7543,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7582,7 +7612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7667,7 +7698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7750,7 +7782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7837,7 +7870,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7909,7 +7943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7959,7 +7994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8031,7 +8067,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8102,7 +8139,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8185,7 +8223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8233,7 +8272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8280,7 +8320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8356,7 +8397,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
index 75d906b..aecd8e8 100644
--- a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
+++ b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/bigquerydatatransfer/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1201,7 +1209,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1248,7 +1257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1297,7 +1307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1353,7 +1364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1403,7 +1415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1466,7 +1479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1514,7 +1528,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1564,7 +1579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1628,7 +1644,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1686,7 +1703,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1734,7 +1752,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1785,7 +1804,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1851,7 +1871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1916,7 +1937,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1968,7 +1990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2022,7 +2045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2073,7 +2097,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2128,7 +2153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2199,7 +2225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2265,7 +2292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2322,7 +2350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2369,7 +2398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2419,7 +2449,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2484,7 +2515,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2548,7 +2580,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2599,7 +2632,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2648,7 +2682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2695,7 +2730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2746,7 +2782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2815,7 +2852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/bigqueryreservation/v1_test.dart b/generated/googleapis/test/bigqueryreservation/v1_test.dart
index 8614047..30ca22f 100644
--- a/generated/googleapis/test/bigqueryreservation/v1_test.dart
+++ b/generated/googleapis/test/bigqueryreservation/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/bigqueryreservation/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -823,7 +831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -873,7 +882,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -931,7 +941,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -981,7 +992,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1040,7 +1052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1101,7 +1114,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1162,7 +1176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1217,7 +1232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1267,7 +1283,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1319,7 +1336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1380,7 +1398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1435,7 +1454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1492,7 +1512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1547,7 +1568,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1598,7 +1620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1646,7 +1669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1696,7 +1720,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1756,7 +1781,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1817,7 +1843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1868,7 +1895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1921,7 +1949,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1983,7 +2012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/bigtableadmin/v2_test.dart b/generated/googleapis/test/bigtableadmin/v2_test.dart
index 858080f..f7d0123 100644
--- a/generated/googleapis/test/bigtableadmin/v2_test.dart
+++ b/generated/googleapis/test/bigtableadmin/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/bigtableadmin/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2382,7 +2390,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2429,7 +2438,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2476,7 +2486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2528,7 +2539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2590,7 +2602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2637,7 +2650,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2684,7 +2698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2735,7 +2750,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2783,7 +2799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2837,7 +2854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2891,7 +2909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2942,7 +2961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2993,7 +3013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3048,7 +3069,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3103,7 +3125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3153,7 +3176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3202,7 +3226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3262,7 +3287,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3323,7 +3349,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3373,7 +3400,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3420,7 +3448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3468,7 +3497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3521,7 +3551,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3575,7 +3606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3625,7 +3657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3672,7 +3705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3723,7 +3757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3774,7 +3809,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3838,7 +3874,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3892,7 +3929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3943,7 +3981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3996,7 +4035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4047,7 +4087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4094,7 +4135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4145,7 +4187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4196,7 +4239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4244,7 +4288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4296,7 +4341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4346,7 +4392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4406,7 +4453,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4457,7 +4505,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4508,7 +4557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4559,7 +4609,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4608,7 +4659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4658,7 +4710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/binaryauthorization/v1_test.dart b/generated/googleapis/test/binaryauthorization/v1_test.dart
index 93e792d..efcee06 100644
--- a/generated/googleapis/test/binaryauthorization/v1_test.dart
+++ b/generated/googleapis/test/binaryauthorization/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/binaryauthorization/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -836,7 +844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -887,7 +896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -941,7 +951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -991,7 +1002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1038,7 +1050,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1086,7 +1099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1141,7 +1155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1199,7 +1214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1250,7 +1266,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1301,7 +1318,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1352,7 +1370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1404,7 +1423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1461,7 +1481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1512,7 +1533,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index bfb0512..16983ab 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/blogger/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1503,7 +1511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1559,7 +1568,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1610,7 +1620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1671,7 +1682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1758,7 +1770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1827,7 +1840,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1895,7 +1909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1969,7 +1984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2050,7 +2066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2143,7 +2160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2219,7 +2237,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2278,7 +2297,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2340,7 +2360,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2398,7 +2419,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2459,7 +2481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2522,7 +2545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2601,7 +2625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2673,7 +2698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2738,7 +2764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2803,7 +2830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2882,7 +2910,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2959,7 +2988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3045,7 +3075,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3106,7 +3137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3176,7 +3208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3245,7 +3278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3320,7 +3354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3416,7 +3451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3498,7 +3534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3566,7 +3603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3624,7 +3662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3700,7 +3739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3767,7 +3807,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index ef733b4..8395db6 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/books/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4580,7 +4588,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4637,7 +4646,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4709,7 +4719,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4772,7 +4783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4830,7 +4842,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4881,7 +4894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4929,7 +4943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4979,7 +4994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5028,7 +5044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5084,7 +5101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5155,7 +5173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5220,7 +5239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5310,7 +5330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5406,7 +5427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5511,7 +5533,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5586,7 +5609,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5672,7 +5696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5723,7 +5748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5784,7 +5810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5853,7 +5880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5922,7 +5950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5974,7 +6003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6028,7 +6058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6095,7 +6126,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6171,7 +6203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6231,7 +6264,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6293,7 +6327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6357,7 +6392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6408,7 +6444,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6455,7 +6492,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6514,7 +6552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6581,7 +6620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6653,7 +6693,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6726,7 +6767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6793,7 +6835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6860,7 +6903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6916,7 +6960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6967,7 +7012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7032,7 +7078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7095,7 +7142,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7169,7 +7217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7239,7 +7288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7303,7 +7353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7354,7 +7405,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7421,7 +7473,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7498,7 +7551,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7599,7 +7653,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7664,7 +7719,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7734,7 +7790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7791,7 +7848,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7855,7 +7913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index abe3e65..6d9ee6e 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/calendar/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1983,7 +1991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2043,7 +2052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2106,7 +2116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2171,7 +2182,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2251,7 +2263,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2321,7 +2334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2390,7 +2404,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2457,7 +2472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2507,7 +2523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2560,7 +2577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2617,7 +2635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2693,7 +2712,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2753,7 +2773,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2814,7 +2835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2893,7 +2915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2943,7 +2966,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2993,7 +3017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3045,7 +3070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3101,7 +3127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3157,7 +3184,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3211,7 +3239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3259,7 +3288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3323,7 +3353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3393,7 +3424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3467,7 +3499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3541,7 +3574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3634,7 +3668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3737,7 +3772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3859,7 +3895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3940,7 +3977,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4020,7 +4058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4100,7 +4139,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4198,7 +4238,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4303,7 +4344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4357,7 +4399,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4408,7 +4451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4473,7 +4517,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/chat/v1_test.dart b/generated/googleapis/test/chat/v1_test.dart
index 7dc3d5a..186114d 100644
--- a/generated/googleapis/test/chat/v1_test.dart
+++ b/generated/googleapis/test/chat/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/chat/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1265,7 +1273,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1314,7 +1323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1361,7 +1371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1417,7 +1428,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1466,7 +1478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1527,7 +1540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1577,7 +1591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1624,7 +1639,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1676,7 +1692,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1728,7 +1745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index 4abf76d..b598d17 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/civicinfo/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1384,7 +1392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1432,7 +1441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1481,7 +1491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1544,7 +1555,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1607,7 +1619,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/classroom/v1_test.dart b/generated/googleapis/test/classroom/v1_test.dart
index 877b410..5ed1d92 100644
--- a/generated/googleapis/test/classroom/v1_test.dart
+++ b/generated/googleapis/test/classroom/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/classroom/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2449,7 +2457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2498,7 +2507,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2547,7 +2557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2597,7 +2608,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2667,7 +2679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2723,7 +2736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2784,7 +2798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2843,7 +2858,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2900,7 +2916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2968,7 +2985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3027,7 +3045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3086,7 +3105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3145,7 +3165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3227,7 +3248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3292,7 +3314,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3356,7 +3379,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3415,7 +3439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3474,7 +3499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3533,7 +3559,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3615,7 +3642,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3680,7 +3708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3754,7 +3783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3824,7 +3854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3916,7 +3947,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3992,7 +4024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4074,7 +4107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4154,7 +4188,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4234,7 +4269,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4296,7 +4332,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4355,7 +4392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4414,7 +4452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4475,7 +4514,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4558,7 +4598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4623,7 +4664,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4685,7 +4727,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4744,7 +4787,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4801,7 +4845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4869,7 +4914,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4928,7 +4974,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4987,7 +5034,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5044,7 +5092,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5112,7 +5161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5171,7 +5221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5230,7 +5281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5287,7 +5339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5358,7 +5411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5418,7 +5472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5467,7 +5522,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5516,7 +5572,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5565,7 +5622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5614,7 +5672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5677,7 +5736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5726,7 +5786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5777,7 +5838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5838,7 +5900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5897,7 +5960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5956,7 +6020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6032,7 +6097,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6096,7 +6162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6155,7 +6222,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6213,7 +6281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudasset/v1_test.dart b/generated/googleapis/test/cloudasset/v1_test.dart
index 4a36dc3..b55056d 100644
--- a/generated/googleapis/test/cloudasset/v1_test.dart
+++ b/generated/googleapis/test/cloudasset/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudasset/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2146,7 +2154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2193,7 +2202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2240,7 +2250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2287,7 +2298,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2338,7 +2350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2387,7 +2400,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2440,7 +2454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2504,7 +2519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2554,7 +2570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2615,7 +2632,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudbilling/v1_test.dart b/generated/googleapis/test/cloudbilling/v1_test.dart
index 10793f3..c427905 100644
--- a/generated/googleapis/test/cloudbilling/v1_test.dart
+++ b/generated/googleapis/test/cloudbilling/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudbilling/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1007,7 +1015,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1054,7 +1063,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1102,7 +1112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1156,7 +1167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1217,7 +1229,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1271,7 +1284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1322,7 +1336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1373,7 +1388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1429,7 +1445,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1480,7 +1497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1529,7 +1547,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1590,7 +1609,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudbuild/v1_test.dart b/generated/googleapis/test/cloudbuild/v1_test.dart
index afcc756..b255f2b 100644
--- a/generated/googleapis/test/cloudbuild/v1_test.dart
+++ b/generated/googleapis/test/cloudbuild/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudbuild/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1938,7 +1946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1985,7 +1994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2056,7 +2066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2116,7 +2127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2178,7 +2190,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2238,7 +2251,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2318,7 +2332,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2371,7 +2386,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2423,7 +2439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2475,7 +2492,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2530,7 +2548,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2593,7 +2612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2646,7 +2666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2693,7 +2714,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2754,7 +2776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2813,7 +2836,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2872,7 +2896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2929,7 +2954,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2999,7 +3025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3069,7 +3096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/clouddebugger/v2_test.dart b/generated/googleapis/test/clouddebugger/v2_test.dart
index 52ffb7f..e9342e6 100644
--- a/generated/googleapis/test/clouddebugger/v2_test.dart
+++ b/generated/googleapis/test/clouddebugger/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/clouddebugger/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1144,7 +1152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1204,7 +1213,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1277,7 +1287,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1327,7 +1338,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1399,7 +1411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1462,7 +1475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1526,7 +1540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1606,7 +1621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudfunctions/v1_test.dart b/generated/googleapis/test/cloudfunctions/v1_test.dart
index 039f0ff..9c5a853 100644
--- a/generated/googleapis/test/cloudfunctions/v1_test.dart
+++ b/generated/googleapis/test/cloudfunctions/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudfunctions/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1281,7 +1289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1330,7 +1339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1393,7 +1403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1455,7 +1466,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1506,7 +1518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1553,7 +1566,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1604,7 +1618,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1655,7 +1670,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1702,7 +1718,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1750,7 +1767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1805,7 +1823,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1864,7 +1883,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1918,7 +1938,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1969,7 +1990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudidentity/v1_test.dart b/generated/googleapis/test/cloudidentity/v1_test.dart
index 85f1fb9..4a92aaf 100644
--- a/generated/googleapis/test/cloudidentity/v1_test.dart
+++ b/generated/googleapis/test/cloudidentity/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudidentity/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1603,7 +1611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1653,7 +1662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1703,7 +1713,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1753,7 +1764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1807,7 +1819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1879,7 +1892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1934,7 +1948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1988,7 +2003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2042,7 +2058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2090,7 +2107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2140,7 +2158,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2195,7 +2214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2263,7 +2283,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2334,7 +2355,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2384,7 +2406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2438,7 +2461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2505,7 +2529,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2564,7 +2589,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2614,7 +2640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2661,7 +2688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2710,7 +2738,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2768,7 +2797,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2827,7 +2857,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2879,7 +2910,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2943,7 +2975,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2990,7 +3023,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3037,7 +3071,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3087,7 +3122,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3145,7 +3181,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3203,7 +3240,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudiot/v1_test.dart b/generated/googleapis/test/cloudiot/v1_test.dart
index e3bf34e..77d9ffb 100644
--- a/generated/googleapis/test/cloudiot/v1_test.dart
+++ b/generated/googleapis/test/cloudiot/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudiot/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1387,7 +1395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1438,7 +1447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1485,7 +1495,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1532,7 +1543,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1583,7 +1595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1632,7 +1645,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1691,7 +1705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1745,7 +1760,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1796,7 +1812,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1847,7 +1864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1901,7 +1919,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1948,7 +1967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1996,7 +2016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2053,7 +2074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2133,7 +2155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2186,7 +2209,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2240,7 +2264,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2297,7 +2322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2351,7 +2377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2406,7 +2433,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2457,7 +2485,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2508,7 +2537,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2567,7 +2597,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudkms/v1_test.dart b/generated/googleapis/test/cloudkms/v1_test.dart
index 61bfc5b..9a4f59e 100644
--- a/generated/googleapis/test/cloudkms/v1_test.dart
+++ b/generated/googleapis/test/cloudkms/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudkms/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1532,7 +1540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1582,7 +1591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1645,7 +1655,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1695,7 +1706,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1743,7 +1755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1800,7 +1813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1863,7 +1877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1914,7 +1929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1969,7 +1985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2027,7 +2044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2078,7 +2096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2125,7 +2144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2173,7 +2193,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2231,7 +2252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2298,7 +2320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2352,7 +2375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2403,7 +2427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2454,7 +2479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2514,7 +2540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2570,7 +2597,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2626,7 +2654,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2682,7 +2711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2734,7 +2764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2786,7 +2817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2842,7 +2874,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2899,7 +2932,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2970,7 +3004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3029,7 +3064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3083,7 +3119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3133,7 +3170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3181,7 +3219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3238,7 +3277,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3301,7 +3341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3352,7 +3393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudprofiler/v2_test.dart b/generated/googleapis/test/cloudprofiler/v2_test.dart
index 4cbf5c7..8df2085 100644
--- a/generated/googleapis/test/cloudprofiler/v2_test.dart
+++ b/generated/googleapis/test/cloudprofiler/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudprofiler/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -229,7 +237,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -280,7 +289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -332,7 +342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudresourcemanager/v1_test.dart b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
index eec12dc..9a1497f 100644
--- a/generated/googleapis/test/cloudresourcemanager/v1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudresourcemanager/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1720,7 +1728,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1771,7 +1780,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1823,7 +1833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1874,7 +1885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1927,7 +1939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1978,7 +1991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2029,7 +2043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2076,7 +2091,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2123,7 +2139,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2171,7 +2188,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2229,7 +2247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2282,7 +2301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2329,7 +2349,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2380,7 +2401,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2432,7 +2454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2483,7 +2506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2534,7 +2558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2587,7 +2612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2636,7 +2662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2687,7 +2714,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2738,7 +2766,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2789,7 +2818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2842,7 +2872,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2891,7 +2922,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2940,7 +2972,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2989,7 +3022,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3048,7 +3082,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3099,7 +3134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3159,7 +3195,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3210,7 +3247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3258,7 +3296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3318,7 +3357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3371,7 +3411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3430,7 +3471,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3481,7 +3523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3540,7 +3583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3599,7 +3643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3652,7 +3697,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudresourcemanager/v2_test.dart b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
index d7c9880..9fe6697 100644
--- a/generated/googleapis/test/cloudresourcemanager/v2_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudresourcemanager/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -934,7 +942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -982,7 +991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1029,7 +1039,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1080,7 +1091,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1129,7 +1141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1192,7 +1205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1244,7 +1258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1296,7 +1311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1347,7 +1363,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1398,7 +1415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1449,7 +1467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1498,7 +1517,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudscheduler/v1_test.dart b/generated/googleapis/test/cloudscheduler/v1_test.dart
index 1aa9c54..b0612b3 100644
--- a/generated/googleapis/test/cloudscheduler/v1_test.dart
+++ b/generated/googleapis/test/cloudscheduler/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudscheduler/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -784,7 +792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -834,7 +843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -896,7 +906,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -943,7 +954,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -990,7 +1002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1039,7 +1052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1098,7 +1112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1152,7 +1167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1203,7 +1219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1254,7 +1271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudsearch/v1_test.dart b/generated/googleapis/test/cloudsearch/v1_test.dart
index e4c68ae..33ec629 100644
--- a/generated/googleapis/test/cloudsearch/v1_test.dart
+++ b/generated/googleapis/test/cloudsearch/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudsearch/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -5800,7 +5808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5855,7 +5864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5907,7 +5917,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5971,7 +5982,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6041,7 +6053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6104,7 +6117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6156,7 +6170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6211,7 +6226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6264,7 +6280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6327,7 +6344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6376,7 +6394,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6434,7 +6453,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6486,7 +6506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6552,7 +6573,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6603,7 +6625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6654,7 +6677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6705,7 +6729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6761,7 +6786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6810,7 +6836,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6862,7 +6889,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6922,7 +6950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6971,7 +7000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7023,7 +7053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7094,7 +7125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7142,7 +7174,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7194,7 +7227,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7246,7 +7280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7307,7 +7342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7358,7 +7394,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7406,7 +7443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7458,7 +7496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7510,7 +7549,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7571,7 +7611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7622,7 +7663,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7675,7 +7717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7745,7 +7788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7815,7 +7859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7885,7 +7930,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7959,7 +8005,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8033,7 +8080,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8108,7 +8156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8183,7 +8232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudshell/v1_test.dart b/generated/googleapis/test/cloudshell/v1_test.dart
index 822cccf..f7f5465 100644
--- a/generated/googleapis/test/cloudshell/v1_test.dart
+++ b/generated/googleapis/test/cloudshell/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudshell/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -772,7 +780,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -819,7 +828,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -866,7 +876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -916,7 +927,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -978,7 +990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1029,7 +1042,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1076,7 +1090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1127,7 +1142,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1178,7 +1194,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudtasks/v2_test.dart b/generated/googleapis/test/cloudtasks/v2_test.dart
index 5c4df3b..209e14c 100644
--- a/generated/googleapis/test/cloudtasks/v2_test.dart
+++ b/generated/googleapis/test/cloudtasks/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudtasks/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1198,7 +1206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1248,7 +1257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1310,7 +1320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1357,7 +1368,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1404,7 +1416,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1455,7 +1468,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1505,7 +1519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1566,7 +1581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1620,7 +1636,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1671,7 +1688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1722,7 +1740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1773,7 +1792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1824,7 +1844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1877,7 +1898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1924,7 +1946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1972,7 +1995,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2024,7 +2048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2085,7 +2110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/cloudtrace/v2_test.dart b/generated/googleapis/test/cloudtrace/v2_test.dart
index f34e9e7..62dddac 100644
--- a/generated/googleapis/test/cloudtrace/v2_test.dart
+++ b/generated/googleapis/test/cloudtrace/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/cloudtrace/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -735,7 +743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -788,7 +797,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/composer/v1_test.dart b/generated/googleapis/test/composer/v1_test.dart
index 0ba08ec..a787347 100644
--- a/generated/googleapis/test/composer/v1_test.dart
+++ b/generated/googleapis/test/composer/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/composer/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -824,7 +832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -871,7 +880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -918,7 +928,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -967,7 +978,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1026,7 +1038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1080,7 +1093,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1136,7 +1150,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1183,7 +1198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1233,7 +1249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index d6b2b55..5c802bd 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/compute/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -34412,7 +34420,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34475,7 +34484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34524,7 +34534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34590,7 +34601,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34654,7 +34666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34702,7 +34715,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34751,7 +34765,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34803,7 +34818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34869,7 +34885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34933,7 +34950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -34981,7 +34999,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35030,7 +35049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35082,7 +35102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35147,7 +35168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35204,7 +35226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35262,7 +35285,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35310,7 +35334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35359,7 +35384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35408,7 +35434,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35456,7 +35483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35507,7 +35535,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35571,7 +35600,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35623,7 +35653,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35677,7 +35708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35729,7 +35761,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35792,7 +35825,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35841,7 +35875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35890,7 +35925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35938,7 +35974,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -35987,7 +36024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36038,7 +36076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36102,7 +36141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36154,7 +36194,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36206,7 +36247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36260,7 +36302,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36323,7 +36366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36372,7 +36416,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36439,7 +36484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36491,7 +36537,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36560,7 +36607,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36613,7 +36661,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36661,7 +36710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36707,7 +36757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36762,7 +36813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36818,7 +36870,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36883,7 +36936,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36936,7 +36990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -36988,7 +37043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37039,7 +37095,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37091,7 +37148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37139,7 +37197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37186,7 +37245,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37234,7 +37294,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37285,7 +37346,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37348,7 +37410,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37397,7 +37460,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37445,7 +37509,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37492,7 +37557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37540,7 +37606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37591,7 +37658,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37655,7 +37723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37707,7 +37776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37761,7 +37831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37825,7 +37896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37873,7 +37945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37923,7 +37996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -37975,7 +38049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38040,7 +38115,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38093,7 +38169,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38143,7 +38220,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38190,7 +38268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38238,7 +38317,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38289,7 +38369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38351,7 +38432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38398,7 +38480,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38446,7 +38529,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38497,7 +38581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38561,7 +38646,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38613,7 +38699,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38670,7 +38757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38719,7 +38807,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38774,7 +38863,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38822,7 +38912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38870,7 +38961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38921,7 +39013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -38985,7 +39078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39052,7 +39146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39114,7 +39209,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39156,7 +39252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39204,7 +39301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39263,7 +39361,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39314,7 +39413,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39377,7 +39477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39424,7 +39525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39472,7 +39574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39523,7 +39626,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39587,7 +39691,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39639,7 +39744,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39689,7 +39795,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39736,7 +39843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39784,7 +39892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39835,7 +39944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39899,7 +40009,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -39951,7 +40062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40001,7 +40113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40048,7 +40161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40096,7 +40210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40147,7 +40262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40211,7 +40327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40263,7 +40380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40313,7 +40431,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40365,7 +40484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40412,7 +40532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40456,7 +40577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40501,7 +40623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40555,7 +40678,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40610,7 +40734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40674,7 +40799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40725,7 +40851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40774,7 +40901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40823,7 +40951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40877,7 +41006,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40930,7 +41060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -40998,7 +41129,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41051,7 +41183,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41101,7 +41234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41155,7 +41289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41209,7 +41344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41256,7 +41392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41306,7 +41443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41358,7 +41496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41423,7 +41562,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41489,7 +41629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41555,7 +41696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41622,7 +41764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41676,7 +41819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41731,7 +41875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41782,7 +41927,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41838,7 +41984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41892,7 +42039,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -41947,7 +42095,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42003,7 +42152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42055,7 +42205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42119,7 +42270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42167,7 +42319,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42216,7 +42369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42268,7 +42422,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42337,7 +42492,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42402,7 +42558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42456,7 +42613,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42506,7 +42664,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42553,7 +42712,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42598,7 +42758,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42651,7 +42812,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42702,7 +42864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42765,7 +42928,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42814,7 +42978,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42868,7 +43033,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42924,7 +43090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -42976,7 +43143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43045,7 +43213,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43098,7 +43267,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43149,7 +43319,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43204,7 +43375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43254,7 +43426,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43301,7 +43474,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43354,7 +43528,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43404,7 +43579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43452,7 +43628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43501,7 +43678,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43552,7 +43730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43608,7 +43787,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43673,7 +43853,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43738,7 +43919,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43788,7 +43970,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43838,7 +44021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43893,7 +44077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -43950,7 +44135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44001,7 +44187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44054,7 +44241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44107,7 +44295,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44160,7 +44349,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44213,7 +44403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44266,7 +44457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44319,7 +44511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44372,7 +44565,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44426,7 +44620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44474,7 +44669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44521,7 +44717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44574,7 +44771,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44624,7 +44822,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44676,7 +44875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44729,7 +44929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44790,7 +44991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44846,7 +45048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44900,7 +45103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -44956,7 +45160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45011,7 +45216,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45076,7 +45282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45124,7 +45331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45175,7 +45383,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45231,7 +45440,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45296,7 +45506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45346,7 +45557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45394,7 +45606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45456,7 +45669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45503,7 +45717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45547,7 +45762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45596,7 +45812,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45647,7 +45864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45711,7 +45929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45760,7 +45979,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45808,7 +46028,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45856,7 +46077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45903,7 +46125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -45948,7 +46171,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46001,7 +46225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46052,7 +46277,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46115,7 +46341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46164,7 +46391,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46216,7 +46444,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46279,7 +46508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46328,7 +46558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46394,7 +46625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46464,7 +46696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46514,7 +46747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46568,7 +46802,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46617,7 +46852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46667,7 +46903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46719,7 +46956,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46788,7 +47026,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46854,7 +47093,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46906,7 +47146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -46954,7 +47195,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47001,7 +47243,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47049,7 +47292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47100,7 +47344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47167,7 +47412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47239,7 +47485,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47291,7 +47538,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47339,7 +47587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47391,7 +47640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47446,7 +47696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47498,7 +47749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47562,7 +47814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47615,7 +47868,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47663,7 +47917,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47709,7 +47964,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47764,7 +48020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47818,7 +48075,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47883,7 +48141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -47948,7 +48207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48000,7 +48260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48051,7 +48312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48103,7 +48365,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48155,7 +48418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48219,7 +48483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48267,7 +48532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48313,7 +48579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48367,7 +48634,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48419,7 +48687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48483,7 +48752,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48533,7 +48803,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48586,7 +48857,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48649,7 +48921,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48698,7 +48971,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48764,7 +49038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48828,7 +49103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48876,7 +49152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48926,7 +49203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -48978,7 +49256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49043,7 +49322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49095,7 +49375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49143,7 +49424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49194,7 +49476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49241,7 +49524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49292,7 +49576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49338,7 +49623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49381,7 +49667,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49429,7 +49716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49496,7 +49784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49559,7 +49848,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49610,7 +49900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49661,7 +49952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49712,7 +50004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49763,7 +50056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49814,7 +50108,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49862,7 +50157,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49911,7 +50207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -49963,7 +50260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50028,7 +50326,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50085,7 +50384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50140,7 +50440,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50188,7 +50489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50238,7 +50540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50288,7 +50591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50340,7 +50644,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50405,7 +50710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50458,7 +50764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50512,7 +50819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50575,7 +50883,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50624,7 +50933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50676,7 +50986,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50738,7 +51049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50787,7 +51099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50854,7 +51167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50907,7 +51221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -50956,7 +51271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51004,7 +51320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51050,7 +51367,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51105,7 +51423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51161,7 +51480,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51226,7 +51546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51280,7 +51601,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51332,7 +51654,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51383,7 +51706,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51435,7 +51759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51485,7 +51810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51533,7 +51859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51583,7 +51910,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51635,7 +51963,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51700,7 +52029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51751,7 +52081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51799,7 +52130,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51848,7 +52180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51900,7 +52233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -51965,7 +52299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52018,7 +52353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52076,7 +52412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52130,7 +52467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52185,7 +52523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52235,7 +52574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52291,7 +52631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52347,7 +52688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52394,7 +52736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52444,7 +52787,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52496,7 +52840,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52561,7 +52906,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52627,7 +52973,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52694,7 +53041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52761,7 +53109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52815,7 +53164,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52869,7 +53219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52920,7 +53271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -52976,7 +53328,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53031,7 +53384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53088,7 +53442,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53139,7 +53494,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53188,7 +53544,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53257,7 +53614,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53324,7 +53682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53376,7 +53735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53424,7 +53784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53474,7 +53835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53526,7 +53888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53589,7 +53952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53637,7 +54001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53687,7 +54052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53739,7 +54105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53801,7 +54168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53844,7 +54212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53893,7 +54262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -53953,7 +54323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54001,7 +54372,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54049,7 +54421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54099,7 +54472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54151,7 +54525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54214,7 +54589,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54262,7 +54638,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54312,7 +54689,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54364,7 +54742,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54429,7 +54808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54480,7 +54860,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54528,7 +54909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54578,7 +54960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54630,7 +55013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54698,7 +55082,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54752,7 +55137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54803,7 +55189,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54851,7 +55238,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54900,7 +55288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -54952,7 +55341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55017,7 +55407,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55070,7 +55461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55122,7 +55514,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55169,7 +55562,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55217,7 +55611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55283,7 +55678,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55347,7 +55743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55395,7 +55792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55441,7 +55839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55495,7 +55894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55547,7 +55947,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55612,7 +56013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55664,7 +56066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55714,7 +56117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55766,7 +56170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55830,7 +56235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55878,7 +56284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55925,7 +56332,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -55979,7 +56387,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56031,7 +56440,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56095,7 +56505,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56145,7 +56556,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56198,7 +56610,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56262,7 +56675,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56310,7 +56724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56360,7 +56775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56420,7 +56836,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56470,7 +56887,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56522,7 +56940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56587,7 +57006,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56639,7 +57059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56690,7 +57111,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56740,7 +57162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56787,7 +57210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56835,7 +57259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56886,7 +57311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56951,7 +57377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -56997,7 +57424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57044,7 +57472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57089,7 +57518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57140,7 +57570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57191,7 +57622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57254,7 +57686,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57319,7 +57752,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57371,7 +57805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57419,7 +57854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57469,7 +57905,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57516,7 +57953,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57561,7 +57999,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57614,7 +58053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57677,7 +58117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57726,7 +58167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57775,7 +58217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57827,7 +58270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57890,7 +58334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57937,7 +58382,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -57985,7 +58431,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58036,7 +58483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58098,7 +58546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58145,7 +58594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58193,7 +58643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58244,7 +58695,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58307,7 +58759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58372,7 +58825,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58426,7 +58880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58490,7 +58945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58543,7 +58999,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58592,7 +59049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58638,7 +59096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58692,7 +59151,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58744,7 +59204,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58807,7 +59268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58873,7 +59335,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58929,7 +59392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -58980,7 +59444,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59033,7 +59498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59082,7 +59548,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59129,7 +59596,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59177,7 +59645,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59228,7 +59697,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59292,7 +59762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59346,7 +59817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59409,7 +59881,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59456,7 +59929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59504,7 +59978,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59555,7 +60030,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59619,7 +60095,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59671,7 +60148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59725,7 +60203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59788,7 +60267,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59835,7 +60315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59883,7 +60364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59934,7 +60416,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -59998,7 +60481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60051,7 +60535,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60103,7 +60588,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60155,7 +60641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60209,7 +60696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60273,7 +60761,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60321,7 +60810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60370,7 +60860,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60422,7 +60913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60489,7 +60981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60542,7 +61035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60594,7 +61088,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60658,7 +61153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60706,7 +61202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60755,7 +61252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60805,7 +61303,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60857,7 +61356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60922,7 +61422,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -60976,7 +61477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61030,7 +61532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61084,7 +61587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61131,7 +61635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61179,7 +61684,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61230,7 +61736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61294,7 +61801,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61346,7 +61854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61398,7 +61907,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61450,7 +61960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61500,7 +62011,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61547,7 +62059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61595,7 +62108,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61646,7 +62160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61710,7 +62225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61762,7 +62278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61816,7 +62333,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61880,7 +62398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61928,7 +62447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -61978,7 +62498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62030,7 +62551,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62096,7 +62618,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62159,7 +62682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62206,7 +62730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62254,7 +62779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62306,7 +62832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62357,7 +62884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62421,7 +62949,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62473,7 +63002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62524,7 +63054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62575,7 +63106,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62639,7 +63171,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62687,7 +63220,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62732,7 +63266,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62782,7 +63317,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62834,7 +63370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62899,7 +63436,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -62951,7 +63489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63004,7 +63543,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63068,7 +63608,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63116,7 +63657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63165,7 +63707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63217,7 +63760,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63279,7 +63823,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63322,7 +63867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63371,7 +63917,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63431,7 +63978,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63477,7 +64025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -63525,7 +64074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/container/v1_test.dart b/generated/googleapis/test/container/v1_test.dart
index 1d5e386..aa5be05 100644
--- a/generated/googleapis/test/container/v1_test.dart
+++ b/generated/googleapis/test/container/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/container/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3826,7 +3834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3886,7 +3895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3943,7 +3953,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3994,7 +4005,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4044,7 +4056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4103,7 +4116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4159,7 +4173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4208,7 +4223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4263,7 +4279,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4314,7 +4331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4365,7 +4383,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4416,7 +4435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4467,7 +4487,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4518,7 +4539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4569,7 +4591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4620,7 +4643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4671,7 +4695,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4722,7 +4747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4773,7 +4799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4824,7 +4851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4877,7 +4905,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4928,7 +4957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4991,7 +5021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5053,7 +5084,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5113,7 +5145,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5164,7 +5197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5215,7 +5249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5266,7 +5301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5317,7 +5353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5366,7 +5403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5419,7 +5457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5469,7 +5508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5527,7 +5567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5599,7 +5640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5682,7 +5724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5762,7 +5805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5833,7 +5877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5903,7 +5948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5975,7 +6021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6056,7 +6103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6123,7 +6171,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6204,7 +6253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6284,7 +6334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6364,7 +6415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6444,7 +6496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6524,7 +6577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6604,7 +6658,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6685,7 +6740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6765,7 +6821,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6845,7 +6902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6919,7 +6977,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7011,7 +7070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7092,7 +7152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7173,7 +7234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7255,7 +7317,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7333,7 +7396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7424,7 +7488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7515,7 +7580,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7606,7 +7672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7697,7 +7764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7780,7 +7848,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7851,7 +7920,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7919,7 +7989,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/content/v2_1_test.dart b/generated/googleapis/test/content/v2_1_test.dart
index a450f73..233f748 100644
--- a/generated/googleapis/test/content/v2_1_test.dart
+++ b/generated/googleapis/test/content/v2_1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/content/v2_1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -12679,7 +12687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12724,7 +12733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12779,7 +12789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12824,7 +12835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12869,7 +12881,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12918,7 +12931,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12966,7 +12980,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13014,7 +13029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13071,7 +13087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13126,7 +13143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13175,7 +13193,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13230,7 +13249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13276,7 +13296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13325,7 +13346,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13389,7 +13411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13433,7 +13456,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13478,7 +13502,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13533,7 +13558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13588,7 +13614,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13632,7 +13659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13674,7 +13702,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13718,7 +13747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13765,7 +13795,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13810,7 +13841,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13865,7 +13897,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13920,7 +13953,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13967,7 +14001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14019,7 +14054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14080,7 +14116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14124,7 +14161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14168,7 +14206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14215,7 +14254,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14270,7 +14310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14316,7 +14357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14365,7 +14407,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14416,7 +14459,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14474,7 +14518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14532,7 +14577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14587,7 +14633,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14636,7 +14683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14687,7 +14735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14737,7 +14786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14788,7 +14838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14849,7 +14900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14913,7 +14965,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14961,7 +15014,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15006,7 +15060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15060,7 +15115,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15142,7 +15198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15193,7 +15250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15238,7 +15296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15286,7 +15345,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15335,7 +15395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15384,7 +15445,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15433,7 +15495,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15481,7 +15544,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15526,7 +15590,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15570,7 +15635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15617,7 +15683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15669,7 +15736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15721,7 +15789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15790,7 +15859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15839,7 +15909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15888,7 +15959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15938,7 +16010,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15988,7 +16061,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16038,7 +16112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16087,7 +16162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16138,7 +16214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16188,7 +16265,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16243,7 +16321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16288,7 +16367,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16332,7 +16412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16381,7 +16462,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16430,7 +16512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16475,7 +16558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16523,7 +16607,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16578,7 +16663,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16623,7 +16709,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16667,7 +16754,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16715,7 +16803,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16762,7 +16851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16823,7 +16913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16869,7 +16960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16918,7 +17010,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16973,7 +17066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17020,7 +17114,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17074,7 +17169,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17123,7 +17219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17178,7 +17275,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17222,7 +17320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17264,7 +17363,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17311,7 +17411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17357,7 +17458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17421,7 +17523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17465,7 +17568,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17507,7 +17611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17554,7 +17659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17597,7 +17703,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17643,7 +17750,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17690,7 +17798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17752,7 +17861,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17817,7 +17927,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17862,7 +17973,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17905,7 +18017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17949,7 +18062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17993,7 +18107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18039,7 +18154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18094,7 +18210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 730c059..c7d4206 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/customsearch/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -947,7 +955,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1107,7 +1116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/dataproc/v1_test.dart b/generated/googleapis/test/dataproc/v1_test.dart
index 24b3316..0e2be0f 100644
--- a/generated/googleapis/test/dataproc/v1_test.dart
+++ b/generated/googleapis/test/dataproc/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/dataproc/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3735,7 +3743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3782,7 +3791,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3829,7 +3839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3880,7 +3891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3929,7 +3941,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3987,7 +4000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4038,7 +4052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4089,7 +4104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4142,7 +4158,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4190,7 +4207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4240,7 +4258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4293,7 +4312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4344,7 +4364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4396,7 +4417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4448,7 +4470,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4506,7 +4529,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4557,7 +4581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4608,7 +4633,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4661,7 +4687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4708,7 +4735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4755,7 +4783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4806,7 +4835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4855,7 +4885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4913,7 +4944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4964,7 +4996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5015,7 +5048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5087,7 +5121,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5161,7 +5196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5247,7 +5283,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5317,7 +5354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5368,7 +5406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5436,7 +5475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5521,7 +5561,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5582,7 +5623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5633,7 +5675,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5714,7 +5757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5784,7 +5828,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5853,7 +5898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5904,7 +5950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5974,7 +6021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6063,7 +6111,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6117,7 +6166,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6186,7 +6236,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6255,7 +6306,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6307,7 +6359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6356,7 +6409,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6403,7 +6457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6450,7 +6505,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6501,7 +6557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6551,7 +6608,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6611,7 +6669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6662,7 +6721,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6715,7 +6775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6763,7 +6824,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6813,7 +6875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6866,7 +6929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6917,7 +6981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6969,7 +7034,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7021,7 +7087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7079,7 +7146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7130,7 +7198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7181,7 +7250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/datastore/v1_test.dart b/generated/googleapis/test/datastore/v1_test.dart
index 17df5ff..0a19e7d 100644
--- a/generated/googleapis/test/datastore/v1_test.dart
+++ b/generated/googleapis/test/datastore/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/datastore/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2503,7 +2511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2562,7 +2571,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2621,7 +2631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2681,7 +2692,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2741,7 +2753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2800,7 +2813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2859,7 +2873,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2918,7 +2933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2977,7 +2993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3038,7 +3055,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3097,7 +3115,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3156,7 +3175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3214,7 +3234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3273,7 +3294,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3320,7 +3342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3367,7 +3390,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3417,7 +3441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/deploymentmanager/v2_test.dart b/generated/googleapis/test/deploymentmanager/v2_test.dart
index ec9caba..e757ac1 100644
--- a/generated/googleapis/test/deploymentmanager/v2_test.dart
+++ b/generated/googleapis/test/deploymentmanager/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/deploymentmanager/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2013,7 +2021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2059,7 +2068,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2106,7 +2116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2150,7 +2161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2199,7 +2211,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2253,7 +2266,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2316,7 +2330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2374,7 +2389,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2423,7 +2439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2471,7 +2488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2523,7 +2541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2580,7 +2599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2628,7 +2648,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2686,7 +2707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2733,7 +2755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2792,7 +2815,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2840,7 +2864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2901,7 +2926,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/dfareporting/v3_4_test.dart b/generated/googleapis/test/dfareporting/v3_4_test.dart
index 821e29b..5eb6e08 100644
--- a/generated/googleapis/test/dfareporting/v3_4_test.dart
+++ b/generated/googleapis/test/dfareporting/v3_4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/dfareporting/v3_4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -13315,7 +13323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13379,7 +13388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13437,7 +13447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13502,7 +13513,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13560,7 +13572,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13624,7 +13637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13686,7 +13700,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13753,7 +13768,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13843,7 +13859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13906,7 +13923,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13970,7 +13988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14035,7 +14054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14119,7 +14139,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14182,7 +14203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14246,7 +14268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14308,7 +14331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14389,7 +14413,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14520,7 +14545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14583,7 +14609,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14647,7 +14674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14707,7 +14735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14769,7 +14798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14833,7 +14863,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14914,7 +14945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14977,7 +15009,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15041,7 +15074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15103,7 +15137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15171,7 +15206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15265,7 +15301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15328,7 +15365,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15392,7 +15430,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15454,7 +15493,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15524,7 +15564,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15623,7 +15664,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15686,7 +15728,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15746,7 +15789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15820,7 +15864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15892,7 +15937,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15967,7 +16013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16029,7 +16076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16100,7 +16148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16203,7 +16252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16266,7 +16316,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16330,7 +16381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16398,7 +16450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16490,7 +16543,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16566,7 +16620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16624,7 +16679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16688,7 +16744,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16748,7 +16805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16810,7 +16868,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16874,7 +16933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16955,7 +17015,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17018,7 +17079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17082,7 +17144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17144,7 +17207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17208,7 +17272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17266,7 +17331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17343,7 +17409,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17418,7 +17485,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17489,7 +17557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17561,7 +17630,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17636,7 +17706,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17727,7 +17798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17801,7 +17873,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17866,7 +17939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17926,7 +18000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17988,7 +18063,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18053,7 +18129,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18137,7 +18214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18200,7 +18278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18264,7 +18343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18326,7 +18406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18392,7 +18473,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18479,7 +18561,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18542,7 +18625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18606,7 +18690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18668,7 +18753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18742,7 +18828,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18851,7 +18938,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18914,7 +19002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -18978,7 +19067,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19044,7 +19134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19115,7 +19206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19177,7 +19269,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19246,7 +19339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19347,7 +19441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19411,7 +19506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19473,7 +19569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19549,7 +19646,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19609,7 +19707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19671,7 +19770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19739,7 +19839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19831,7 +19932,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19894,7 +19996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -19961,7 +20064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20024,7 +20128,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20103,7 +20208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20160,7 +20266,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20227,7 +20334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20289,7 +20397,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20360,7 +20469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20463,7 +20573,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20526,7 +20637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20590,7 +20702,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20652,7 +20765,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20719,7 +20833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20809,7 +20924,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20872,7 +20988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20936,7 +21053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -20995,7 +21113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21060,7 +21179,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21123,7 +21243,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21197,7 +21318,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21274,7 +21396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21358,7 +21481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21418,7 +21542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21482,7 +21607,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21545,7 +21671,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21624,7 +21751,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21682,7 +21810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21746,7 +21875,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21804,7 +21934,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21869,7 +22000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -21927,7 +22059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22001,7 +22134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22078,7 +22212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22177,7 +22312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22252,7 +22388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22336,7 +22473,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22398,7 +22536,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22475,7 +22614,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22594,7 +22734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22657,7 +22798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22721,7 +22863,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22781,7 +22924,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22843,7 +22987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22907,7 +23052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -22988,7 +23134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23051,7 +23198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23114,7 +23262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23186,7 +23335,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23248,7 +23398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23328,7 +23479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23454,7 +23606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23517,7 +23670,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23581,7 +23735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23639,7 +23794,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23703,7 +23859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23761,7 +23918,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23825,7 +23983,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23890,7 +24049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -23971,7 +24131,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24035,7 +24196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24098,7 +24260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24161,7 +24324,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24225,7 +24389,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24287,7 +24452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24353,7 +24519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24439,7 +24606,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24502,7 +24670,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24566,7 +24735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24626,7 +24796,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24688,7 +24859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24751,7 +24923,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24832,7 +25005,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24901,7 +25075,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -24970,7 +25145,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25035,7 +25211,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25112,7 +25289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25184,7 +25362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25261,7 +25440,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25323,7 +25503,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25396,7 +25577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25506,7 +25688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25569,7 +25752,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25633,7 +25817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25695,7 +25880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25757,7 +25943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25833,7 +26020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25895,7 +26083,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -25959,7 +26148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26040,7 +26230,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26103,7 +26294,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26167,7 +26359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26232,7 +26425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26317,7 +26511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26379,7 +26574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26444,7 +26640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26528,7 +26725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26591,7 +26789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26645,7 +26844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26693,7 +26893,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26755,7 +26956,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26813,7 +27015,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26878,7 +27081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -26937,7 +27141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27002,7 +27207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27062,7 +27268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27124,7 +27331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27190,7 +27398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27277,7 +27486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27340,7 +27550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27404,7 +27615,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -27462,7 +27674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/dialogflow/v2_test.dart b/generated/googleapis/test/dialogflow/v2_test.dart
index d23e9d6..9bd8539 100644
--- a/generated/googleapis/test/dialogflow/v2_test.dart
+++ b/generated/googleapis/test/dialogflow/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/dialogflow/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -9545,7 +9553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9592,7 +9601,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9644,7 +9654,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9700,7 +9711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9747,7 +9759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9796,7 +9809,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9851,7 +9865,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9902,7 +9917,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9951,7 +9967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10010,7 +10027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10062,7 +10080,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10122,7 +10141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10176,7 +10196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10228,7 +10249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10279,7 +10301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10327,7 +10350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10380,7 +10404,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10444,7 +10469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10508,7 +10534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10562,7 +10589,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10616,7 +10644,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10667,7 +10696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10726,7 +10756,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10778,7 +10809,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10839,7 +10871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10892,7 +10925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10945,7 +10979,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11000,7 +11035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11066,7 +11102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11130,7 +11167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11184,7 +11222,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11237,7 +11276,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11293,7 +11333,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11359,7 +11400,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11417,7 +11459,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11469,7 +11512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11522,7 +11566,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11576,7 +11621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11625,7 +11671,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11683,7 +11730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11751,7 +11799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11810,7 +11859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11861,7 +11911,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11915,7 +11966,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11962,7 +12014,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12009,7 +12062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12058,7 +12112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12118,7 +12173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12174,7 +12230,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12222,7 +12279,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12269,7 +12327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12319,7 +12378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12379,7 +12439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12432,7 +12493,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12479,7 +12541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12529,7 +12592,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12588,7 +12652,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12635,7 +12700,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12685,7 +12751,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/digitalassetlinks/v1_test.dart b/generated/googleapis/test/digitalassetlinks/v1_test.dart
index ae30c73..963066b 100644
--- a/generated/googleapis/test/digitalassetlinks/v1_test.dart
+++ b/generated/googleapis/test/digitalassetlinks/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/digitalassetlinks/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -342,7 +350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -421,7 +430,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index 9833940..e1281e8 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/discovery/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1090,7 +1098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1140,7 +1149,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/displayvideo/v1_test.dart b/generated/googleapis/test/displayvideo/v1_test.dart
index baae6dc..884cdae 100644
--- a/generated/googleapis/test/displayvideo/v1_test.dart
+++ b/generated/googleapis/test/displayvideo/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/displayvideo/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -8663,7 +8671,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8719,7 +8728,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8773,7 +8783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8835,7 +8846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8882,7 +8894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8929,7 +8942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8979,7 +8993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9046,7 +9061,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9105,7 +9121,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9158,7 +9175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9206,7 +9224,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9254,7 +9273,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9305,7 +9325,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9370,7 +9391,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9427,7 +9449,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9479,7 +9502,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9534,7 +9558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9603,7 +9628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9673,7 +9699,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9736,7 +9763,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9798,7 +9826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9854,7 +9883,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9922,7 +9952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9970,7 +10001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10018,7 +10050,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10069,7 +10102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10134,7 +10168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10190,7 +10225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10238,7 +10274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10286,7 +10323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10337,7 +10375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10402,7 +10441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10460,7 +10500,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10515,7 +10556,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10580,7 +10622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10628,7 +10671,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10676,7 +10720,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10727,7 +10772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10792,7 +10838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10856,7 +10903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10912,7 +10960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10968,7 +11017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11027,7 +11077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11093,7 +11144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11141,7 +11193,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11192,7 +11245,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11257,7 +11311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11325,7 +11380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11397,7 +11453,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11466,7 +11523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11537,7 +11595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11602,7 +11661,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11650,7 +11710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11699,7 +11760,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11749,7 +11811,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11809,7 +11872,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11880,7 +11944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11945,7 +12010,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12007,7 +12073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12063,7 +12130,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12134,7 +12202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12187,7 +12256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12241,7 +12311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12298,7 +12369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12362,7 +12434,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12420,7 +12493,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12489,7 +12563,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12547,7 +12622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12616,7 +12692,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12669,7 +12746,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12735,7 +12813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12793,7 +12872,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12862,7 +12942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12920,7 +13001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12978,7 +13060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13036,7 +13119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13107,7 +13191,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13163,7 +13248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13219,7 +13305,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13277,7 +13364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13353,7 +13441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13419,7 +13508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13476,7 +13566,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13535,7 +13626,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13597,7 +13689,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13666,7 +13759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13720,7 +13814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13790,7 +13885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13844,7 +13940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13893,7 +13990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13942,7 +14040,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14008,7 +14107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14060,7 +14160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14115,7 +14216,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14184,7 +14286,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14254,7 +14357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14317,7 +14421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14379,7 +14484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14435,7 +14541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14508,7 +14615,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14561,7 +14669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14615,7 +14724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14671,7 +14781,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14735,7 +14846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14784,7 +14896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14835,7 +14948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14890,7 +15004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14958,7 +15073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15009,7 +15125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15056,7 +15173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15103,7 +15221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15152,7 +15271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15216,7 +15336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/dlp/v2_test.dart b/generated/googleapis/test/dlp/v2_test.dart
index 15c79f6..887ec94 100644
--- a/generated/googleapis/test/dlp/v2_test.dart
+++ b/generated/googleapis/test/dlp/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/dlp/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -7387,7 +7395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7451,7 +7460,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7517,7 +7527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7565,7 +7576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7612,7 +7624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7664,7 +7677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7732,7 +7746,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7787,7 +7802,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7835,7 +7851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7882,7 +7899,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7934,7 +7952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8000,7 +8019,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8058,7 +8078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8106,7 +8127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8153,7 +8175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8205,7 +8228,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8273,7 +8297,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8329,7 +8354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8377,7 +8403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8424,7 +8451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8476,7 +8504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8542,7 +8571,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8598,7 +8628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8645,7 +8676,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8692,7 +8724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8743,7 +8776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8809,7 +8843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8863,7 +8898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8910,7 +8946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8957,7 +8994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9008,7 +9046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9074,7 +9113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9127,7 +9167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9179,7 +9220,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9231,7 +9273,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9288,7 +9331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9336,7 +9380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9383,7 +9428,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9435,7 +9481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9503,7 +9550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9557,7 +9605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9608,7 +9657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9655,7 +9705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9702,7 +9753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9755,7 +9807,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9826,7 +9879,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9881,7 +9935,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9929,7 +9984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9976,7 +10032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10028,7 +10085,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10094,7 +10152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10149,7 +10208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10200,7 +10260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10247,7 +10308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10294,7 +10356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10346,7 +10409,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10413,7 +10477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10466,7 +10531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10518,7 +10584,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10570,7 +10637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10628,7 +10696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10676,7 +10745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10723,7 +10793,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10775,7 +10846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10843,7 +10915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10897,7 +10970,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10948,7 +11022,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10995,7 +11070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11046,7 +11122,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11093,7 +11170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11145,7 +11223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11199,7 +11278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11270,7 +11350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11325,7 +11406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11373,7 +11455,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11420,7 +11503,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11472,7 +11556,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11538,7 +11623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11593,7 +11679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11644,7 +11731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11691,7 +11779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11738,7 +11827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11790,7 +11880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11843,7 +11934,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11910,7 +12002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11964,7 +12057,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12011,7 +12105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12058,7 +12153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12109,7 +12205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12175,7 +12272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12229,7 +12327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12276,7 +12375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12323,7 +12423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12374,7 +12475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12440,7 +12542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/dns/v1_test.dart b/generated/googleapis/test/dns/v1_test.dart
index ed3e5a8..1c9bce4 100644
--- a/generated/googleapis/test/dns/v1_test.dart
+++ b/generated/googleapis/test/dns/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/dns/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1457,7 +1465,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1530,7 +1539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1602,7 +1612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1687,7 +1698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1762,7 +1774,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1844,7 +1857,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1915,7 +1929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1987,7 +2002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2050,7 +2066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2111,7 +2128,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2172,7 +2190,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2246,7 +2265,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2313,7 +2333,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2378,7 +2399,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2441,7 +2463,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2502,7 +2525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2562,7 +2586,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2633,7 +2658,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2700,7 +2726,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2755,7 +2782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2829,7 +2857,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/docs/v1_test.dart b/generated/googleapis/test/docs/v1_test.dart
index 49fdd03..e5e9ef5 100644
--- a/generated/googleapis/test/docs/v1_test.dart
+++ b/generated/googleapis/test/docs/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/docs/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -5923,7 +5931,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5972,7 +5981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6022,7 +6032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/domainsrdap/v1_test.dart b/generated/googleapis/test/domainsrdap/v1_test.dart
index 668d920..9b9365b 100644
--- a/generated/googleapis/test/domainsrdap/v1_test.dart
+++ b/generated/googleapis/test/domainsrdap/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/domainsrdap/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -340,7 +348,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -389,7 +398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -440,7 +450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -501,7 +512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -552,7 +564,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -599,7 +612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -644,7 +658,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -689,7 +704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -732,7 +748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -775,7 +792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
index 6bb8c9f..de5eb7d 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/doubleclickbidmanager/v1_1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1252,7 +1260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1304,7 +1313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1359,7 +1369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1414,7 +1425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1464,7 +1476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1514,7 +1527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1578,7 +1592,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1641,7 +1656,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1702,7 +1718,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index ed5b6ba..f636c05 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/doubleclicksearch/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -965,7 +973,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1035,7 +1044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1084,7 +1094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1135,7 +1146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1186,7 +1198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1235,7 +1248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1297,7 +1311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1344,7 +1359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1411,7 +1427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index c908030..0580a42 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/drive/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3202,7 +3210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3266,7 +3275,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3317,7 +3327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3385,7 +3396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3450,7 +3462,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3525,7 +3538,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3633,7 +3647,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3729,7 +3744,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3792,7 +3808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3856,7 +3873,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3921,7 +3939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3993,7 +4012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4069,7 +4089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4130,7 +4151,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4195,7 +4217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4257,7 +4280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4336,7 +4360,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4402,7 +4427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4456,7 +4482,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4507,7 +4534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4569,7 +4597,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4676,7 +4706,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4746,7 +4777,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4803,7 +4835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4882,7 +4915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4970,7 +5004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5027,7 +5062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5091,7 +5127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5141,7 +5178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5209,7 +5247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5298,7 +5337,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5397,7 +5437,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5513,7 +5554,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5625,7 +5667,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5696,7 +5739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5767,7 +5811,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5853,7 +5898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5976,7 +6022,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6063,7 +6110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6127,7 +6175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6192,7 +6241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6260,7 +6310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6327,7 +6378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6400,7 +6452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6462,7 +6515,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6531,7 +6585,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6617,7 +6672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6707,7 +6763,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6794,7 +6851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6875,7 +6933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6939,7 +6998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7004,7 +7064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7062,7 +7123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7129,7 +7191,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7199,7 +7262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7276,7 +7340,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7347,7 +7412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7422,7 +7488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7493,7 +7560,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7579,7 +7647,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7656,7 +7725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7721,7 +7791,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7781,7 +7852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7841,7 +7913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7914,7 +7987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7980,7 +8054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8034,7 +8109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8085,7 +8161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8142,7 +8219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8196,7 +8274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8265,7 +8344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/drive/v3_test.dart b/generated/googleapis/test/drive/v3_test.dart
index 2a0741d..6f67777 100644
--- a/generated/googleapis/test/drive/v3_test.dart
+++ b/generated/googleapis/test/drive/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/drive/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2224,7 +2232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2276,7 +2285,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2350,7 +2360,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2453,7 +2464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2545,7 +2557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2607,7 +2620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2669,7 +2683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2730,7 +2745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2795,7 +2811,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2874,7 +2891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2929,7 +2947,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2983,7 +3002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3034,7 +3054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3096,7 +3117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3148,7 +3170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3218,7 +3241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3275,7 +3299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3350,7 +3375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3435,7 +3461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3515,7 +3542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3572,7 +3600,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3636,7 +3665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3686,7 +3716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3748,7 +3779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3823,7 +3855,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3931,7 +3964,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4028,7 +4062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4113,7 +4148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4203,7 +4239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4276,7 +4313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4350,7 +4388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4440,7 +4479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4530,7 +4570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4602,7 +4643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4673,7 +4715,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4747,7 +4790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4833,7 +4877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4898,7 +4943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4962,7 +5008,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5025,7 +5072,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5098,7 +5146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5153,7 +5202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5207,7 +5257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5258,7 +5309,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5314,7 +5366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5383,7 +5436,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/driveactivity/v2_test.dart b/generated/googleapis/test/driveactivity/v2_test.dart
index ec466cc..17ef24d 100644
--- a/generated/googleapis/test/driveactivity/v2_test.dart
+++ b/generated/googleapis/test/driveactivity/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/driveactivity/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1791,7 +1799,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/fcm/v1_test.dart b/generated/googleapis/test/fcm/v1_test.dart
index fe5e122..c7145e5 100644
--- a/generated/googleapis/test/fcm/v1_test.dart
+++ b/generated/googleapis/test/fcm/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/fcm/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -716,7 +724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/file/v1_test.dart b/generated/googleapis/test/file/v1_test.dart
index 9718f72..bef09f7 100644
--- a/generated/googleapis/test/file/v1_test.dart
+++ b/generated/googleapis/test/file/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/file/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1235,7 +1243,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1286,7 +1295,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1352,7 +1362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1402,7 +1413,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1449,7 +1461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1500,7 +1513,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1564,7 +1578,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1620,7 +1635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1667,7 +1683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1714,7 +1731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1764,7 +1782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
index 09b887e..f791b11 100644
--- a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
+++ b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/firebasedynamiclinks/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -943,7 +951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -994,7 +1003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1053,7 +1063,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1109,7 +1120,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1159,7 +1171,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/firebaserules/v1_test.dart b/generated/googleapis/test/firebaserules/v1_test.dart
index 70b3828..5ec64c5 100644
--- a/generated/googleapis/test/firebaserules/v1_test.dart
+++ b/generated/googleapis/test/firebaserules/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/firebaserules/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1095,7 +1103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1148,7 +1157,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1195,7 +1205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1242,7 +1253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1290,7 +1302,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1343,7 +1356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1403,7 +1417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1456,7 +1471,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1503,7 +1519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1550,7 +1567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1600,7 +1618,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/firestore/v1_test.dart b/generated/googleapis/test/firestore/v1_test.dart
index 63e6156..40e291e 100644
--- a/generated/googleapis/test/firestore/v1_test.dart
+++ b/generated/googleapis/test/firestore/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/firestore/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3209,7 +3217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3261,7 +3270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3312,7 +3322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3363,7 +3374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3426,7 +3438,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3484,7 +3497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3532,7 +3546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3580,7 +3595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3631,7 +3647,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3694,7 +3711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3745,7 +3763,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3796,7 +3815,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3847,7 +3867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3901,7 +3922,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3957,7 +3979,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4014,7 +4037,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4079,7 +4103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4152,7 +4177,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4203,7 +4229,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4254,7 +4281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4309,7 +4337,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4373,7 +4402,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4424,7 +4454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4475,7 +4506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4528,7 +4560,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4575,7 +4608,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4656,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4672,7 +4707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4731,7 +4767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4781,7 +4818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
index 58d4c2a..670287d 100644
--- a/generated/googleapis/test/fitness/v1_test.dart
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/fitness/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1017,7 +1025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1061,7 +1070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1105,7 +1115,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1149,7 +1160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1200,7 +1212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1249,7 +1262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1303,7 +1317,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1355,7 +1370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1410,7 +1426,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1462,7 +1479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1509,7 +1527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1558,7 +1577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1623,7 +1643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index d3014af..9f13395 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/games/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2499,7 +2507,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2569,7 +2578,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2633,7 +2643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2700,7 +2711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2756,7 +2768,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2814,7 +2827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2863,7 +2877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2917,7 +2932,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2969,7 +2985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3020,7 +3037,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3070,7 +3088,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3128,7 +3147,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3188,7 +3208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3242,7 +3263,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3292,7 +3314,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3349,7 +3372,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3411,7 +3435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3473,7 +3498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3527,7 +3553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3585,7 +3612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3662,7 +3690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3739,7 +3768,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3816,7 +3846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3892,7 +3923,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3950,7 +3982,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4005,7 +4038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4065,7 +4099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4122,7 +4157,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
index b105faa..ca01746 100644
--- a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
+++ b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/gamesconfiguration/v1configuration.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -513,7 +521,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -560,7 +569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -619,7 +629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -676,7 +687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -737,7 +749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -801,7 +814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -852,7 +866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -899,7 +914,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -958,7 +974,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1015,7 +1032,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1076,7 +1094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index 6d045cd..aae2228 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/gamesmanagement/v1management.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -633,7 +641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -678,7 +687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -725,7 +735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -778,7 +789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -827,7 +839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -884,7 +897,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -948,7 +962,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -991,7 +1006,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1032,7 +1048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1085,7 +1102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1134,7 +1152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1193,7 +1212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1250,7 +1270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1305,7 +1326,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1350,7 +1372,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1395,7 +1418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1448,7 +1472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1497,7 +1522,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/genomics/v1_test.dart b/generated/googleapis/test/genomics/v1_test.dart
index f2bcc4d..6167e7d 100644
--- a/generated/googleapis/test/genomics/v1_test.dart
+++ b/generated/googleapis/test/genomics/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/genomics/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -977,7 +985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1024,7 +1033,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1074,7 +1084,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index 60022db..9947736 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/gmail/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1940,7 +1948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1995,7 +2004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2052,7 +2062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2116,7 +2127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2175,7 +2187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2233,7 +2246,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2293,7 +2307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2367,7 +2382,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2433,7 +2449,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2495,7 +2512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2572,7 +2590,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2631,7 +2650,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2688,7 +2708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2743,7 +2764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2806,7 +2828,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2869,7 +2892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2930,7 +2954,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2987,7 +3012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3044,7 +3070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3103,7 +3130,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3175,7 +3203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3252,7 +3281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3319,7 +3349,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3402,7 +3433,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3464,7 +3496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3529,7 +3562,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3594,7 +3628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3665,7 +3700,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3722,7 +3758,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3777,7 +3814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3832,7 +3870,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3887,7 +3926,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3942,7 +3982,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4001,7 +4042,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4060,7 +4102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4119,7 +4162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4178,7 +4222,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4237,7 +4282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4298,7 +4344,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4357,7 +4404,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4414,7 +4462,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4469,7 +4518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4530,7 +4580,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4589,7 +4640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4646,7 +4698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4701,7 +4754,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4762,7 +4816,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4821,7 +4876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4878,7 +4934,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4933,7 +4990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4994,7 +5052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5053,7 +5112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5110,7 +5170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5165,7 +5226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5228,7 +5290,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5291,7 +5354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5357,7 +5421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5426,7 +5491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5493,7 +5559,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5562,7 +5629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5628,7 +5696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5703,7 +5772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5762,7 +5832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5821,7 +5892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5887,7 +5959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5970,7 +6043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6035,7 +6109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6100,7 +6175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/groupsmigration/v1_test.dart b/generated/googleapis/test/groupsmigration/v1_test.dart
index 1b8781d..feb324d 100644
--- a/generated/googleapis/test/groupsmigration/v1_test.dart
+++ b/generated/googleapis/test/groupsmigration/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/groupsmigration/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -129,7 +137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/groupssettings/v1_test.dart b/generated/googleapis/test/groupssettings/v1_test.dart
index 86d8c9e..24a9264 100644
--- a/generated/googleapis/test/groupssettings/v1_test.dart
+++ b/generated/googleapis/test/groupssettings/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/groupssettings/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -237,7 +245,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -284,7 +293,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -331,7 +341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/healthcare/v1_test.dart b/generated/googleapis/test/healthcare/v1_test.dart
index 029c83d..4a677a1 100644
--- a/generated/googleapis/test/healthcare/v1_test.dart
+++ b/generated/googleapis/test/healthcare/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/healthcare/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2893,7 +2901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2943,7 +2952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3006,7 +3016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3060,7 +3071,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3107,7 +3119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3154,7 +3167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3202,7 +3216,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3257,7 +3272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3316,7 +3332,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3370,7 +3387,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3421,7 +3439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3476,7 +3495,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3530,7 +3550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3577,7 +3598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3628,7 +3650,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3675,7 +3698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3723,7 +3747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3780,7 +3805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3830,7 +3856,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3891,7 +3918,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3942,7 +3970,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3991,7 +4020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4039,7 +4069,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4090,7 +4121,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4142,7 +4174,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4194,7 +4227,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4250,7 +4284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4303,7 +4338,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4356,7 +4392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4409,7 +4446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4463,7 +4501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4520,7 +4559,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4579,7 +4619,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4633,7 +4674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4687,7 +4729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4741,7 +4784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4801,7 +4845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4856,7 +4901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4911,7 +4957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4966,7 +5013,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5026,7 +5074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5082,7 +5131,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5136,7 +5186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5190,7 +5241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5237,7 +5289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5288,7 +5341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5335,7 +5389,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5383,7 +5438,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5440,7 +5496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5490,7 +5547,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5551,7 +5609,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5605,7 +5664,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5656,7 +5716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5713,7 +5774,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5775,7 +5837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5822,7 +5885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5875,7 +5939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5923,7 +5988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5975,7 +6041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6027,7 +6094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6090,7 +6158,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6138,7 +6207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6190,7 +6260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6242,7 +6313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6290,7 +6362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6345,7 +6418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6395,7 +6469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6442,7 +6517,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6490,7 +6566,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6546,7 +6623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6607,7 +6685,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6661,7 +6740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6712,7 +6792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6771,7 +6852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6823,7 +6905,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6876,7 +6959,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6933,7 +7017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6990,7 +7075,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7061,7 +7147,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7117,7 +7204,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7164,7 +7252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7214,7 +7303,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/homegraph/v1_test.dart b/generated/googleapis/test/homegraph/v1_test.dart
index 194aad1..7a48564 100644
--- a/generated/googleapis/test/homegraph/v1_test.dart
+++ b/generated/googleapis/test/homegraph/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/homegraph/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -934,7 +942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -988,7 +997,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1037,7 +1047,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1087,7 +1098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1136,7 +1148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/iam/v1_test.dart b/generated/googleapis/test/iam/v1_test.dart
index d31050e..89dfa30 100644
--- a/generated/googleapis/test/iam/v1_test.dart
+++ b/generated/googleapis/test/iam/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/iam/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1671,7 +1679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1720,7 +1729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1773,7 +1783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1821,7 +1832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1869,7 +1881,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1920,7 +1933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1984,7 +1998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2038,7 +2053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2089,7 +2105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2142,7 +2159,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2190,7 +2208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2238,7 +2257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2289,7 +2309,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2353,7 +2374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2407,7 +2429,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2460,7 +2483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2507,7 +2531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2558,7 +2583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2609,7 +2635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2656,7 +2683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2704,7 +2732,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2759,7 +2788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2817,7 +2847,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2868,7 +2899,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2919,7 +2951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2970,7 +3003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3021,7 +3055,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3072,7 +3107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3123,7 +3159,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3176,7 +3213,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3223,7 +3261,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3271,7 +3310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3321,7 +3361,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3373,7 +3414,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3422,7 +3464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3472,7 +3515,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3535,7 +3579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/iamcredentials/v1_test.dart b/generated/googleapis/test/iamcredentials/v1_test.dart
index d89788f..a7606c1 100644
--- a/generated/googleapis/test/iamcredentials/v1_test.dart
+++ b/generated/googleapis/test/iamcredentials/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/iamcredentials/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -392,7 +400,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -443,7 +452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -494,7 +504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -545,7 +556,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/iap/v1_test.dart b/generated/googleapis/test/iap/v1_test.dart
index 6c13cd3..68c2a5c 100644
--- a/generated/googleapis/test/iap/v1_test.dart
+++ b/generated/googleapis/test/iap/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/iap/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -931,7 +939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -978,7 +987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1025,7 +1035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1079,7 +1090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1126,7 +1138,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1173,7 +1186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1222,7 +1236,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1281,7 +1296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1334,7 +1350,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1381,7 +1398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1432,7 +1450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1483,7 +1502,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1535,7 +1555,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 3dc0f02..54ad0e2 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/identitytoolkit/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2197,7 +2205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2250,7 +2259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2305,7 +2315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2360,7 +2371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2413,7 +2425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2465,7 +2478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2515,7 +2529,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2571,7 +2586,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2620,7 +2636,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2673,7 +2690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2728,7 +2746,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2782,7 +2801,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2837,7 +2857,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2891,7 +2912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2945,7 +2967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2998,7 +3021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3053,7 +3077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3108,7 +3133,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3161,7 +3187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3216,7 +3243,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/indexing/v3_test.dart b/generated/googleapis/test/indexing/v3_test.dart
index 267e931..4566370 100644
--- a/generated/googleapis/test/indexing/v3_test.dart
+++ b/generated/googleapis/test/indexing/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/indexing/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -177,7 +185,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -227,7 +236,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/jobs/v2_test.dart b/generated/googleapis/test/jobs/v2_test.dart
index 4048c00..c25c928 100644
--- a/generated/googleapis/test/jobs/v2_test.dart
+++ b/generated/googleapis/test/jobs/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/jobs/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3835,7 +3843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3882,7 +3891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3929,7 +3939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3977,7 +3988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4039,7 +4051,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4097,7 +4110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4164,7 +4178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4213,7 +4228,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4261,7 +4277,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4313,7 +4330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4360,7 +4378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4409,7 +4428,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4458,7 +4478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4521,7 +4542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4570,7 +4592,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4619,7 +4642,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4672,7 +4696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/jobs/v3_test.dart b/generated/googleapis/test/jobs/v3_test.dart
index deae304..3b06a77 100644
--- a/generated/googleapis/test/jobs/v3_test.dart
+++ b/generated/googleapis/test/jobs/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/jobs/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3369,7 +3377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3441,7 +3450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3494,7 +3504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3541,7 +3552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3588,7 +3600,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3638,7 +3651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3699,7 +3713,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3752,7 +3767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3803,7 +3819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3850,7 +3867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3897,7 +3915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3948,7 +3967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4011,7 +4031,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4062,7 +4083,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4113,7 +4135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/kgsearch/v1_test.dart b/generated/googleapis/test/kgsearch/v1_test.dart
index abfe260..971011b 100644
--- a/generated/googleapis/test/kgsearch/v1_test.dart
+++ b/generated/googleapis/test/kgsearch/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/kgsearch/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -209,7 +217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/language/v1_test.dart b/generated/googleapis/test/language/v1_test.dart
index 31c66a9..75b5934 100644
--- a/generated/googleapis/test/language/v1_test.dart
+++ b/generated/googleapis/test/language/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/language/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1041,7 +1049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1090,7 +1099,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1139,7 +1149,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1188,7 +1199,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1237,7 +1249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1286,7 +1299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/libraryagent/v1_test.dart b/generated/googleapis/test/libraryagent/v1_test.dart
index 7dbb9eb..caabadc 100644
--- a/generated/googleapis/test/libraryagent/v1_test.dart
+++ b/generated/googleapis/test/libraryagent/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/libraryagent/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -244,7 +252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -291,7 +300,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -348,7 +358,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -395,7 +406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -444,7 +456,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -499,7 +512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 15f036f..21b4e00 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/licensing/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -225,7 +233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -292,7 +301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -361,7 +371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -419,7 +430,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -496,7 +508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -578,7 +591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -652,7 +666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/logging/v2_test.dart b/generated/googleapis/test/logging/v2_test.dart
index d3be4a7..d590e15 100644
--- a/generated/googleapis/test/logging/v2_test.dart
+++ b/generated/googleapis/test/logging/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/logging/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1727,7 +1735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1780,7 +1789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1827,7 +1837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1874,7 +1885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1923,7 +1935,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1982,7 +1995,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2039,7 +2053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2089,7 +2104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2138,7 +2154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2197,7 +2214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2251,7 +2269,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2300,7 +2319,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2349,7 +2369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2410,7 +2431,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2461,7 +2483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2508,7 +2531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2557,7 +2581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2617,7 +2642,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2677,7 +2703,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2735,7 +2762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2784,7 +2812,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2837,7 +2866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2884,7 +2914,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2931,7 +2962,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2980,7 +3012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3039,7 +3072,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3095,7 +3129,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3142,7 +3177,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3189,7 +3225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3238,7 +3275,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3297,7 +3335,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3354,7 +3393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3404,7 +3444,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3451,7 +3492,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3500,7 +3542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3559,7 +3602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3613,7 +3657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3662,7 +3707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3711,7 +3757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3772,7 +3819,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3823,7 +3871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3870,7 +3919,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3919,7 +3969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3979,7 +4030,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4039,7 +4091,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4100,7 +4153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4150,7 +4204,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4197,7 +4252,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4246,7 +4302,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4305,7 +4362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4359,7 +4417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4408,7 +4467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4457,7 +4517,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4513,7 +4574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4570,7 +4632,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4685,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4678,7 +4742,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4725,7 +4790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4772,7 +4838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4821,7 +4888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4880,7 +4948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4937,7 +5006,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4987,7 +5057,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5034,7 +5105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5083,7 +5155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5142,7 +5215,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5196,7 +5270,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5245,7 +5320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5294,7 +5370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5355,7 +5432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5406,7 +5484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5453,7 +5532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5502,7 +5582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5562,7 +5643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5622,7 +5704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5682,7 +5765,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5729,7 +5813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5776,7 +5861,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5825,7 +5911,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5884,7 +5971,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5941,7 +6029,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5991,7 +6080,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6038,7 +6128,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6087,7 +6178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6146,7 +6238,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6200,7 +6293,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6249,7 +6343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6298,7 +6393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6358,7 +6454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6405,7 +6502,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6452,7 +6550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6501,7 +6600,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6559,7 +6659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6613,7 +6714,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6664,7 +6766,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6711,7 +6814,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6760,7 +6864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6820,7 +6925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6880,7 +6986,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6941,7 +7048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6992,7 +7100,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7039,7 +7148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7088,7 +7198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7148,7 +7259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7204,7 +7316,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7256,7 +7369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/managedidentities/v1_test.dart b/generated/googleapis/test/managedidentities/v1_test.dart
index 2d64ca8..f194835 100644
--- a/generated/googleapis/test/managedidentities/v1_test.dart
+++ b/generated/googleapis/test/managedidentities/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/managedidentities/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1749,7 +1757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1800,7 +1809,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1866,7 +1876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1919,7 +1930,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1970,7 +1982,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2022,7 +2035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2070,7 +2084,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2119,7 +2134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2177,7 +2193,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2242,7 +2259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2297,7 +2315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2349,7 +2368,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2401,7 +2421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2453,7 +2474,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2505,7 +2527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2559,7 +2582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2607,7 +2631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2655,7 +2680,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2706,7 +2732,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/manufacturers/v1_test.dart b/generated/googleapis/test/manufacturers/v1_test.dart
index cc9d4e1..a5023f4 100644
--- a/generated/googleapis/test/manufacturers/v1_test.dart
+++ b/generated/googleapis/test/manufacturers/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/manufacturers/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -712,7 +720,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -761,7 +770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -812,7 +822,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -873,7 +884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index 5bb8ff6..6e044d4 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/ml/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3689,7 +3697,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3736,7 +3745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3787,7 +3797,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3840,7 +3851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3891,7 +3903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3938,7 +3951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3986,7 +4000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4042,7 +4057,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4103,7 +4119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4157,7 +4174,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4208,7 +4226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4258,7 +4277,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4307,7 +4327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4364,7 +4385,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4411,7 +4433,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4465,7 +4488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4515,7 +4539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4562,7 +4587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4609,7 +4635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4663,7 +4690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4717,7 +4745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4768,7 +4797,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4819,7 +4849,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4866,7 +4897,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4913,7 +4945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4960,7 +4993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5012,7 +5046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5063,7 +5098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5116,7 +5152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5163,7 +5200,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5210,7 +5248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5258,7 +5297,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5314,7 +5354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5376,7 +5417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5430,7 +5472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5481,7 +5524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5535,7 +5579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5582,7 +5627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5629,7 +5675,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5679,7 +5726,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5741,7 +5789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5795,7 +5844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5844,7 +5894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5891,7 +5942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5941,7 +5993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/monitoring/v3_test.dart b/generated/googleapis/test/monitoring/v3_test.dart
index 07d78fa..2db7270 100644
--- a/generated/googleapis/test/monitoring/v3_test.dart
+++ b/generated/googleapis/test/monitoring/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/monitoring/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4102,7 +4110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4149,7 +4158,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4196,7 +4206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4247,7 +4258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4311,7 +4323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4367,7 +4380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4421,7 +4435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4472,7 +4487,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4521,7 +4537,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4573,7 +4590,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4641,7 +4659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4698,7 +4717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4766,7 +4786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4813,7 +4834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4860,7 +4882,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4910,7 +4933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4969,7 +4993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5019,7 +5044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5079,7 +5105,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5128,7 +5155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5189,7 +5217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5237,7 +5266,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5285,7 +5315,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5337,7 +5368,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5389,7 +5421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5453,7 +5486,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5508,7 +5542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5559,7 +5594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5612,7 +5648,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5670,7 +5707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5754,7 +5792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5807,7 +5846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5854,7 +5894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5901,7 +5942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5950,7 +5992,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6009,7 +6052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6066,7 +6110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6116,7 +6161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6163,7 +6209,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6213,7 +6260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6274,7 +6322,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6331,7 +6380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6382,7 +6432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6430,7 +6481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6482,7 +6534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6546,7 +6599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6598,7 +6652,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/networkmanagement/v1_test.dart b/generated/googleapis/test/networkmanagement/v1_test.dart
index 7d4b96c..0d3b969 100644
--- a/generated/googleapis/test/networkmanagement/v1_test.dart
+++ b/generated/googleapis/test/networkmanagement/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/networkmanagement/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1758,7 +1766,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1808,7 +1817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1876,7 +1886,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1929,7 +1940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1980,7 +1992,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2032,7 +2045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2093,7 +2107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2161,7 +2176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2219,7 +2235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2274,7 +2291,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2329,7 +2347,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2383,7 +2402,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2431,7 +2451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2479,7 +2500,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2530,7 +2552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/oauth2/v2_test.dart b/generated/googleapis/test/oauth2/v2_test.dart
index a772553..b3e71a4 100644
--- a/generated/googleapis/test/oauth2/v2_test.dart
+++ b/generated/googleapis/test/oauth2/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/oauth2/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -175,7 +183,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -229,7 +238,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -274,7 +284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/osconfig/v1_test.dart b/generated/googleapis/test/osconfig/v1_test.dart
index de2b92d..c47dd79 100644
--- a/generated/googleapis/test/osconfig/v1_test.dart
+++ b/generated/googleapis/test/osconfig/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/osconfig/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1347,7 +1355,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1397,7 +1406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1444,7 +1454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1493,7 +1504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1553,7 +1565,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1604,7 +1617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1651,7 +1665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1701,7 +1716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1762,7 +1778,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/oslogin/v1_test.dart b/generated/googleapis/test/oslogin/v1_test.dart
index ab9a302..bc419b1 100644
--- a/generated/googleapis/test/oslogin/v1_test.dart
+++ b/generated/googleapis/test/oslogin/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/oslogin/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -280,7 +288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -339,7 +348,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -391,7 +401,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -440,7 +451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -487,7 +499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -539,7 +552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/pagespeedonline/v5_test.dart b/generated/googleapis/test/pagespeedonline/v5_test.dart
index 1d8c1f7..1db6036 100644
--- a/generated/googleapis/test/pagespeedonline/v5_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v5_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/pagespeedonline/v5.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -934,7 +942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/people/v1_test.dart b/generated/googleapis/test/people/v1_test.dart
index 623e8e7..55907de 100644
--- a/generated/googleapis/test/people/v1_test.dart
+++ b/generated/googleapis/test/people/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/people/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3059,7 +3067,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3115,7 +3124,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3163,7 +3173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3214,7 +3225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3265,7 +3277,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3326,7 +3339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3379,7 +3393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3433,7 +3448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3484,7 +3500,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3553,7 +3570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3606,7 +3624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3655,7 +3674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3711,7 +3731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3769,7 +3790,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3833,7 +3855,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3905,7 +3928,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3976,7 +4000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4036,7 +4061,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4094,7 +4120,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/playcustomapp/v1_test.dart b/generated/googleapis/test/playcustomapp/v1_test.dart
index 53d5365..525188b 100644
--- a/generated/googleapis/test/playcustomapp/v1_test.dart
+++ b/generated/googleapis/test/playcustomapp/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/playcustomapp/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -135,7 +143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/policytroubleshooter/v1_test.dart b/generated/googleapis/test/policytroubleshooter/v1_test.dart
index 395b9fb..6fb61dc 100644
--- a/generated/googleapis/test/policytroubleshooter/v1_test.dart
+++ b/generated/googleapis/test/policytroubleshooter/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/policytroubleshooter/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -603,7 +611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/poly/v1_test.dart b/generated/googleapis/test/poly/v1_test.dart
index c3b8239..21671e3 100644
--- a/generated/googleapis/test/poly/v1_test.dart
+++ b/generated/googleapis/test/poly/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/poly/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -669,7 +677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -722,7 +731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -800,7 +810,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -868,7 +879,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/pubsub/v1_test.dart b/generated/googleapis/test/pubsub/v1_test.dart
index 556e3fa..6a43699 100644
--- a/generated/googleapis/test/pubsub/v1_test.dart
+++ b/generated/googleapis/test/pubsub/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/pubsub/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1451,7 +1459,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1498,7 +1507,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1545,7 +1555,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1593,7 +1604,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1648,7 +1660,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1706,7 +1719,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1757,7 +1771,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1808,7 +1823,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1861,7 +1877,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1912,7 +1929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1959,7 +1977,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2006,7 +2025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2053,7 +2073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2101,7 +2122,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2156,7 +2178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2214,7 +2237,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2266,7 +2290,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2317,7 +2342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2368,7 +2394,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2419,7 +2446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2470,7 +2498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2521,7 +2550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2574,7 +2604,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2621,7 +2652,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2668,7 +2700,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2716,7 +2749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2771,7 +2805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2829,7 +2864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2880,7 +2916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2931,7 +2968,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2982,7 +3020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3033,7 +3072,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3091,7 +3131,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/recommender/v1_test.dart b/generated/googleapis/test/recommender/v1_test.dart
index cbbe733..59d5027 100644
--- a/generated/googleapis/test/recommender/v1_test.dart
+++ b/generated/googleapis/test/recommender/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/recommender/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1016,7 +1024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1067,7 +1076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1132,7 +1142,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1186,7 +1197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1241,7 +1253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1308,7 +1321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1366,7 +1380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1424,7 +1439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/redis/v1_test.dart b/generated/googleapis/test/redis/v1_test.dart
index bfa7401..84e9591 100644
--- a/generated/googleapis/test/redis/v1_test.dart
+++ b/generated/googleapis/test/redis/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/redis/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -908,7 +916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -958,7 +967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1021,7 +1031,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1071,7 +1082,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1122,7 +1134,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1173,7 +1186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1220,7 +1234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1271,7 +1286,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1320,7 +1336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1379,7 +1396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1433,7 +1451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1482,7 +1501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1529,7 +1549,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1576,7 +1597,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1626,7 +1648,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/remotebuildexecution/v2_test.dart b/generated/googleapis/test/remotebuildexecution/v2_test.dart
index c8bccbc..966da60 100644
--- a/generated/googleapis/test/remotebuildexecution/v2_test.dart
+++ b/generated/googleapis/test/remotebuildexecution/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/remotebuildexecution/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3986,7 +3994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4051,7 +4060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4110,7 +4120,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4164,7 +4175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4219,7 +4231,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4274,7 +4287,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4326,7 +4340,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4388,7 +4403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4437,7 +4453,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 8cb3201..9e612f9 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/reseller/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -586,7 +594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -639,7 +648,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -698,7 +708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -754,7 +765,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -804,7 +816,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -854,7 +867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -907,7 +921,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -981,7 +996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1053,7 +1069,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1126,7 +1143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1200,7 +1218,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1264,7 +1283,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1327,7 +1347,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1390,7 +1411,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1446,7 +1468,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1530,7 +1553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1599,7 +1623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/run/v1_test.dart b/generated/googleapis/test/run/v1_test.dart
index 3de78b1..42ed079 100644
--- a/generated/googleapis/test/run/v1_test.dart
+++ b/generated/googleapis/test/run/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/run/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2892,7 +2900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2948,7 +2957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3002,7 +3012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3076,7 +3087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3126,7 +3138,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3182,7 +3195,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3236,7 +3250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3309,7 +3324,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3365,7 +3381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3419,7 +3436,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3489,7 +3507,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3543,7 +3562,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3617,7 +3637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3667,7 +3688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3723,7 +3745,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3777,7 +3800,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3849,7 +3873,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3900,7 +3925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3959,7 +3985,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4019,7 +4046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4075,7 +4103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4129,7 +4158,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4203,7 +4233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4253,7 +4284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4309,7 +4341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4363,7 +4396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4436,7 +4470,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4492,7 +4527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4546,7 +4582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4616,7 +4653,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4670,7 +4708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4744,7 +4783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4794,7 +4834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4850,7 +4891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4898,7 +4940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4958,7 +5001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5030,7 +5074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5081,7 +5126,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5132,7 +5178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/runtimeconfig/v1_test.dart b/generated/googleapis/test/runtimeconfig/v1_test.dart
index facea6f..4ee6df4 100644
--- a/generated/googleapis/test/runtimeconfig/v1_test.dart
+++ b/generated/googleapis/test/runtimeconfig/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/runtimeconfig/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -347,7 +355,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -394,7 +403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -444,7 +454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/safebrowsing/v4_test.dart b/generated/googleapis/test/safebrowsing/v4_test.dart
index c3cfd3b..6f26b4d 100644
--- a/generated/googleapis/test/safebrowsing/v4_test.dart
+++ b/generated/googleapis/test/safebrowsing/v4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/safebrowsing/v4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1109,7 +1117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1169,7 +1178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1227,7 +1237,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1278,7 +1289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1329,7 +1341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1376,7 +1389,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1425,7 +1439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/script/v1_test.dart b/generated/googleapis/test/script/v1_test.dart
index fb62049..8937229 100644
--- a/generated/googleapis/test/script/v1_test.dart
+++ b/generated/googleapis/test/script/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/script/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1597,7 +1605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1689,7 +1698,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1774,7 +1784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1823,7 +1834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1879,7 +1891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1939,7 +1952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2005,7 +2019,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2066,7 +2081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2125,7 +2141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2184,7 +2201,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2241,7 +2259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2311,7 +2330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2373,7 +2393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2432,7 +2453,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2489,7 +2511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2557,7 +2580,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/searchconsole/v1_test.dart b/generated/googleapis/test/searchconsole/v1_test.dart
index b9fb1d8..00bca6f 100644
--- a/generated/googleapis/test/searchconsole/v1_test.dart
+++ b/generated/googleapis/test/searchconsole/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/searchconsole/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -756,7 +764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -817,7 +826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -874,7 +884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -930,7 +941,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -992,7 +1004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1041,7 +1054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1088,7 +1102,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1135,7 +1150,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1180,7 +1196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1229,7 +1246,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/secretmanager/v1_test.dart b/generated/googleapis/test/secretmanager/v1_test.dart
index ec39c37..f140aa1 100644
--- a/generated/googleapis/test/secretmanager/v1_test.dart
+++ b/generated/googleapis/test/secretmanager/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/secretmanager/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1188,7 +1196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1238,7 +1247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1300,7 +1310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1352,7 +1363,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1402,7 +1414,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1449,7 +1462,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1497,7 +1511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1552,7 +1567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1611,7 +1627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1665,7 +1682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1716,7 +1734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1765,7 +1784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1816,7 +1836,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1867,7 +1888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1918,7 +1940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1965,7 +1988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2014,7 +2038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/securitycenter/v1_test.dart b/generated/googleapis/test/securitycenter/v1_test.dart
index 8565cc7..af407fd 100644
--- a/generated/googleapis/test/securitycenter/v1_test.dart
+++ b/generated/googleapis/test/securitycenter/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/securitycenter/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2062,7 +2070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2114,7 +2123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2170,7 +2180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2224,7 +2235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2296,7 +2308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2349,7 +2362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2410,7 +2424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2460,7 +2475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2507,7 +2523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2556,7 +2573,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2615,7 +2633,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2667,7 +2686,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2714,7 +2734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2761,7 +2782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2811,7 +2833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2873,7 +2896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2920,7 +2944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2971,7 +2996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3020,7 +3046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3079,7 +3106,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3133,7 +3161,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3184,7 +3213,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3238,7 +3268,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3292,7 +3323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3346,7 +3378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3419,7 +3452,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3473,7 +3507,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3526,7 +3561,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
index cdaaa83..d139a97 100644
--- a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
+++ b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/serviceconsumermanagement/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4062,7 +4070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4109,7 +4118,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4156,7 +4166,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4206,7 +4217,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4267,7 +4279,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4329,7 +4342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4380,7 +4394,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4431,7 +4446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4482,7 +4498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4529,7 +4546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4580,7 +4598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4630,7 +4649,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4690,7 +4710,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4741,7 +4762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/servicecontrol/v1_test.dart b/generated/googleapis/test/servicecontrol/v1_test.dart
index 4e62666..3c1bcbb 100644
--- a/generated/googleapis/test/servicecontrol/v1_test.dart
+++ b/generated/googleapis/test/servicecontrol/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/servicecontrol/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2639,7 +2647,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2698,7 +2707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2757,7 +2767,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/servicemanagement/v1_test.dart b/generated/googleapis/test/servicemanagement/v1_test.dart
index b44a44c..c409381 100644
--- a/generated/googleapis/test/servicemanagement/v1_test.dart
+++ b/generated/googleapis/test/servicemanagement/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/servicemanagement/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4136,7 +4144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4185,7 +4194,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4247,7 +4257,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4296,7 +4307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4355,7 +4367,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4404,7 +4417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4453,7 +4467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4510,7 +4525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4565,7 +4581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4614,7 +4631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4678,7 +4696,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4729,7 +4748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4784,7 +4804,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4845,7 +4866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4905,7 +4927,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4964,7 +4987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5030,7 +5054,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5083,7 +5108,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5134,7 +5160,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5185,7 +5212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5246,7 +5274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5305,7 +5334,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5363,7 +5393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/servicenetworking/v1_test.dart b/generated/googleapis/test/servicenetworking/v1_test.dart
index f2f02fe..ca7633b 100644
--- a/generated/googleapis/test/servicenetworking/v1_test.dart
+++ b/generated/googleapis/test/servicenetworking/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/servicenetworking/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4008,7 +4016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4055,7 +4064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4102,7 +4112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4152,7 +4163,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4214,7 +4226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4265,7 +4278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4317,7 +4331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4369,7 +4384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4420,7 +4436,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4473,7 +4490,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4521,7 +4539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4576,7 +4595,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4635,7 +4655,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4686,7 +4707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4737,7 +4759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4790,7 +4813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4841,7 +4865,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4900,7 +4925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4952,7 +4978,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5004,7 +5031,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5057,7 +5085,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/serviceusage/v1_test.dart b/generated/googleapis/test/serviceusage/v1_test.dart
index 059dc25..ab99ee2 100644
--- a/generated/googleapis/test/serviceusage/v1_test.dart
+++ b/generated/googleapis/test/serviceusage/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/serviceusage/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3808,7 +3816,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3855,7 +3864,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3902,7 +3912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3951,7 +3962,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4015,7 +4027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4063,7 +4076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4115,7 +4129,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4166,7 +4181,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4213,7 +4229,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4263,7 +4280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/sheets/v4_test.dart b/generated/googleapis/test/sheets/v4_test.dart
index 695e29c..eb54bc0 100644
--- a/generated/googleapis/test/sheets/v4_test.dart
+++ b/generated/googleapis/test/sheets/v4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/sheets/v4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -9180,7 +9188,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9229,7 +9238,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9280,7 +9290,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9345,7 +9356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9406,7 +9418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9465,7 +9478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9536,7 +9550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9613,7 +9628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9688,7 +9704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9747,7 +9764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9808,7 +9826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9879,7 +9898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9940,7 +9960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9999,7 +10020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10070,7 +10092,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10133,7 +10156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10210,7 +10234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index 2db36d0..2942a85 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/siteverification/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -310,7 +318,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -360,7 +369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -413,7 +423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -467,7 +478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -518,7 +530,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -573,7 +586,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -630,7 +644,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/slides/v1_test.dart b/generated/googleapis/test/slides/v1_test.dart
index 4836e72..095e902 100644
--- a/generated/googleapis/test/slides/v1_test.dart
+++ b/generated/googleapis/test/slides/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/slides/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4698,7 +4706,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4747,7 +4756,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4794,7 +4804,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4855,7 +4866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4922,7 +4934,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/sourcerepo/v1_test.dart b/generated/googleapis/test/sourcerepo/v1_test.dart
index 5849deb..7162a2d 100644
--- a/generated/googleapis/test/sourcerepo/v1_test.dart
+++ b/generated/googleapis/test/sourcerepo/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/sourcerepo/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -917,7 +925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -968,7 +977,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1021,7 +1031,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1068,7 +1079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1115,7 +1127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1163,7 +1176,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1218,7 +1232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1276,7 +1291,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1327,7 +1343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1378,7 +1395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1429,7 +1447,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/spanner/v1_test.dart b/generated/googleapis/test/spanner/v1_test.dart
index 8ac503e..c5a79cb 100644
--- a/generated/googleapis/test/spanner/v1_test.dart
+++ b/generated/googleapis/test/spanner/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/spanner/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3602,7 +3610,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3651,7 +3660,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3711,7 +3721,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3758,7 +3769,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3806,7 +3818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3859,7 +3872,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3909,7 +3923,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3969,7 +3984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4020,7 +4036,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4071,7 +4088,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4123,7 +4141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4186,7 +4205,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4236,7 +4256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4283,7 +4304,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4334,7 +4356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4384,7 +4407,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4445,7 +4469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4499,7 +4524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4550,7 +4576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4599,7 +4626,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4646,7 +4674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4693,7 +4722,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4743,7 +4773,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4804,7 +4835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4866,7 +4898,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4913,7 +4946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4960,7 +4994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5007,7 +5042,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5058,7 +5094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5107,7 +5144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5165,7 +5203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5216,7 +5255,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5267,7 +5307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5318,7 +5359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5368,7 +5410,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5415,7 +5458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5462,7 +5506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5512,7 +5557,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5574,7 +5620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5625,7 +5672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5676,7 +5724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5727,7 +5776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5774,7 +5824,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5825,7 +5876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5876,7 +5928,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5927,7 +5980,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5974,7 +6028,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6024,7 +6079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6084,7 +6140,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6135,7 +6192,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6186,7 +6244,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6237,7 +6296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6288,7 +6348,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6337,7 +6398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6384,7 +6446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6431,7 +6494,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6481,7 +6545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/speech/v1_test.dart b/generated/googleapis/test/speech/v1_test.dart
index d52984f..9e56ddb 100644
--- a/generated/googleapis/test/speech/v1_test.dart
+++ b/generated/googleapis/test/speech/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/speech/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -796,7 +804,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -845,7 +854,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -905,7 +915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -955,7 +966,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1015,7 +1027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1064,7 +1077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 618ad77..803dd29 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/storage/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1959,7 +1967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2028,7 +2037,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2099,7 +2109,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2166,7 +2177,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2241,7 +2253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2316,7 +2329,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2381,7 +2395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2449,7 +2464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2526,7 +2542,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2595,7 +2612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2668,7 +2686,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2749,7 +2768,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2821,7 +2841,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2907,7 +2928,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2975,7 +2997,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3047,7 +3070,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3123,7 +3147,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3187,7 +3212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3256,7 +3282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3327,7 +3354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3396,7 +3424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3477,7 +3506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3552,7 +3582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3625,7 +3656,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3694,7 +3726,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3765,7 +3798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3832,7 +3866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3916,7 +3951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3999,7 +4035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4084,7 +4121,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4165,7 +4203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4254,7 +4293,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4343,7 +4383,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4433,7 +4474,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4552,7 +4594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4666,7 +4709,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4759,7 +4803,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4855,7 +4900,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4941,7 +4987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5043,7 +5090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5151,7 +5199,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5281,7 +5330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5407,7 +5457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5489,7 +5540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5576,7 +5628,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5677,7 +5730,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5772,7 +5826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5840,7 +5895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5904,7 +5960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5970,7 +6027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6053,7 +6111,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6118,7 +6177,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/storagetransfer/v1_test.dart b/generated/googleapis/test/storagetransfer/v1_test.dart
index 802784c..cf99626 100644
--- a/generated/googleapis/test/storagetransfer/v1_test.dart
+++ b/generated/googleapis/test/storagetransfer/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/storagetransfer/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1181,7 +1189,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1232,7 +1241,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1280,7 +1290,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1330,7 +1341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1390,7 +1402,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1443,7 +1456,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1490,7 +1504,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1540,7 +1555,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1600,7 +1616,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1651,7 +1668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/streetviewpublish/v1_test.dart b/generated/googleapis/test/streetviewpublish/v1_test.dart
index e799bb2..cadf8d0 100644
--- a/generated/googleapis/test/streetviewpublish/v1_test.dart
+++ b/generated/googleapis/test/streetviewpublish/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/streetviewpublish/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -877,7 +885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -926,7 +935,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -977,7 +987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1032,7 +1043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1086,7 +1098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1140,7 +1153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1188,7 +1202,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1245,7 +1260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1295,7 +1311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
index 6857cf8..96b3177 100644
--- a/generated/googleapis/test/tagmanager/v1_test.dart
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/tagmanager/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1861,7 +1869,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1906,7 +1915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1958,7 +1968,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2022,7 +2033,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2081,7 +2093,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2138,7 +2151,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2193,7 +2207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2257,7 +2272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2331,7 +2347,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2401,7 +2418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2469,7 +2487,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2535,7 +2554,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2609,7 +2629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2684,7 +2705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2754,7 +2776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2822,7 +2845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2888,7 +2912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2962,7 +2987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3042,7 +3068,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3121,7 +3148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3204,7 +3232,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3277,7 +3306,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3347,7 +3377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3415,7 +3446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3480,7 +3512,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3554,7 +3587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3628,7 +3662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3698,7 +3733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3766,7 +3802,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3832,7 +3869,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3906,7 +3944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3980,7 +4019,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4050,7 +4090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4118,7 +4159,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4184,7 +4226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4258,7 +4301,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4333,7 +4377,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4403,7 +4448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4471,7 +4517,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4539,7 +4586,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4670,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4700,7 +4749,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4776,7 +4826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4851,7 +4902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4916,7 +4968,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4975,7 +5028,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5032,7 +5086,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5087,7 +5142,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5150,7 +5206,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/tagmanager/v2_test.dart b/generated/googleapis/test/tagmanager/v2_test.dart
index 642b081..276c875 100644
--- a/generated/googleapis/test/tagmanager/v2_test.dart
+++ b/generated/googleapis/test/tagmanager/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/tagmanager/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2858,7 +2866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2904,7 +2913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2958,7 +2968,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3014,7 +3025,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3061,7 +3073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3106,7 +3119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3154,7 +3168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3208,7 +3223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3264,7 +3280,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3311,7 +3328,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3356,7 +3374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3404,7 +3423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3457,7 +3477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3509,7 +3530,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3561,7 +3583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3610,7 +3633,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3666,7 +3690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3712,7 +3737,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3762,7 +3788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3810,7 +3837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3859,7 +3887,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3906,7 +3935,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3958,7 +3988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4014,7 +4045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4066,7 +4098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4113,7 +4146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4158,7 +4192,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4205,7 +4240,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4253,7 +4289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4302,7 +4339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4354,7 +4392,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4402,7 +4441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4454,7 +4494,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4512,7 +4553,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4565,7 +4607,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4616,7 +4659,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4671,7 +4715,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4725,7 +4770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4772,7 +4818,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4818,7 +4865,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4867,7 +4915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4915,7 +4964,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4971,7 +5021,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5025,7 +5076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5079,7 +5131,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5135,7 +5188,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5182,7 +5236,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5227,7 +5282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5275,7 +5331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5325,7 +5382,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5379,7 +5437,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5437,7 +5496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5485,7 +5545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5531,7 +5592,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5580,7 +5642,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5631,7 +5694,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5686,7 +5750,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5743,7 +5808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5790,7 +5856,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5835,7 +5902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5883,7 +5951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5933,7 +6002,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5987,7 +6057,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6045,7 +6116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6093,7 +6165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6139,7 +6212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6188,7 +6262,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6239,7 +6314,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6294,7 +6370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6350,7 +6427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6397,7 +6475,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6442,7 +6521,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6490,7 +6570,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6540,7 +6621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6594,7 +6676,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6650,7 +6733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6697,7 +6781,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6742,7 +6827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6790,7 +6876,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6843,7 +6930,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index 5098368..dd66238 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/tasks/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -319,7 +327,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -366,7 +375,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -415,7 +425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -462,7 +473,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -522,7 +534,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -575,7 +588,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -632,7 +646,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -689,7 +704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -746,7 +762,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -807,7 +824,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -876,7 +894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -972,7 +991,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1039,7 +1059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1102,7 +1123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/testing/v1_test.dart b/generated/googleapis/test/testing/v1_test.dart
index 15182fe..e93aef5 100644
--- a/generated/googleapis/test/testing/v1_test.dart
+++ b/generated/googleapis/test/testing/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/testing/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2980,7 +2988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3047,7 +3056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3107,7 +3117,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3169,7 +3180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3221,7 +3233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/texttospeech/v1_test.dart b/generated/googleapis/test/texttospeech/v1_test.dart
index 136219e..40536fc 100644
--- a/generated/googleapis/test/texttospeech/v1_test.dart
+++ b/generated/googleapis/test/texttospeech/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/texttospeech/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -345,7 +353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -393,7 +402,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/tpu/v1_test.dart b/generated/googleapis/test/tpu/v1_test.dart
index c473b5f..5119937 100644
--- a/generated/googleapis/test/tpu/v1_test.dart
+++ b/generated/googleapis/test/tpu/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/tpu/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -971,7 +979,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1021,7 +1030,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1079,7 +1089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1130,7 +1141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1196,7 +1208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1245,7 +1258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1292,7 +1306,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1341,7 +1356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1399,7 +1415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1450,7 +1467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1501,7 +1519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1550,7 +1569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1597,7 +1617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1644,7 +1665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1694,7 +1716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1752,7 +1775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1803,7 +1827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/translate/v3_test.dart b/generated/googleapis/test/translate/v3_test.dart
index b0015e6..3de1be0 100644
--- a/generated/googleapis/test/translate/v3_test.dart
+++ b/generated/googleapis/test/translate/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/translate/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1255,7 +1263,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1304,7 +1313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1361,7 +1371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1414,7 +1425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1465,7 +1477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1512,7 +1525,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1561,7 +1575,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1617,7 +1632,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1677,7 +1693,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1730,7 +1747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1777,7 +1795,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1824,7 +1843,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1874,7 +1894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1936,7 +1957,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1983,7 +2005,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2030,7 +2053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2080,7 +2104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2140,7 +2165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/vault/v1_test.dart b/generated/googleapis/test/vault/v1_test.dart
index 3227e4d..7394778 100644
--- a/generated/googleapis/test/vault/v1_test.dart
+++ b/generated/googleapis/test/vault/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/vault/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1821,7 +1829,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1880,7 +1889,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1929,7 +1939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1978,7 +1989,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2028,7 +2040,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2078,7 +2091,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2148,7 +2162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2207,7 +2222,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2266,7 +2282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2319,7 +2336,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2380,7 +2398,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2439,7 +2458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2498,7 +2518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2555,7 +2576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2633,7 +2655,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2693,7 +2716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2752,7 +2776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2812,7 +2837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2871,7 +2897,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2949,7 +2976,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3013,7 +3041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3084,7 +3113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3153,7 +3183,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3218,7 +3249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3279,7 +3311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3338,7 +3371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3397,7 +3431,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3454,7 +3489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3510,7 +3546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/verifiedaccess/v1_test.dart b/generated/googleapis/test/verifiedaccess/v1_test.dart
index 2e2ba6b..e53552b 100644
--- a/generated/googleapis/test/verifiedaccess/v1_test.dart
+++ b/generated/googleapis/test/verifiedaccess/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/verifiedaccess/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -234,7 +242,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -283,7 +292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/videointelligence/v1_test.dart b/generated/googleapis/test/videointelligence/v1_test.dart
index 5431f87..89ea078 100644
--- a/generated/googleapis/test/videointelligence/v1_test.dart
+++ b/generated/googleapis/test/videointelligence/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/videointelligence/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -8489,7 +8497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8540,7 +8549,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8591,7 +8601,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8641,7 +8652,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8691,7 +8703,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8744,7 +8757,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8791,7 +8805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8838,7 +8853,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8888,7 +8904,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8952,7 +8969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/vision/v1_test.dart b/generated/googleapis/test/vision/v1_test.dart
index 9e8c79f..3c13bf2 100644
--- a/generated/googleapis/test/vision/v1_test.dart
+++ b/generated/googleapis/test/vision/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/vision/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -12469,7 +12477,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12518,7 +12527,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12569,7 +12579,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12618,7 +12629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12667,7 +12679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12720,7 +12733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12767,7 +12781,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12814,7 +12829,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12864,7 +12880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12926,7 +12943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12977,7 +12995,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13030,7 +13049,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13081,7 +13101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13134,7 +13155,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13185,7 +13207,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13238,7 +13261,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13289,7 +13313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13338,7 +13363,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13391,7 +13417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13443,7 +13470,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13493,7 +13521,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13540,7 +13569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13591,7 +13621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13640,7 +13671,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13699,7 +13731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13753,7 +13786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13805,7 +13839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13866,7 +13901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13916,7 +13952,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13963,7 +14000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14012,7 +14050,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14071,7 +14110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14125,7 +14165,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14180,7 +14221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14230,7 +14272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14277,7 +14320,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14326,7 +14370,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14382,7 +14427,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 6b43bb5..71cc888 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/webfonts/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -210,7 +218,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index 166e746..c8ad0ce 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/webmasters/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -532,7 +540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -596,7 +605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -656,7 +666,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -715,7 +726,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -780,7 +792,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -832,7 +845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -882,7 +896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -932,7 +947,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -980,7 +996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/websecurityscanner/v1_test.dart b/generated/googleapis/test/websecurityscanner/v1_test.dart
index ee4ae23..198db36 100644
--- a/generated/googleapis/test/websecurityscanner/v1_test.dart
+++ b/generated/googleapis/test/websecurityscanner/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/websecurityscanner/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1170,7 +1178,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1217,7 +1226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1264,7 +1274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1313,7 +1324,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1372,7 +1384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1426,7 +1439,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1475,7 +1489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1524,7 +1539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1582,7 +1598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1638,7 +1655,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1699,7 +1717,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1752,7 +1771,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1806,7 +1826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index e435c89..1bc9116 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/youtube/v3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -8417,7 +8425,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8474,7 +8483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8548,7 +8558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8610,7 +8621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8675,7 +8687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8735,7 +8748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8803,7 +8817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8870,7 +8885,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8929,7 +8945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8984,7 +9001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9043,7 +9061,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9108,7 +9127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9171,7 +9191,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9251,7 +9272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9308,7 +9330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9365,7 +9388,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9445,7 +9469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9494,7 +9519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9543,7 +9569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9595,7 +9622,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9657,7 +9685,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9704,7 +9733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9758,7 +9788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9808,7 +9839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9859,7 +9891,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9913,7 +9946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9977,7 +10011,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10043,7 +10078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10101,7 +10137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10163,7 +10200,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10237,7 +10275,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10300,7 +10339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10356,7 +10396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10405,7 +10446,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10454,7 +10496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10503,7 +10546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10555,7 +10599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10618,7 +10663,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10667,7 +10713,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10717,7 +10764,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10777,7 +10825,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10835,7 +10884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10895,7 +10945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10965,7 +11016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11026,7 +11078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11090,7 +11143,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11140,7 +11194,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11194,7 +11249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11251,7 +11307,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11321,7 +11378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11375,7 +11433,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11430,7 +11489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11492,7 +11552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11566,7 +11627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11649,7 +11711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11789,7 +11852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11847,7 +11911,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11896,7 +11961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11954,7 +12020,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12037,7 +12104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12099,7 +12167,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12150,7 +12219,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12203,7 +12273,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12252,7 +12323,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12309,7 +12381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12362,7 +12435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12417,7 +12491,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12471,7 +12546,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12529,7 +12605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12579,7 +12656,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12642,7 +12720,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12717,7 +12796,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12798,7 +12878,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12848,7 +12929,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12901,7 +12983,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12962,7 +13045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13013,7 +13097,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/youtubeanalytics/v2_test.dart b/generated/googleapis/test/youtubeanalytics/v2_test.dart
index 3dbc4ee..1fee8c4 100644
--- a/generated/googleapis/test/youtubeanalytics/v2_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/youtubeanalytics/v2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -586,7 +594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -642,7 +651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -693,7 +703,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -749,7 +760,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -805,7 +817,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -858,7 +871,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -919,7 +933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -981,7 +996,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis/test/youtubereporting/v1_test.dart b/generated/googleapis/test/youtubereporting/v1_test.dart
index c8c8fc2..dec1cb8 100644
--- a/generated/googleapis/test/youtubereporting/v1_test.dart
+++ b/generated/googleapis/test/youtubereporting/v1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis/youtubereporting/v1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -776,7 +784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -830,7 +839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -884,7 +894,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -937,7 +948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1012,7 +1024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1077,7 +1090,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1148,7 +1162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1199,7 +1214,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart b/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
index 9c4e47e..4d8446f 100644
--- a/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
+++ b/generated/googleapis_beta/lib/adexchangebuyer2/v2beta1.dart
@@ -8791,7 +8791,7 @@
       priceDisplayText = _json['priceDisplayText'] as core.String;
     }
     if (_json.containsKey('starRating')) {
-      starRating = _json['starRating'].toDouble();
+      starRating = (_json['starRating'] as core.num).toDouble();
     }
     if (_json.containsKey('storeUrl')) {
       storeUrl = _json['storeUrl'] as core.String;
diff --git a/generated/googleapis_beta/lib/appengine/v1beta.dart b/generated/googleapis_beta/lib/appengine/v1beta.dart
index 8dac1f9..bcfe55b 100644
--- a/generated/googleapis_beta/lib/appengine/v1beta.dart
+++ b/generated/googleapis_beta/lib/appengine/v1beta.dart
@@ -3565,7 +3565,7 @@
       aggregationWindowLength = _json['aggregationWindowLength'] as core.String;
     }
     if (_json.containsKey('targetUtilization')) {
-      targetUtilization = _json['targetUtilization'].toDouble();
+      targetUtilization = (_json['targetUtilization'] as core.num).toDouble();
     }
   }
 
@@ -3685,13 +3685,14 @@
       metricName = _json['metricName'] as core.String;
     }
     if (_json.containsKey('singleInstanceAssignment')) {
-      singleInstanceAssignment = _json['singleInstanceAssignment'].toDouble();
+      singleInstanceAssignment =
+          (_json['singleInstanceAssignment'] as core.num).toDouble();
     }
     if (_json.containsKey('targetType')) {
       targetType = _json['targetType'] as core.String;
     }
     if (_json.containsKey('targetUtilization')) {
-      targetUtilization = _json['targetUtilization'].toDouble();
+      targetUtilization = (_json['targetUtilization'] as core.num).toDouble();
     }
   }
 
@@ -4468,7 +4469,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('qps')) {
-      qps = _json['qps'].toDouble();
+      qps = (_json['qps'] as core.num).toDouble();
     }
     if (_json.containsKey('requests')) {
       requests = _json['requests'] as core.int;
@@ -5864,16 +5865,16 @@
 
   Resources.fromJson(core.Map _json) {
     if (_json.containsKey('cpu')) {
-      cpu = _json['cpu'].toDouble();
+      cpu = (_json['cpu'] as core.num).toDouble();
     }
     if (_json.containsKey('diskGb')) {
-      diskGb = _json['diskGb'].toDouble();
+      diskGb = (_json['diskGb'] as core.num).toDouble();
     }
     if (_json.containsKey('kmsKeyReference')) {
       kmsKeyReference = _json['kmsKeyReference'] as core.String;
     }
     if (_json.containsKey('memoryGb')) {
-      memoryGb = _json['memoryGb'].toDouble();
+      memoryGb = (_json['memoryGb'] as core.num).toDouble();
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
@@ -6069,11 +6070,12 @@
       minInstances = _json['minInstances'] as core.int;
     }
     if (_json.containsKey('targetCpuUtilization')) {
-      targetCpuUtilization = _json['targetCpuUtilization'].toDouble();
+      targetCpuUtilization =
+          (_json['targetCpuUtilization'] as core.num).toDouble();
     }
     if (_json.containsKey('targetThroughputUtilization')) {
       targetThroughputUtilization =
-          _json['targetThroughputUtilization'].toDouble();
+          (_json['targetThroughputUtilization'] as core.num).toDouble();
     }
   }
 
@@ -6277,7 +6279,7 @@
     if (_json.containsKey('allocations')) {
       allocations = commons.mapMap<core.num, core.double>(
           _json['allocations'].cast<core.String, core.num>(),
-          (core.num item) => item.toDouble());
+          (core.num item) => (item as core.num).toDouble());
     }
     if (_json.containsKey('shardBy')) {
       shardBy = _json['shardBy'] as core.String;
@@ -6923,7 +6925,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('sizeGb')) {
-      sizeGb = _json['sizeGb'].toDouble();
+      sizeGb = (_json['sizeGb'] as core.num).toDouble();
     }
     if (_json.containsKey('volumeType')) {
       volumeType = _json['volumeType'] as core.String;
diff --git a/generated/googleapis_beta/lib/billingbudgets/v1beta1.dart b/generated/googleapis_beta/lib/billingbudgets/v1beta1.dart
index b5122ad..00816d8 100644
--- a/generated/googleapis_beta/lib/billingbudgets/v1beta1.dart
+++ b/generated/googleapis_beta/lib/billingbudgets/v1beta1.dart
@@ -765,7 +765,7 @@
       spendBasis = _json['spendBasis'] as core.String;
     }
     if (_json.containsKey('thresholdPercent')) {
-      thresholdPercent = _json['thresholdPercent'].toDouble();
+      thresholdPercent = (_json['thresholdPercent'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart b/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
index c97c24e..cb86cd9 100644
--- a/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
+++ b/generated/googleapis_beta/lib/containeranalysis/v1beta1.dart
@@ -2311,16 +2311,17 @@
       availabilityImpact = _json['availabilityImpact'] as core.String;
     }
     if (_json.containsKey('baseScore')) {
-      baseScore = _json['baseScore'].toDouble();
+      baseScore = (_json['baseScore'] as core.num).toDouble();
     }
     if (_json.containsKey('confidentialityImpact')) {
       confidentialityImpact = _json['confidentialityImpact'] as core.String;
     }
     if (_json.containsKey('exploitabilityScore')) {
-      exploitabilityScore = _json['exploitabilityScore'].toDouble();
+      exploitabilityScore =
+          (_json['exploitabilityScore'] as core.num).toDouble();
     }
     if (_json.containsKey('impactScore')) {
-      impactScore = _json['impactScore'].toDouble();
+      impactScore = (_json['impactScore'] as core.num).toDouble();
     }
     if (_json.containsKey('integrityImpact')) {
       integrityImpact = _json['integrityImpact'] as core.String;
@@ -3701,7 +3702,7 @@
 
   GrafeasV1beta1VulnerabilityDetails.fromJson(core.Map _json) {
     if (_json.containsKey('cvssScore')) {
-      cvssScore = _json['cvssScore'].toDouble();
+      cvssScore = (_json['cvssScore'] as core.num).toDouble();
     }
     if (_json.containsKey('effectiveSeverity')) {
       effectiveSeverity = _json['effectiveSeverity'] as core.String;
@@ -5570,7 +5571,7 @@
 
   Vulnerability.fromJson(core.Map _json) {
     if (_json.containsKey('cvssScore')) {
-      cvssScore = _json['cvssScore'].toDouble();
+      cvssScore = (_json['cvssScore'] as core.num).toDouble();
     }
     if (_json.containsKey('cvssV3')) {
       cvssV3 = CVSSv3.fromJson(_json['cvssV3']);
diff --git a/generated/googleapis_beta/lib/datacatalog/v1beta1.dart b/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
index 3221d69..0b2ab0d 100644
--- a/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
+++ b/generated/googleapis_beta/lib/datacatalog/v1beta1.dart
@@ -5501,7 +5501,7 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('doubleValue')) {
-      doubleValue = _json['doubleValue'].toDouble();
+      doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('enumValue')) {
       enumValue = GoogleCloudDatacatalogV1beta1TagFieldEnumValue.fromJson(
diff --git a/generated/googleapis_beta/lib/dataflow/v1b3.dart b/generated/googleapis_beta/lib/dataflow/v1b3.dart
index 7df11d2..b50f54b 100644
--- a/generated/googleapis_beta/lib/dataflow/v1b3.dart
+++ b/generated/googleapis_beta/lib/dataflow/v1b3.dart
@@ -4006,7 +4006,7 @@
 
   ApproximateProgress.fromJson(core.Map _json) {
     if (_json.containsKey('percentComplete')) {
-      percentComplete = _json['percentComplete'].toDouble();
+      percentComplete = (_json['percentComplete'] as core.num).toDouble();
     }
     if (_json.containsKey('position')) {
       position = Position.fromJson(_json['position']);
@@ -4076,7 +4076,7 @@
           ReportedParallelism.fromJson(_json['consumedParallelism']);
     }
     if (_json.containsKey('fractionConsumed')) {
-      fractionConsumed = _json['fractionConsumed'].toDouble();
+      fractionConsumed = (_json['fractionConsumed'] as core.num).toDouble();
     }
     if (_json.containsKey('position')) {
       position = Position.fromJson(_json['position']);
@@ -4122,10 +4122,11 @@
 
   ApproximateSplitRequest.fromJson(core.Map _json) {
     if (_json.containsKey('fractionConsumed')) {
-      fractionConsumed = _json['fractionConsumed'].toDouble();
+      fractionConsumed = (_json['fractionConsumed'] as core.num).toDouble();
     }
     if (_json.containsKey('fractionOfRemainder')) {
-      fractionOfRemainder = _json['fractionOfRemainder'].toDouble();
+      fractionOfRemainder =
+          (_json['fractionOfRemainder'] as core.num).toDouble();
     }
     if (_json.containsKey('position')) {
       position = Position.fromJson(_json['position']);
@@ -4420,7 +4421,7 @@
 
   CPUTime.fromJson(core.Map _json) {
     if (_json.containsKey('rate')) {
-      rate = _json['rate'].toDouble();
+      rate = (_json['rate'] as core.num).toDouble();
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
@@ -4989,7 +4990,7 @@
       distribution = DistributionUpdate.fromJson(_json['distribution']);
     }
     if (_json.containsKey('floatingPoint')) {
-      floatingPoint = _json['floatingPoint'].toDouble();
+      floatingPoint = (_json['floatingPoint'] as core.num).toDouble();
     }
     if (_json.containsKey('floatingPointList')) {
       floatingPointList =
@@ -5421,7 +5422,7 @@
       durationValue = _json['durationValue'] as core.String;
     }
     if (_json.containsKey('floatValue')) {
-      floatValue = _json['floatValue'].toDouble();
+      floatValue = (_json['floatValue'] as core.num).toDouble();
     }
     if (_json.containsKey('int64Value')) {
       int64Value = _json['int64Value'] as core.String;
@@ -5534,7 +5535,7 @@
       sum = SplitInt64.fromJson(_json['sum']);
     }
     if (_json.containsKey('sumOfSquares')) {
-      sumOfSquares = _json['sumOfSquares'].toDouble();
+      sumOfSquares = (_json['sumOfSquares'] as core.num).toDouble();
     }
   }
 
@@ -6264,7 +6265,7 @@
   FloatingPointList.fromJson(core.Map _json) {
     if (_json.containsKey('elements')) {
       elements = (_json['elements'] as core.List)
-          .map<core.double>((value) => value.toDouble())
+          .map<core.double>((value) => (value as core.num).toDouble())
           .toList();
     }
   }
@@ -6293,7 +6294,7 @@
       count = SplitInt64.fromJson(_json['count']);
     }
     if (_json.containsKey('sum')) {
-      sum = _json['sum'].toDouble();
+      sum = (_json['sum'] as core.num).toDouble();
     }
   }
 
@@ -9031,7 +9032,7 @@
       time = _json['time'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -9130,7 +9131,7 @@
 
   ProgressTimeseries.fromJson(core.Map _json) {
     if (_json.containsKey('currentProgress')) {
-      currentProgress = _json['currentProgress'].toDouble();
+      currentProgress = (_json['currentProgress'] as core.num).toDouble();
     }
     if (_json.containsKey('dataPoints')) {
       dataPoints = (_json['dataPoints'] as core.List)
@@ -9485,7 +9486,7 @@
       isInfinite = _json['isInfinite'] as core.bool;
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -12873,7 +12874,7 @@
     }
     if (_json.containsKey('totalThrottlerWaitTimeSeconds')) {
       totalThrottlerWaitTimeSeconds =
-          _json['totalThrottlerWaitTimeSeconds'].toDouble();
+          (_json['totalThrottlerWaitTimeSeconds'] as core.num).toDouble();
     }
     if (_json.containsKey('workItemId')) {
       workItemId = _json['workItemId'] as core.String;
diff --git a/generated/googleapis_beta/lib/dialogflow/v2beta1.dart b/generated/googleapis_beta/lib/dialogflow/v2beta1.dart
index 0a0f1d1..6e961f7 100644
--- a/generated/googleapis_beta/lib/dialogflow/v2beta1.dart
+++ b/generated/googleapis_beta/lib/dialogflow/v2beta1.dart
@@ -12682,7 +12682,8 @@
       intent = GoogleCloudDialogflowV2Intent.fromJson(_json['intent']);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
-      intentDetectionConfidence = _json['intentDetectionConfidence'].toDouble();
+      intentDetectionConfidence =
+          (_json['intentDetectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -12708,7 +12709,7 @@
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
-          _json['speechRecognitionConfidence'].toDouble();
+          (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
@@ -12789,10 +12790,10 @@
 
   GoogleCloudDialogflowV2Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -13185,7 +13186,8 @@
       avatarUri = _json['avatarUri'] as core.String;
     }
     if (_json.containsKey('classificationThreshold')) {
-      classificationThreshold = _json['classificationThreshold'].toDouble();
+      classificationThreshold =
+          (_json['classificationThreshold'] as core.num).toDouble();
     }
     if (_json.containsKey('defaultLanguageCode')) {
       defaultLanguageCode = _json['defaultLanguageCode'] as core.String;
@@ -17546,7 +17548,7 @@
       faqQuestion = _json['faqQuestion'] as core.String;
     }
     if (_json.containsKey('matchConfidence')) {
-      matchConfidence = _json['matchConfidence'].toDouble();
+      matchConfidence = (_json['matchConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('matchConfidenceLevel')) {
       matchConfidenceLevel = _json['matchConfidenceLevel'] as core.String;
@@ -18376,7 +18378,8 @@
       intent = GoogleCloudDialogflowV2beta1Intent.fromJson(_json['intent']);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
-      intentDetectionConfidence = _json['intentDetectionConfidence'].toDouble();
+      intentDetectionConfidence =
+          (_json['intentDetectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('knowledgeAnswers')) {
       knowledgeAnswers = GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(
@@ -18406,7 +18409,7 @@
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
-          _json['speechRecognitionConfidence'].toDouble();
+          (_json['speechRecognitionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
@@ -18589,10 +18592,10 @@
 
   GoogleCloudDialogflowV2beta1Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
@@ -18861,7 +18864,7 @@
 
   GoogleCloudDialogflowV2beta1SpeechContext.fromJson(core.Map _json) {
     if (_json.containsKey('boost')) {
-      boost = _json['boost'].toDouble();
+      boost = (_json['boost'] as core.num).toDouble();
     }
     if (_json.containsKey('phrases')) {
       phrases = (_json['phrases'] as core.List)
@@ -18956,17 +18959,17 @@
           .toList();
     }
     if (_json.containsKey('pitch')) {
-      pitch = _json['pitch'].toDouble();
+      pitch = (_json['pitch'] as core.num).toDouble();
     }
     if (_json.containsKey('speakingRate')) {
-      speakingRate = _json['speakingRate'].toDouble();
+      speakingRate = (_json['speakingRate'] as core.num).toDouble();
     }
     if (_json.containsKey('voice')) {
       voice = GoogleCloudDialogflowV2beta1VoiceSelectionParams.fromJson(
           _json['voice']);
     }
     if (_json.containsKey('volumeGainDb')) {
-      volumeGainDb = _json['volumeGainDb'].toDouble();
+      volumeGainDb = (_json['volumeGainDb'] as core.num).toDouble();
     }
   }
 
@@ -19732,10 +19735,10 @@
 
   GoogleTypeLatLng.fromJson(core.Map _json) {
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/documentai/v1beta2.dart b/generated/googleapis_beta/lib/documentai/v1beta2.dart
index a780b05..f922c7f 100644
--- a/generated/googleapis_beta/lib/documentai/v1beta2.dart
+++ b/generated/googleapis_beta/lib/documentai/v1beta2.dart
@@ -1174,7 +1174,7 @@
 
   GoogleCloudDocumentaiV1beta1DocumentEntity.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -1693,7 +1693,7 @@
   GoogleCloudDocumentaiV1beta1DocumentPageDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -1727,13 +1727,13 @@
 
   GoogleCloudDocumentaiV1beta1DocumentPageDimension.fromJson(core.Map _json) {
     if (_json.containsKey('height')) {
-      height = _json['height'].toDouble();
+      height = (_json['height'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
   }
 
@@ -1917,7 +1917,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('orientation')) {
       orientation = _json['orientation'] as core.String;
@@ -2733,7 +2733,7 @@
 
   GoogleCloudDocumentaiV1beta1DocumentStyleFontSize.fromJson(core.Map _json) {
     if (_json.containsKey('size')) {
-      size = _json['size'].toDouble();
+      size = (_json['size'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -3021,10 +3021,10 @@
 
   GoogleCloudDocumentaiV1beta1NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -3559,7 +3559,7 @@
 
   GoogleCloudDocumentaiV1beta2DocumentEntity.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -3773,7 +3773,7 @@
       automlModel = _json['automlModel'] as core.String;
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4124,7 +4124,7 @@
   GoogleCloudDocumentaiV1beta2DocumentPageDetectedLanguage.fromJson(
       core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -4158,13 +4158,13 @@
 
   GoogleCloudDocumentaiV1beta2DocumentPageDimension.fromJson(core.Map _json) {
     if (_json.containsKey('height')) {
-      height = _json['height'].toDouble();
+      height = (_json['height'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = _json['width'].toDouble();
+      width = (_json['width'] as core.num).toDouble();
     }
   }
 
@@ -4348,7 +4348,7 @@
           _json['boundingPoly']);
     }
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('orientation')) {
       orientation = _json['orientation'] as core.String;
@@ -5164,7 +5164,7 @@
 
   GoogleCloudDocumentaiV1beta2DocumentStyleFontSize.fromJson(core.Map _json) {
     if (_json.containsKey('size')) {
-      size = _json['size'].toDouble();
+      size = (_json['size'] as core.num).toDouble();
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -5585,10 +5585,10 @@
 
   GoogleCloudDocumentaiV1beta2NormalizedVertex.fromJson(core.Map _json) {
     if (_json.containsKey('x')) {
-      x = _json['x'].toDouble();
+      x = (_json['x'] as core.num).toDouble();
     }
     if (_json.containsKey('y')) {
-      y = _json['y'].toDouble();
+      y = (_json['y'] as core.num).toDouble();
     }
   }
 
@@ -6465,16 +6465,16 @@
 
   GoogleTypeColor.fromJson(core.Map _json) {
     if (_json.containsKey('alpha')) {
-      alpha = _json['alpha'].toDouble();
+      alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blue')) {
-      blue = _json['blue'].toDouble();
+      blue = (_json['blue'] as core.num).toDouble();
     }
     if (_json.containsKey('green')) {
-      green = _json['green'].toDouble();
+      green = (_json['green'] as core.num).toDouble();
     }
     if (_json.containsKey('red')) {
-      red = _json['red'].toDouble();
+      red = (_json['red'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/language/v1beta1.dart b/generated/googleapis_beta/lib/language/v1beta1.dart
index d739c80..7d504b7 100644
--- a/generated/googleapis_beta/lib/language/v1beta1.dart
+++ b/generated/googleapis_beta/lib/language/v1beta1.dart
@@ -871,7 +871,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('salience')) {
-      salience = _json['salience'].toDouble();
+      salience = (_json['salience'] as core.num).toDouble();
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1256,13 +1256,13 @@
 
   Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('polarity')) {
-      polarity = _json['polarity'].toDouble();
+      polarity = (_json['polarity'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/language/v1beta2.dart b/generated/googleapis_beta/lib/language/v1beta2.dart
index 9c8f92f..19829c6 100644
--- a/generated/googleapis_beta/lib/language/v1beta2.dart
+++ b/generated/googleapis_beta/lib/language/v1beta2.dart
@@ -837,7 +837,7 @@
 
   ClassificationCategory.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1192,7 +1192,7 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('salience')) {
-      salience = _json['salience'].toDouble();
+      salience = (_json['salience'] as core.num).toDouble();
     }
     if (_json.containsKey('sentiment')) {
       sentiment = Sentiment.fromJson(_json['sentiment']);
@@ -1611,10 +1611,10 @@
 
   Sentiment.fromJson(core.Map _json) {
     if (_json.containsKey('magnitude')) {
-      magnitude = _json['magnitude'].toDouble();
+      magnitude = (_json['magnitude'] as core.num).toDouble();
     }
     if (_json.containsKey('score')) {
-      score = _json['score'].toDouble();
+      score = (_json['score'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart b/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
index 588443b..2e4c339 100644
--- a/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/prod_tt_sasportal/v1alpha1.dart
@@ -4270,7 +4270,7 @@
       grantId = _json['grantId'] as core.String;
     }
     if (_json.containsKey('maxEirp')) {
-      maxEirp = _json['maxEirp'].toDouble();
+      maxEirp = (_json['maxEirp'] as core.num).toDouble();
     }
     if (_json.containsKey('moveList')) {
       moveList = (_json['moveList'] as core.List)
@@ -4452,10 +4452,10 @@
 
   SasPortalFrequencyRange.fromJson(core.Map _json) {
     if (_json.containsKey('highFrequencyMhz')) {
-      highFrequencyMhz = _json['highFrequencyMhz'].toDouble();
+      highFrequencyMhz = (_json['highFrequencyMhz'] as core.num).toDouble();
     }
     if (_json.containsKey('lowFrequencyMhz')) {
-      lowFrequencyMhz = _json['lowFrequencyMhz'].toDouble();
+      lowFrequencyMhz = (_json['lowFrequencyMhz'] as core.num).toDouble();
     }
   }
 
@@ -4633,25 +4633,25 @@
       eirpCapability = _json['eirpCapability'] as core.int;
     }
     if (_json.containsKey('height')) {
-      height = _json['height'].toDouble();
+      height = (_json['height'] as core.num).toDouble();
     }
     if (_json.containsKey('heightType')) {
       heightType = _json['heightType'] as core.String;
     }
     if (_json.containsKey('horizontalAccuracy')) {
-      horizontalAccuracy = _json['horizontalAccuracy'].toDouble();
+      horizontalAccuracy = (_json['horizontalAccuracy'] as core.num).toDouble();
     }
     if (_json.containsKey('indoorDeployment')) {
       indoorDeployment = _json['indoorDeployment'] as core.bool;
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
     if (_json.containsKey('verticalAccuracy')) {
-      verticalAccuracy = _json['verticalAccuracy'].toDouble();
+      verticalAccuracy = (_json['verticalAccuracy'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/sasportal/v1alpha1.dart b/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
index 183d3c2..c047359 100644
--- a/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
+++ b/generated/googleapis_beta/lib/sasportal/v1alpha1.dart
@@ -4270,7 +4270,7 @@
       grantId = _json['grantId'] as core.String;
     }
     if (_json.containsKey('maxEirp')) {
-      maxEirp = _json['maxEirp'].toDouble();
+      maxEirp = (_json['maxEirp'] as core.num).toDouble();
     }
     if (_json.containsKey('moveList')) {
       moveList = (_json['moveList'] as core.List)
@@ -4452,10 +4452,10 @@
 
   SasPortalFrequencyRange.fromJson(core.Map _json) {
     if (_json.containsKey('highFrequencyMhz')) {
-      highFrequencyMhz = _json['highFrequencyMhz'].toDouble();
+      highFrequencyMhz = (_json['highFrequencyMhz'] as core.num).toDouble();
     }
     if (_json.containsKey('lowFrequencyMhz')) {
-      lowFrequencyMhz = _json['lowFrequencyMhz'].toDouble();
+      lowFrequencyMhz = (_json['lowFrequencyMhz'] as core.num).toDouble();
     }
   }
 
@@ -4633,25 +4633,25 @@
       eirpCapability = _json['eirpCapability'] as core.int;
     }
     if (_json.containsKey('height')) {
-      height = _json['height'].toDouble();
+      height = (_json['height'] as core.num).toDouble();
     }
     if (_json.containsKey('heightType')) {
       heightType = _json['heightType'] as core.String;
     }
     if (_json.containsKey('horizontalAccuracy')) {
-      horizontalAccuracy = _json['horizontalAccuracy'].toDouble();
+      horizontalAccuracy = (_json['horizontalAccuracy'] as core.num).toDouble();
     }
     if (_json.containsKey('indoorDeployment')) {
       indoorDeployment = _json['indoorDeployment'] as core.bool;
     }
     if (_json.containsKey('latitude')) {
-      latitude = _json['latitude'].toDouble();
+      latitude = (_json['latitude'] as core.num).toDouble();
     }
     if (_json.containsKey('longitude')) {
-      longitude = _json['longitude'].toDouble();
+      longitude = (_json['longitude'] as core.num).toDouble();
     }
     if (_json.containsKey('verticalAccuracy')) {
-      verticalAccuracy = _json['verticalAccuracy'].toDouble();
+      verticalAccuracy = (_json['verticalAccuracy'] as core.num).toDouble();
     }
   }
 
diff --git a/generated/googleapis_beta/lib/speech/v2beta1.dart b/generated/googleapis_beta/lib/speech/v2beta1.dart
index 99a9d65..a2c6d23 100644
--- a/generated/googleapis_beta/lib/speech/v2beta1.dart
+++ b/generated/googleapis_beta/lib/speech/v2beta1.dart
@@ -423,7 +423,7 @@
 
   SpeechRecognitionAlternative.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('transcript')) {
       transcript = _json['transcript'] as core.String;
@@ -596,7 +596,7 @@
 
   WordInfo.fromJson(core.Map _json) {
     if (_json.containsKey('confidence')) {
-      confidence = _json['confidence'].toDouble();
+      confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('endOffset')) {
       endOffset = _json['endOffset'] as core.String;
diff --git a/generated/googleapis_beta/lib/toolresults/v1beta3.dart b/generated/googleapis_beta/lib/toolresults/v1beta3.dart
index c98ead3..fe948e3 100644
--- a/generated/googleapis_beta/lib/toolresults/v1beta3.dart
+++ b/generated/googleapis_beta/lib/toolresults/v1beta3.dart
@@ -3018,7 +3018,7 @@
       cpuProcessor = _json['cpuProcessor'] as core.String;
     }
     if (_json.containsKey('cpuSpeedInGhz')) {
-      cpuSpeedInGhz = _json['cpuSpeedInGhz'].toDouble();
+      cpuSpeedInGhz = (_json['cpuSpeedInGhz'] as core.num).toDouble();
     }
     if (_json.containsKey('numberOfCores')) {
       numberOfCores = _json['numberOfCores'] as core.int;
@@ -5218,7 +5218,7 @@
       sampleTime = Timestamp.fromJson(_json['sampleTime']);
     }
     if (_json.containsKey('value')) {
-      value = _json['value'].toDouble();
+      value = (_json['value'] as core.num).toDouble();
     }
   }
 
@@ -6362,7 +6362,7 @@
       screenId = _json['screenId'] as core.String;
     }
     if (_json.containsKey('secondaryPriority')) {
-      secondaryPriority = _json['secondaryPriority'].toDouble();
+      secondaryPriority = (_json['secondaryPriority'] as core.num).toDouble();
     }
     if (_json.containsKey('shortMessage')) {
       shortMessage = SafeHtmlProto.fromJson(_json['shortMessage']);
diff --git a/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart b/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
index b3b8551..bbb068b 100644
--- a/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/adexchangebuyer2/v2beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/adexchangebuyer2/v2beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -4510,7 +4518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4569,7 +4578,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4627,7 +4637,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4700,7 +4711,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4772,7 +4784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4842,7 +4855,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4910,7 +4924,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4989,7 +5004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5057,7 +5073,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5137,7 +5154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5200,7 +5218,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5262,7 +5281,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5320,7 +5340,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5398,7 +5419,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5462,7 +5484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5532,7 +5555,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5605,7 +5629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5674,7 +5699,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5753,7 +5779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5815,7 +5842,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5888,7 +5916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5946,7 +5975,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6026,7 +6056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6096,7 +6127,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6166,7 +6198,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6236,7 +6269,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6296,7 +6330,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6355,7 +6390,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6414,7 +6450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6495,7 +6532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6565,7 +6603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6629,7 +6668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6691,7 +6731,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6748,7 +6789,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6809,7 +6851,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6859,7 +6902,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6906,7 +6950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6955,7 +7000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7014,7 +7060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7077,7 +7124,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7141,7 +7189,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7205,7 +7254,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7268,7 +7318,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7333,7 +7384,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7399,7 +7451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7463,7 +7516,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7522,7 +7576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7586,7 +7641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7648,7 +7704,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7698,7 +7755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7745,7 +7803,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7794,7 +7853,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7852,7 +7912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7911,7 +7972,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -7973,7 +8035,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8034,7 +8097,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8092,7 +8156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8156,7 +8221,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8218,7 +8284,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8278,7 +8345,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8336,7 +8404,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8398,7 +8467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart b/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
index 9d16068..4279457 100644
--- a/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/alertcenter/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/alertcenter/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1897,7 +1905,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1946,7 +1955,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1996,7 +2006,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2048,7 +2059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2106,7 +2118,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2159,7 +2172,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2233,7 +2247,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2295,7 +2310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2355,7 +2371,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2409,7 +2426,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2461,7 +2479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/appengine/v1beta_test.dart b/generated/googleapis_beta/test/appengine/v1beta_test.dart
index beba316..1880df8 100644
--- a/generated/googleapis_beta/test/appengine/v1beta_test.dart
+++ b/generated/googleapis_beta/test/appengine/v1beta_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/appengine/v1beta.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3040,7 +3048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3089,7 +3098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3143,7 +3153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3205,7 +3216,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3266,7 +3278,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3326,7 +3339,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3388,7 +3402,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3448,7 +3463,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3523,7 +3539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3585,7 +3602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3654,7 +3672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3716,7 +3735,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3775,7 +3795,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3832,7 +3853,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3903,7 +3925,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3967,7 +3990,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4026,7 +4050,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4085,7 +4110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4144,7 +4170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4202,7 +4229,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4276,7 +4304,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4340,7 +4369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4398,7 +4428,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4468,7 +4499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4526,7 +4558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4596,7 +4629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4655,7 +4689,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4712,7 +4747,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4784,7 +4820,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4862,7 +4899,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4931,7 +4969,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5002,7 +5041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5072,7 +5112,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5155,7 +5196,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5249,7 +5291,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5330,7 +5373,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5410,7 +5454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5488,7 +5533,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/artifactregistry/v1beta1_test.dart b/generated/googleapis_beta/test/artifactregistry/v1beta1_test.dart
index 559ce56..8344632 100644
--- a/generated/googleapis_beta/test/artifactregistry/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/artifactregistry/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/artifactregistry/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1303,7 +1311,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1353,7 +1362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1411,7 +1421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1461,7 +1472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1524,7 +1536,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1574,7 +1587,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1621,7 +1635,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1669,7 +1684,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1724,7 +1740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1783,7 +1800,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1837,7 +1855,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1888,7 +1907,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1938,7 +1958,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1989,7 +2010,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2052,7 +2074,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2103,7 +2126,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2156,7 +2180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2223,7 +2248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2277,7 +2303,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2329,7 +2356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2384,7 +2412,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2450,7 +2479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2509,7 +2539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2563,7 +2594,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2619,7 +2651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart b/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
index 39054d5..58ca7c0 100644
--- a/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/bigqueryconnection/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/bigqueryconnection/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -670,7 +678,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -720,7 +729,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -767,7 +777,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -818,7 +829,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -867,7 +879,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -926,7 +939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -980,7 +994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1031,7 +1046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1082,7 +1098,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/billingbudgets/v1beta1_test.dart b/generated/googleapis_beta/test/billingbudgets/v1beta1_test.dart
index 4195aa4..c059e3f 100644
--- a/generated/googleapis_beta/test/billingbudgets/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/billingbudgets/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/billingbudgets/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -577,7 +585,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -625,7 +634,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -672,7 +682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -722,7 +733,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -784,7 +796,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart b/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
index cc147d2..ce4918e 100644
--- a/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/clouderrorreporting/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/clouderrorreporting/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -649,7 +657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -705,7 +714,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -778,7 +788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -838,7 +849,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -919,7 +931,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -970,7 +983,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/cloudresourcemanager/v1beta1_test.dart b/generated/googleapis_beta/test/cloudresourcemanager/v1beta1_test.dart
index fb18b8c..c8a7b9b 100644
--- a/generated/googleapis_beta/test/cloudresourcemanager/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/cloudresourcemanager/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/cloudresourcemanager/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -931,7 +939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -985,7 +994,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1033,7 +1043,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1093,7 +1104,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1144,7 +1156,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1195,7 +1208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1247,7 +1261,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1299,7 +1314,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1348,7 +1364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1407,7 +1424,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1466,7 +1484,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1514,7 +1533,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1582,7 +1602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1641,7 +1662,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1700,7 +1722,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1753,7 +1776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart b/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
index e37cec3..3b07917 100644
--- a/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/containeranalysis/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/containeranalysis/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3415,7 +3423,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3467,7 +3476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3516,7 +3526,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3563,7 +3574,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3614,7 +3626,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3664,7 +3677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3725,7 +3739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3779,7 +3794,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3830,7 +3846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3882,7 +3899,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3944,7 +3962,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3995,7 +4014,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4042,7 +4062,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4089,7 +4110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4140,7 +4162,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4187,7 +4210,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4235,7 +4259,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4287,7 +4312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4348,7 +4374,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4402,7 +4429,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4453,7 +4481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4502,7 +4531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4552,7 +4582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4612,7 +4643,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart b/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
index 08dacf0..038d73b 100644
--- a/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/datacatalog/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/datacatalog/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2073,7 +2081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2123,7 +2132,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2185,7 +2195,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2237,7 +2248,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2286,7 +2298,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2340,7 +2353,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2389,7 +2403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2449,7 +2464,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2504,7 +2520,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2555,7 +2572,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2609,7 +2627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2660,7 +2679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2707,7 +2727,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2759,7 +2780,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2809,7 +2831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2872,7 +2895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2927,7 +2951,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2982,7 +3007,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3030,7 +3056,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3080,7 +3107,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3141,7 +3169,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3197,7 +3226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3244,7 +3274,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3293,7 +3324,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3353,7 +3385,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3410,7 +3443,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3462,7 +3496,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3510,7 +3545,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3562,7 +3598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3614,7 +3651,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3669,7 +3707,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3720,7 +3759,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3775,7 +3815,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3827,7 +3868,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3881,7 +3923,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3938,7 +3981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4002,7 +4046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4056,7 +4101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4104,7 +4150,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4153,7 +4200,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4208,7 +4256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4260,7 +4309,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4314,7 +4364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4364,7 +4415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4424,7 +4476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4479,7 +4532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4530,7 +4584,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4585,7 +4640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4634,7 +4690,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4682,7 +4739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4735,7 +4793,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4785,7 +4844,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4846,7 +4906,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4902,7 +4963,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4954,7 +5016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/dataflow/v1b3_test.dart b/generated/googleapis_beta/test/dataflow/v1b3_test.dart
index 431c13d..45ce353 100644
--- a/generated/googleapis_beta/test/dataflow/v1b3_test.dart
+++ b/generated/googleapis_beta/test/dataflow/v1b3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/dataflow/v1b3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -7952,7 +7960,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8018,7 +8027,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8071,7 +8081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8118,7 +8129,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8165,7 +8177,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8216,7 +8229,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8268,7 +8282,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8323,7 +8338,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8385,7 +8401,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8461,7 +8478,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8531,7 +8549,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8602,7 +8621,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8669,7 +8689,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8752,7 +8773,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8816,7 +8838,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8890,7 +8913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -8960,7 +8984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9034,7 +9059,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9124,7 +9150,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9193,7 +9220,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9265,7 +9293,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9337,7 +9366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9411,7 +9441,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9487,7 +9518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9566,7 +9598,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9649,7 +9682,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9721,7 +9755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9811,7 +9846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9885,7 +9921,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -9967,7 +10004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10047,7 +10085,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10130,7 +10169,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10223,7 +10263,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10314,7 +10355,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10409,7 +10451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10489,7 +10532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10561,7 +10605,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10631,7 +10676,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10698,7 +10744,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10768,7 +10815,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10841,7 +10889,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10909,7 +10958,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10986,7 +11036,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11062,7 +11113,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11122,7 +11174,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11177,7 +11230,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11245,7 +11299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11303,7 +11358,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11376,7 +11432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/datafusion/v1beta1_test.dart b/generated/googleapis_beta/test/datafusion/v1beta1_test.dart
index b539d09..ec519be 100644
--- a/generated/googleapis_beta/test/datafusion/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/datafusion/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/datafusion/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1204,7 +1212,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1255,7 +1264,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1321,7 +1331,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1371,7 +1382,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1418,7 +1430,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1466,7 +1479,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1523,7 +1537,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1587,7 +1602,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1641,7 +1657,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1692,7 +1709,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1743,7 +1761,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1794,7 +1813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1847,7 +1867,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1894,7 +1915,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1941,7 +1963,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1991,7 +2014,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2052,7 +2076,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/dialogflow/v2beta1_test.dart b/generated/googleapis_beta/test/dialogflow/v2beta1_test.dart
index 360a50a..b6869f1 100644
--- a/generated/googleapis_beta/test/dialogflow/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/dialogflow/v2beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/dialogflow/v2beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -9968,7 +9976,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10015,7 +10024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10068,7 +10078,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10126,7 +10137,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10173,7 +10185,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10222,7 +10235,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10278,7 +10292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10330,7 +10345,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10379,7 +10395,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10439,7 +10456,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10491,7 +10509,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10550,7 +10569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10603,7 +10623,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10655,7 +10676,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10706,7 +10728,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10754,7 +10777,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10807,7 +10831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10871,7 +10896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10935,7 +10961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -10989,7 +11016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11043,7 +11071,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11094,7 +11123,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11153,7 +11183,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11206,7 +11237,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11267,7 +11299,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11321,7 +11354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11374,7 +11408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11430,7 +11465,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11496,7 +11532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11562,7 +11599,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11616,7 +11654,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11669,7 +11708,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11725,7 +11765,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11793,7 +11834,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11853,7 +11895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11907,7 +11950,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -11960,7 +12004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12015,7 +12060,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12064,7 +12110,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12123,7 +12170,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12191,7 +12239,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12255,7 +12304,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12304,7 +12354,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12352,7 +12403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12403,7 +12455,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12465,7 +12518,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12523,7 +12577,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12570,7 +12625,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12617,7 +12673,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12668,7 +12725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12730,7 +12788,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12787,7 +12846,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12836,7 +12896,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12888,7 +12949,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12942,7 +13004,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -12990,7 +13053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13037,7 +13101,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13087,7 +13152,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13147,7 +13213,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13205,7 +13272,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13253,7 +13321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13300,7 +13369,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13350,7 +13420,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13412,7 +13483,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13469,7 +13541,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13518,7 +13591,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13566,7 +13640,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13617,7 +13692,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13679,7 +13755,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13736,7 +13813,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13783,7 +13861,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13830,7 +13909,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13881,7 +13961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -13943,7 +14024,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14000,7 +14082,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14049,7 +14132,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14096,7 +14180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14149,7 +14234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14207,7 +14293,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14254,7 +14341,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14303,7 +14391,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14359,7 +14448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14411,7 +14501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14460,7 +14551,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14520,7 +14612,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14572,7 +14665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14631,7 +14725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14684,7 +14779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14736,7 +14832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14787,7 +14884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14835,7 +14933,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14888,7 +14987,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -14952,7 +15052,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15018,7 +15119,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15073,7 +15175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15128,7 +15231,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15179,7 +15283,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15244,7 +15349,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15302,7 +15408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15365,7 +15472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15420,7 +15528,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15474,7 +15583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15531,7 +15641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15598,7 +15709,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15665,7 +15777,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15720,7 +15833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15774,7 +15888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15831,7 +15946,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15900,7 +16016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -15960,7 +16077,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16014,7 +16132,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16067,7 +16186,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16122,7 +16242,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16171,7 +16292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16230,7 +16352,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16298,7 +16421,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16358,7 +16482,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16410,7 +16535,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16466,7 +16592,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16515,7 +16642,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16563,7 +16691,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16614,7 +16743,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16675,7 +16805,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16735,7 +16866,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16784,7 +16916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16832,7 +16965,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16883,7 +17017,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16946,7 +17081,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -16999,7 +17135,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17046,7 +17183,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17096,7 +17234,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17155,7 +17294,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17202,7 +17342,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -17252,7 +17393,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/documentai/v1beta2_test.dart b/generated/googleapis_beta/test/documentai/v1beta2_test.dart
index 4fa8346..edba907 100644
--- a/generated/googleapis_beta/test/documentai/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/documentai/v1beta2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/documentai/v1beta2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -5792,7 +5800,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5846,7 +5855,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5902,7 +5912,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5956,7 +5967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6006,7 +6018,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6055,7 +6068,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart b/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
index b8bfd5d..c3a76b9 100644
--- a/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/factchecktools/v1alpha1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/factchecktools/v1alpha1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -602,7 +610,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -679,7 +688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -728,7 +738,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -775,7 +786,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -827,7 +839,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -898,7 +911,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/firebase/v1beta1_test.dart b/generated/googleapis_beta/test/firebase/v1beta1_test.dart
index a035bd8..4a8e359 100644
--- a/generated/googleapis_beta/test/firebase/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/firebase/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/firebase/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1353,7 +1361,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1409,7 +1418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1462,7 +1472,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1513,7 +1524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1560,7 +1572,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1607,7 +1620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1654,7 +1668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1701,7 +1716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1760,7 +1776,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1814,7 +1831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1864,7 +1882,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1926,7 +1945,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1973,7 +1993,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2020,7 +2041,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2069,7 +2091,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2128,7 +2151,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2184,7 +2208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2231,7 +2256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2278,7 +2304,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2329,7 +2356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2389,7 +2417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2442,7 +2471,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2489,7 +2519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2536,7 +2567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2585,7 +2617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2644,7 +2677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2700,7 +2734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2747,7 +2782,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2794,7 +2830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2843,7 +2880,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2902,7 +2940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/firebasehosting/v1beta1_test.dart b/generated/googleapis_beta/test/firebasehosting/v1beta1_test.dart
index 5a7d603..d04f6b3 100644
--- a/generated/googleapis_beta/test/firebasehosting/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/firebasehosting/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/firebasehosting/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1370,7 +1378,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1419,7 +1428,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1471,7 +1481,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1528,7 +1539,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1578,7 +1590,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1625,7 +1638,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1674,7 +1688,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1733,7 +1748,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1790,7 +1806,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1842,7 +1859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1902,7 +1920,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1949,7 +1968,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1996,7 +2016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2045,7 +2066,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2103,7 +2125,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2157,7 +2180,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2209,7 +2233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2269,7 +2294,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2322,7 +2348,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2376,7 +2403,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2426,7 +2454,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2487,7 +2516,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2541,7 +2571,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2593,7 +2624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2651,7 +2683,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2703,7 +2736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2760,7 +2794,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2810,7 +2845,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2857,7 +2893,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2906,7 +2943,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2965,7 +3003,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3022,7 +3061,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3074,7 +3114,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3134,7 +3175,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3181,7 +3223,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3228,7 +3271,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3277,7 +3321,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3335,7 +3380,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3389,7 +3435,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3441,7 +3488,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3501,7 +3549,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3554,7 +3603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3608,7 +3658,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3658,7 +3709,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3719,7 +3771,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3773,7 +3826,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3825,7 +3879,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/firebaseml/v1beta2_test.dart b/generated/googleapis_beta/test/firebaseml/v1beta2_test.dart
index 8b24720..795567a 100644
--- a/generated/googleapis_beta/test/firebaseml/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/firebaseml/v1beta2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/firebaseml/v1beta2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -484,7 +492,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -531,7 +540,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -578,7 +588,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -628,7 +639,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -689,7 +701,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -741,7 +754,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/gameservices/v1beta_test.dart b/generated/googleapis_beta/test/gameservices/v1beta_test.dart
index 41bf1ed..9e4d687 100644
--- a/generated/googleapis_beta/test/gameservices/v1beta_test.dart
+++ b/generated/googleapis_beta/test/gameservices/v1beta_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/gameservices/v1beta.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2679,7 +2687,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2730,7 +2739,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2798,7 +2808,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2849,7 +2860,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2901,7 +2913,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2949,7 +2962,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2998,7 +3012,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3052,7 +3067,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3104,7 +3120,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3170,7 +3187,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3227,7 +3245,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3287,7 +3306,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3339,7 +3359,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3392,7 +3413,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3454,7 +3476,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3508,7 +3531,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3559,7 +3583,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3614,7 +3639,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3679,7 +3705,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3726,7 +3753,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3773,7 +3801,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3823,7 +3852,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3886,7 +3916,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3936,7 +3967,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3983,7 +4015,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4034,7 +4067,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4098,7 +4132,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4154,7 +4189,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4220,7 +4256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4275,7 +4312,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4326,7 +4364,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4381,7 +4420,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4449,7 +4489,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4509,7 +4550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4569,7 +4611,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4630,7 +4673,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/language/v1beta1_test.dart b/generated/googleapis_beta/test/language/v1beta1_test.dart
index 7769647..9b364ca 100644
--- a/generated/googleapis_beta/test/language/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/language/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/language/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -853,7 +861,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -902,7 +911,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -951,7 +961,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1000,7 +1011,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/language/v1beta2_test.dart b/generated/googleapis_beta/test/language/v1beta2_test.dart
index da9105e..aae89cf 100644
--- a/generated/googleapis_beta/test/language/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/language/v1beta2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/language/v1beta2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1045,7 +1053,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1094,7 +1103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1143,7 +1153,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1192,7 +1203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1241,7 +1253,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1290,7 +1303,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/lifesciences/v2beta_test.dart b/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
index 5933210..6f633db 100644
--- a/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
+++ b/generated/googleapis_beta/test/lifesciences/v2beta_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/lifesciences/v2beta.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1495,7 +1503,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1545,7 +1554,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1607,7 +1617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1654,7 +1665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1704,7 +1716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1766,7 +1779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/memcache/v1beta2_test.dart b/generated/googleapis_beta/test/memcache/v1beta2_test.dart
index e6bcaf5..c7dc91a 100644
--- a/generated/googleapis_beta/test/memcache/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/memcache/v1beta2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/memcache/v1beta2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1449,7 +1457,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1499,7 +1508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1561,7 +1571,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1613,7 +1624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1663,7 +1675,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1710,7 +1723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1761,7 +1775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1825,7 +1840,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1879,7 +1895,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1932,7 +1949,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1979,7 +1997,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2026,7 +2045,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2076,7 +2096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/oslogin/v1alpha_test.dart b/generated/googleapis_beta/test/oslogin/v1alpha_test.dart
index 490501e..e5b7501 100644
--- a/generated/googleapis_beta/test/oslogin/v1alpha_test.dart
+++ b/generated/googleapis_beta/test/oslogin/v1alpha_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/oslogin/v1alpha.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -281,7 +289,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -343,7 +352,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -396,7 +406,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -449,7 +460,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -496,7 +508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -548,7 +561,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/oslogin/v1beta_test.dart b/generated/googleapis_beta/test/oslogin/v1beta_test.dart
index 4cc81a0..77c1218 100644
--- a/generated/googleapis_beta/test/oslogin/v1beta_test.dart
+++ b/generated/googleapis_beta/test/oslogin/v1beta_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/oslogin/v1beta.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -280,7 +288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -339,7 +348,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -391,7 +401,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -440,7 +451,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -487,7 +499,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -539,7 +552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart b/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
index df70a6b..ecbc810 100644
--- a/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/prod_tt_sasportal/v1alpha1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/prod_tt_sasportal/v1alpha1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1442,7 +1450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1489,7 +1498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1548,7 +1558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1604,7 +1615,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1657,7 +1669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1708,7 +1721,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1758,7 +1772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1820,7 +1835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1872,7 +1888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1923,7 +1940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1970,7 +1988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2017,7 +2036,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2067,7 +2087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2127,7 +2148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2179,7 +2201,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2233,7 +2256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2284,7 +2308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2337,7 +2362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2384,7 +2410,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2431,7 +2458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2480,7 +2508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2538,7 +2567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2590,7 +2620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2646,7 +2677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2695,7 +2727,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2751,7 +2784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2798,7 +2832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2849,7 +2884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2901,7 +2937,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2955,7 +2992,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3006,7 +3044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3057,7 +3096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3106,7 +3146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3156,7 +3197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3209,7 +3251,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3262,7 +3305,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3313,7 +3357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3363,7 +3408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3425,7 +3471,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3477,7 +3524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3528,7 +3576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3575,7 +3624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3622,7 +3672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3672,7 +3723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3732,7 +3784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3784,7 +3837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3838,7 +3892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3889,7 +3944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3942,7 +3998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3989,7 +4046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4036,7 +4094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4085,7 +4144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4143,7 +4203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4195,7 +4256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4251,7 +4313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4303,7 +4366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4354,7 +4418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4404,7 +4469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4466,7 +4532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4515,7 +4582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4573,7 +4641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4691,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4671,7 +4741,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/pubsub/v1beta2_test.dart b/generated/googleapis_beta/test/pubsub/v1beta2_test.dart
index 9721a3b..5ea7edc 100644
--- a/generated/googleapis_beta/test/pubsub/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/pubsub/v1beta2_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/pubsub/v1beta2.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -940,7 +948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -991,7 +1000,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1038,7 +1048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1085,7 +1096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1133,7 +1145,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1188,7 +1201,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1246,7 +1260,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1298,7 +1313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1349,7 +1365,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1400,7 +1417,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1451,7 +1469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1504,7 +1523,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1551,7 +1571,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1598,7 +1619,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1646,7 +1668,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1701,7 +1724,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1759,7 +1783,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1810,7 +1835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1861,7 +1887,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1912,7 +1939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/runtimeconfig/v1beta1_test.dart b/generated/googleapis_beta/test/runtimeconfig/v1beta1_test.dart
index 89c6e9d..e785e6e 100644
--- a/generated/googleapis_beta/test/runtimeconfig/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/runtimeconfig/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/runtimeconfig/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -825,7 +833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -875,7 +884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -922,7 +932,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -970,7 +981,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1025,7 +1037,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1083,7 +1096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1134,7 +1148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1185,7 +1200,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1234,7 +1250,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1285,7 +1302,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1339,7 +1357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1390,7 +1409,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1439,7 +1459,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1490,7 +1511,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1553,7 +1575,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1604,7 +1627,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1655,7 +1679,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1709,7 +1734,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1759,7 +1785,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1806,7 +1833,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1855,7 +1883,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1913,7 +1942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart b/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
index c9159b7..007a33b 100644
--- a/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/sasportal/v1alpha1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/sasportal/v1alpha1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -1442,7 +1450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1489,7 +1498,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1548,7 +1558,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1604,7 +1615,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1657,7 +1669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1708,7 +1721,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1758,7 +1772,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1820,7 +1835,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1872,7 +1888,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1923,7 +1940,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1970,7 +1988,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2017,7 +2036,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2067,7 +2087,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2127,7 +2148,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2179,7 +2201,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2233,7 +2256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2284,7 +2308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2337,7 +2362,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2384,7 +2410,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2431,7 +2458,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2480,7 +2508,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2538,7 +2567,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2590,7 +2620,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2646,7 +2677,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2695,7 +2727,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2751,7 +2784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2798,7 +2832,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2849,7 +2884,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2901,7 +2937,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2955,7 +2992,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3006,7 +3044,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3057,7 +3096,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3106,7 +3146,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3156,7 +3197,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3209,7 +3251,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3262,7 +3305,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3313,7 +3357,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3363,7 +3408,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3425,7 +3471,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3477,7 +3524,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3528,7 +3576,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3575,7 +3624,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3622,7 +3672,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3672,7 +3723,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3732,7 +3784,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3784,7 +3837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3838,7 +3892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3889,7 +3944,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3942,7 +3998,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3989,7 +4046,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4036,7 +4094,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4085,7 +4144,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4143,7 +4203,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4195,7 +4256,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4251,7 +4313,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4303,7 +4366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4354,7 +4418,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4404,7 +4469,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4466,7 +4532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4515,7 +4582,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4573,7 +4641,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4622,7 +4691,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4671,7 +4741,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/servicedirectory/v1beta1_test.dart b/generated/googleapis_beta/test/servicedirectory/v1beta1_test.dart
index 49baa5a..ef5ee37 100644
--- a/generated/googleapis_beta/test/servicedirectory/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/servicedirectory/v1beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/servicedirectory/v1beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -842,7 +850,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -892,7 +901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -955,7 +965,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1005,7 +1016,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1052,7 +1064,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1103,7 +1116,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1154,7 +1168,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1218,7 +1233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1272,7 +1288,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1323,7 +1340,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1378,7 +1396,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1429,7 +1448,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1477,7 +1497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1529,7 +1550,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1581,7 +1603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1646,7 +1669,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1701,7 +1725,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1753,7 +1778,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1805,7 +1831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1865,7 +1892,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1920,7 +1948,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1972,7 +2001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2028,7 +2058,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -2097,7 +2128,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/speech/v2beta1_test.dart b/generated/googleapis_beta/test/speech/v2beta1_test.dart
index 93c22d8..b5d0f12 100644
--- a/generated/googleapis_beta/test/speech/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/speech/v2beta1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/speech/v2beta1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -493,7 +501,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -543,7 +552,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
index e448cc4..1a32470 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta4_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/sqladmin/v1beta4.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -2931,7 +2939,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3000,7 +3009,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3069,7 +3079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3136,7 +3147,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3214,7 +3226,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3283,7 +3296,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3352,7 +3366,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3417,7 +3432,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3490,7 +3506,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3564,7 +3581,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3613,7 +3631,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3682,7 +3701,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3751,7 +3771,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3810,7 +3831,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3879,7 +3901,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -3949,7 +3972,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4018,7 +4042,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4078,7 +4103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4147,7 +4173,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4206,7 +4233,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4264,7 +4292,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4338,7 +4367,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4401,7 +4431,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4466,7 +4497,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4531,7 +4563,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4596,7 +4629,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4665,7 +4699,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4735,7 +4770,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4801,7 +4837,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4866,7 +4903,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4935,7 +4973,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4999,7 +5038,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5060,7 +5100,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5118,7 +5159,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5200,7 +5242,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5267,7 +5310,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5337,7 +5381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5416,7 +5461,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5486,7 +5532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5556,7 +5603,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5626,7 +5674,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5691,7 +5740,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5748,7 +5798,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5817,7 +5868,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5889,7 +5941,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5954,7 +6007,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6025,7 +6079,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/toolresults/v1beta3_test.dart b/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
index 3a537c3..91a166f 100644
--- a/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/toolresults/v1beta3_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/toolresults/v1beta3.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -3976,7 +3984,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4031,7 +4040,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4093,7 +4103,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4155,7 +4166,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4213,7 +4225,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4295,7 +4308,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4367,7 +4381,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4435,7 +4450,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4516,7 +4532,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4600,7 +4617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4676,7 +4694,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4760,7 +4779,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4839,7 +4859,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4896,7 +4917,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -4979,7 +5001,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5061,7 +5084,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5147,7 +5171,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5226,7 +5251,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5317,7 +5343,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5410,7 +5437,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5510,7 +5538,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5610,7 +5639,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5706,7 +5736,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5799,7 +5830,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -5910,7 +5942,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6015,7 +6048,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6120,7 +6154,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6214,7 +6249,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -6316,7 +6352,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
diff --git a/generated/googleapis_beta/test/tpu/v1alpha1_test.dart b/generated/googleapis_beta/test/tpu/v1alpha1_test.dart
index bc36b26..cdf7cc5 100644
--- a/generated/googleapis_beta/test/tpu/v1alpha1_test.dart
+++ b/generated/googleapis_beta/test/tpu/v1alpha1_test.dart
@@ -30,10 +30,18 @@
 import 'package:googleapis_beta/tpu/v1alpha1.dart' as api;
 
 class HttpServerMock extends http.BaseClient {
-  core.Function _callback;
+  core.Future<http.StreamedResponse> Function(http.BaseRequest, core.Object)
+      _callback;
   core.bool _expectJson;
 
-  void register(core.Function callback, core.bool expectJson) {
+  void register(
+    core.Future<http.StreamedResponse> Function(
+      http.BaseRequest bob,
+      core.Object foo,
+    )
+        callback,
+    core.bool expectJson,
+  ) {
     _callback = callback;
     _expectJson = expectJson;
   }
@@ -971,7 +979,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1021,7 +1030,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1079,7 +1089,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1130,7 +1141,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1196,7 +1208,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1245,7 +1258,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1292,7 +1306,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1341,7 +1356,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1399,7 +1415,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1450,7 +1467,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1501,7 +1519,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1550,7 +1569,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1597,7 +1617,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1644,7 +1665,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1694,7 +1716,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1752,7 +1775,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
@@ -1803,7 +1827,8 @@
         var query = (req.url).query;
         var queryOffset = 0;
         var queryMap = <core.String, core.List<core.String>>{};
-        void addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        void addQueryParam(core.String n, core.String v) =>
+            queryMap.putIfAbsent(n, () => []).add(v);
 
         if (query.isNotEmpty) {
           for (var part in query.split('&')) {
